Define on SQL about kinds of Relations

Database Modifications

지금까지 결과를 출력하는 query 에 대해 알아보았는데, 
이번에는 DB의 State(상태)를 바꾸는 여러가지 작업(Modification)들에 대해 알아보자. 

  1. Insert tuples into a Relation.
  2. Delete certain tuples from a Relation.
  3. Update values of certain components of certain existing tuples.

이 세 가지를 'MODIFICATIONS' 라 부른다. 

INSERTION

삽입 연산으로, Relation에 tuple을 삽입한다. 

INSERT INTO R(C1, C2, ..., Cn) VALUES (V1, V2, ..., Vn);

R : Relation
C : Column
V : Value
  • Relation의 모든 columns를 포함하지 않으면, Default NULL 값이 입력된다. 
    (Default 값에 대해선 밑에서 다시 다루겠다.) 
  • 모든 column에 대해 하는 연산의 경우, List는 생략이 가능하다. 
    하.지.만 이 경우 column순서나 목록을 정확히 알아야 하기 때문에 주의가 필요하다. 
    정확히 알지 못하는 경우에는 일일이 명시하도록 하자. 

예 : 

Movie ( title, year, length, inColor, studioName )

INSERT INTO Movie ( title, year ) VALUES ( 'THOR : Ragnarok', '2017' );

  -> Relation "Movie"에 title이 토르:라그나로크, year이 2017인 tuple을 삽입
     나머지 column ( length, inColor 등등 )의 값들은 Default인 NULL로 처리된다.
  • 또한 삽입할 tuple을 하위쿼리(subquery)로 작성할 수도 있다. 

예 : 

Movie ( title, year, length, inColor, studioName )
Studio ( name, address )

INSERT INTO Studio ( name )
     SELECT DISTINCT  studioName
     FROM  Movie
     WHERE  studioName NOT IN ( SELECT  name  FROM  Studio );

"Movie"에는 있고, "Studio"에는 없는,
다시말해 "Studio"에서 빼먹은 studio_name이 있으면 그것을 삽입

DELETION

삭제 연산으로, Relation으로부터 tuple을 삭제한다. 

DELETE FROM R WHERE < condition >;

R : Relation
  • INSERT 와는 다르게, 튜플을 지정할 순 없지만 WHERE절에서 조건을 줄 수 있다. 

예 : 

Students ( s_id, name, dept_name, grade )

DELETE FROM  Students 
WHERE  name = 'Bohyun' AND  dept_name = 'Comp. Sci.';

Relation "Students"에서
이름이 보현이고 학과가 컴퓨터공학인 tuple을 삭제

UPDATE

갱신 연산으로, Relation에 존재하는 tuple의 component를 수정한다. 
흔히 '갱신'이라 함은 삽입/삭제와 같은 것을 생각할 수 있지만, 
SQL에서의 Update는 따로 정의된 Modification이다. 

UPDATE R SET < New-value assignments > WHERE < C >;

R : Relation
New-value assignment : R의 column을 원하는 New-value로 바꿈
C : Condition 

예 : 

People ( name, age, gender )

UPDATE  People SET  gender = 'M'
WHERE name  LIKE  '%철수';

Relation "People"에서 이름에 철수가 포함되면 성별을 남성으로 갱신
  • 갱신이 복잡할 경우, CASE 조건문(WHEN, THEN, ELSE, END)을 사용하여 
    갱신할 수 있다.

예 : 

table ( name, id, C1, C2 )

UPDATE  table  SET  C1 = CASE id
				WHEN 1 THEN 2
				WHEN 3 THEN 4
				ELSE C1
				END,
		        C2 = CASE id
				WHEN 4 THEN 10
				WHEN 9 THEN 20
				ELSE C2
				END
	  	  WHERE  id IN ( ~  ( 생략 ) );

Relation "table"에서 C1의 값을 id에 따라 갱신, C2의 값을 id에 따라 갱신     < Figure 1 참조 >

https://www.lucidchart.com/publicSegments/view/34e6af56-633d-449d-8511-bc83031a2523/image.png

  • 또한 UPDATE DELETE & INSERT로 다루기도 한다.


Defining a Relation Schema in SQL

SQL에서 다루는 Relation schema가 어떻게 정의되는지 살펴보자. 

  1. Data Type : column을 이루는 Data types
  2. CREATE / DROP / ALTER : Table 생성, 삭제, 변경
  3. Defalut Value
  4. INDEX
  5. View : Virtual relation

Data Types

모든 columns는 Data type을 가지고 있어야 한다.

  1. Character strings ( fixed or varying length )
    • CHAR(n) : 길이 n을 갖는 문자열 ( 예 : CHAR(5)의 she -> 'she ' )
    • VARCHAR(n) : 최대길이 n을 갖는 문자열


  1. Bit strings ( fixed or varying length )
    • BIT(n) : 길이 n을 갖는 비트
    • BIT VARYING(n) : 최대길이 n을 갖는 비트


  1. Boolean type
    • BOOLEAN : TRUE, FALSE, UNKNOWN으로 나오는 타입


  1. Integer type
    • INT / INTEGER : 정수 값
    • SHORTINT : 작은 정수 값


  1. Floating-point numbers
    • FLOAT / REAL : 소수, 4byte
    • DOUBLE PRECISION : 소수, 8byte, 문자열로 저장
    • DECIMAL / NUMERIC(n, d) : n개의 10진수, d개의 소수


  1. Dates and Times
    • DATA
    • TIME
    • TIMESTAMP


CREATE / DROP / ALTER

CREATE

  • CREATE를 통해 simple하게 Relation schema를 선언할 수 있다. 
  • 괄호 뒤에 column list와 그들의 type도 선언한다. 

예 : 

CREATE  TABLE  Member  (
     name  VARCHAR ( 10 ),
     address  VARCHAR ( 50 ),
     gender  CHAR ( 1 ),
     birthday  DATE
);

Relation "Member"를 생성, column은 이름 / 주소 / 성별 / 생년월일

DROP / ALTER

  • DROP : R은 더이상 Database의 schema가 아니게 되는, 완전한 삭제 연산 (Table을 통으로 삭제) 

예 : 

T1 ( C1, C2, C3 )                                      T2 ( C4, C5, C6 )
T2 ( C4, C5, C6 )                  ->

DROP  TABLE  T1;

Relation "T1"을 삭제
  • ALTER : ( ADD / DROP ) column name (ADD의 경우 Data type도 선언) 

예 : 

Member ( name, address, gender, birthday )

< ADD >
ALTER  TABLE  Member  ADD  phoneNumber CHAR ( 13 );

Relation "Member"에 휴대폰번호 column을 추가


< DROP >
ALTER  TABLE  Member  DROP  birthday;

Relation "Member"에 생년월일 column을 제거

Default Values

  • Tuple을 생성하거나 modify할 때, 모든 component를 명시하지 않을 때 도 있다. 
    이 문제를 해결하기 위해 SQL은 NULL 값을 제공한다. 즉, 기본적으로 Default값은 ' NULL ' 값이다. 
  • Data type 뒤에 DEFAULT를 사용하여 원하는 값을 Defalut값으로 지정할 수도 있다. 

예 : 

CREATE  TABLE  Member  (
     name  VARCHAR ( 10 ),
     address  VARCHAR ( 50 ),
     gender  CHAR ( 1 )  DEFAULT  '?',
     birthday  DATE  DEFAULT  '0000 - 00 - 00'
);

Relation "Member" 생성 시 Data type 뒤에 Default 값을 줌

INDEX

Why we use it?

  • 많은 Tuples을 전부 스캔하여 condition에 맞는, 몇 안되는 Tuples을 찾는 건 굉장히 expensive하다. 
    즉, Large Relations의 Find 효율성을 위해 INDEX를 부여함으로써 효율적으로 관리할 수 있다. 

Definition of INDEX

  • 특정 Relation과 Logical한 연관을 두어, 해당 column을 기준으로 INDEX라는 object를 생성한다. 
  • 이러한 Index는 B-tree 등 다양한 기법들이 존재하지만, 우선은 기본적인 것들을 살펴보도록 하자.

인덱스 생성하기

CREATE INDEX Index_name ON R ( C );

R : Relation
C : column
  • 이 때, 1개 이상의 column으로 Index 구성 시, column 순서대로 우선순위가 결정되어 Order한다. 

Selection of INDEXes

  • Index의 Selection은 DB designer에게 Trade-off를 요구하며 실제로 
    이 선택은 DB 설계가 acceptable한 지 영향을 미치는 중요한 요인 중 하나이다. 
  • 두 가지 고려사항은,
    1. Index의 존재는 Query속도를 크게 향상시키며 경우에따라 관련된 Join 또한 향상시킬 수 있다. 
    2. However, 모든 Index는 Modifications (Insertion, Deletion, Update)를 더 복잡하고 느리게 만든다. 
  • 그래서, Index selection은 DB 설계에서 가장 어려운 것 중 하나이다. 
    (modify가 자주 일어나면 그에따라 Index도 계속 바뀌어야 하기 때문) 
  • WHERE절에서 상수와 비교가 자주 일어나는 column이나, 
    Join condition으로 자주 언급되는 column으로 Index를 선택하는 게 유용하다. 
  • Modification 빈도수에 따라 Index 생성도 고려하는게 맞지만, 
    그럼에도 불구하고 Index 생성은 무척 효율적이다. (사실 Modification 자체도 굉장히 조심스럽게 해야함) 
  • Index 사용이 full-scan 보다 훠어어얼씬 더 빠르다. 


View

Why & Definition

  • Table을 만들면 그 Table은 modification하지 않는 한 
    변화가 없는상태로 물리적 공간 지속적으로 저장되어 있다. 
  • View라는 Relation은 물리적으로 존재치않고 query같은 expression으로 정의된다. 
    물리적으로 존재하지 않아도 마치 물리적으로 존재하는 것처럼 query받을 수 있으며 
    일부는 modify도 할 수 있다. 

VIEW 생성하기

CREATE VIEW < view-name >  AS  < view-definition >;

Q : Query. It is Definition of View.

Querying Views

  • View가 참조하는 Relation 내용이 바뀌면, View도 자동으로 갱신된다. 


Relations, Tables, and Views 

Relation을 구별하기 위해 물리적 : table, 가상 : view로 구분하여 사용한다. 
또한 stored되는 Relation임을 강조하고 싶을 땐 'Base Relation'또는 'Base Table' 이라 나타낸다. 
View는 영구히 저장되는 것도 아니고, 단지 subquery에 사용되는 일시적인 결과물일 뿐이다. 
그래도, Relation 취급을 한다. 


  • Renaming View
    • Query에서 View의 column명을 본래의 Table과 구별하기 위해 Renaming 또한 가능하다. 

예 : 

T1 ( C1, C2 )

CREATE VIEW V1 ( A1, A2 ) AS 
     SELECT  C1, C2
     FROM  T1;

V1 ( A1, A2 )

Relation "T1"을 참조한 View "V1"은, column 이름이 T1의 column과 다르지만, 그 안의 값은 같음


Modifying Views

일단, view에 modify한다는 건 의미가 이상하다. 
왜? 이녀석은 단지 참조하는 가상의 Relation일 뿐인데? 
Insert의 경우 그 데이터는 어디에 저장되는가? 

Answer is -> '할 수 없다' 이다. 

하지만, SQL에서의 Updatable View라는(일반 view는 불가) View는 modify 가능하다. 
View에 modify를 행하면, 그 결과 역시 Base Table에도 적용 된다. 

View modify에 있어 중요한 두 가지는, 

  1. WHERE clause는 subquery에서 R을 포함하면 안된다. 
  2. SELECT clause의 column list는 view에 삽입된 모든 tuple을 가질만한 충분한 column이 포함되어야 한다. 
    그래야지만 다른 column에 NULL로 채운다던가, 삽입된 view의 tuple을 base relation으로 가져온다던가 할 수 있다. 
Students ( ID, NAME, AGE, DEPT, GRADE )

CREATE  VIEW  V1  AS
   SELECT  NAME, AGE, DEPT
   FROM  Students
   WHERE  GRADE ≥ 3;

https://www.lucidchart.com/publicSegments/view/2cbfdf05-8b68-42ea-86a9-5e4df8b862b0/image.png

  • Insert

예 : 

INSERT  INTO  V1
VALUES  ( '민남기', 30, 'Business Ad' );

https://www.lucidchart.com/publicSegments/view/a49e68df-e6d9-47d4-be94-e9961b5da63b/image.png

  • Update

예 : 

UPDATE  V1
SET  DEPT = 'Legacy'
WHERE  AGE ≥ 25;

https://www.lucidchart.com/publicSegments/view/633a647b-b7a1-40de-8d22-a93e8c71c60e/image.png

  • Delete

예 : 

DELETE  FROM  V1
WHERE  DEPT = 'Legacy';

https://www.lucidchart.com/publicSegments/view/c2efe44c-8880-43ed-96ff-7a248db31217/image.png

  • DROP ( table과 같지만 굳이 언급한 이유는, View가 Updatable이든 아니든 상관없이 가능하기 때문 )

예 : 

DROP  VIEW  V1;





DROP Is Powerful Modification 

앞서 설명했듯 DROP은 Table에도 가능한데, 이 Table에서 참조된 View가 있다면 
그 View마저도 사용불가로 만든다. (물리적 저장을 하지 않았기 때문)






Why Some Views Are Not Updatable? 

두 개의 relation에서 생성한 view같은 경우, 
Insert하면 빈값들은 NULL이 될텐데, Join연산에서 
NULL끼리의 연산은 불가하기 때문에 insertion 자체가 불가능하다.







마침.


블로그 이미지

차트

소소한 일상 C코드 DB 항상 행복하게^-^★

,

SQL(Structured Query Language

SQL

What is it?

  • Relational DBMS의 query/modify에 가장 많이 사용되는 언어로,
    RDBMS(관계형 DBMS)의 Data를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다.
  • RA(Relational Algebra)와 비슷한 역할을 하기도 하고,
    Database modify에 참여하기도 한다. (modify : 삽입, 삭제, 선언 등)
    즉, DML DDL 두 개의 역할을 모두 수행한다.


  • 또한 무척 대표적인(Standard) 언어라, 갖가지 변형된 언어들도 존재하는데,
    우선 주 표준인 ANSI(American National Standards Institue) SQL을 기반으로 학습한다.
  • 다양한 표현과 기법이 있지만, 우선 주로 Query Interface(문법적인 부분)을 다뤄보겠다.




ANSI SQL? 
1986년부터 미국 표준협회에서 표준화한 SQL로, 
표준이기 때문에 모든 DB에서 호환된다고는 하지만,
개념과 표현 방법의 이론상일 뿐 실제론 많이 다를 수 있다.





Simple Queries in SQL

  1. SELECT clause 
    • SELECT clause를 사용하여 Projection(추출)하며, 일반적으로 중복은 허용한다. 
      중복을 허용하지만, 명시적으로 'ALL', 'DISTINCT'를 표기한다. 
      또한 *(Asterisk)를 표기하여 모든 column을 나타낼 수도 있다. 
    • SELECT 절에는 column 이름, 'AS'를 사용한 Renaming, 사칙 연산 등이 가능하다. 
    • SELECT 절에 작성된 column들에 대한 tuple을 반환한다. 


  1. FROM clause 
    • FROM clause를 사용하여 해당 쿼리를 수행할 Relation(s)를 표기한다. 
      즉 접근해야하는 Relation 이름을 작성한다. 
    • ,(comma)를 사용하여 JOIN 연산을 사용할 수 있다. 





FROM CLAUSE WARNING
콤마를 사용하여 조인 연산을 행한다고 했지만,
이는 empty한 relation과의 어떠한 쿼리가 
원하는 결과값과는 다를 수 있으니, PRODUCT를 사용하는것이 좋다.
콤마보다는 어떠한 연산을 할 것인지 명시하는 것이 가장 좋다.





  1. WHERE clause 
    • WHERE clause를 사용하여 Selection 연산을 행할 수 있다.
    • WHERE 절에는 'Predicate'를 작성하여 comparing할 수 있다. 
      ( =, <>, <, >, <=, >=),(c나 java와 동일, <>는 !=와 같다) 
    • comparison의 값은 boolean값(TRUE,FALSE), 논리연산자인 AND,OR, NOT 등등이 가능하다. 
    • WHERE clause의 모든 조건을 만족해야 한다.( TRUE만 반환, FLASE/UNKNOWN은 제거 )


즉, 표준 표기법은 다음과 같다.

SELECT  A1, A2, ...
FROM  T1, T2, ...
WHERE  P (Predicate)




READING/WRITING 관점
S-F-W 순서로 기재되어있지만, 사실 읽고 쓸땐 F-W-S순으로 한다.








Case Insensitivity 
SQL작성 시의 대소문자 구별 (column name, relation, aliases(renamed name)) 등등은 상관없다. 
(예 : From = FROM = from = FroM) 
하지만, 그 내용(Component)은 반드시 구별해야 한다.
그렇다고 항상 Insensitive한 것은 아니니 유념하도록 하자.







SQL & RA 

SELECT  L 
FROM  R 		=		πL(σC(R))
WHERE  C

L : column list
R : Relations
C : Conditions

여기서도, F-W-S순서라는 걸 알 수 있다. 


Rules of SQL

Comparison of Strings

  • String에 있어서, 크다/작다는 lexicographically하게 비교한다.
  • 알파벳순 앞에오는게 작은값이며 같은패턴이라면 단어가더 긴 String이 더 크다. (예 : ant < bar, bar < bargin)
  • 또한 LIKE를 사용하여 pattern matching을 할 수 있다.
  • s LIKE 'p __' : p(Pattern), 그리고 언더바 갯수만큼의 임의의 String (예 : 'Star ____' : Star Wars, Star Trek)
  • s LIKE '%' : 임의값. ( 예 : '%o%' : Coco, Iron man 3)
  • 대소문자 구별은 DB system마다 다르다.
  • 패넡에 %, _와같이 특수한 문자를 사용하기위해 escape(\)를 사용한다. 
  • '을 사용하고 싶을 땐 ''로 사용, 즉 따옴표는 두번 표기해서 사용한다. 

예 : 

 LIKE 'ab\%cd%' : ab%cd~~~ 
 LIKE 'ab\\cd%' : ab\cd~~~
 escape '\'


Dates and Times

  • 5/14/1948이나 14 May 1948같이 날짜나 시간에 대한 data type은 특별하다.
  • DATE '1948-05-14' 로 사용, 년도-월-일에 2자리로(필요하다면 0 추가)
  • TIME '15:00:02.5' 로 사용, 시간-분-초 (시간은 24시간, 역시 필요하면 0 추가)
  • TIMESTAMP '1948-05-14 12:00:00' 로 사용, 두개를 섞은 것이다.
  • 이들도 대소비교가 가능하며 일찍인게 작은값이다. 


Null Values and Comparisons Involving NULL

  • SQL은 특별한 값인 NULL을 허용하는데, DB마다 처리 방식이 다르다.
  • 일반적으로 보편적인 처리방법은
    1. UNKNOWN : 정확히 몇인지는 모르지만 무슨 '값'이 있긴 있다. (생일 등)
    2. INAPPLICABLE : 존재할 수 없는 값. (미혼자의 배우자 등)
    3. WITHHELD : 볼 권한이 없는 값 (대외비 등)
  • WHERE절에서 중요한 두 가지 규칙은
    1. NULL과 다른 값과(NULL포함)의 사칙연산(+, -, ×, ÷)은 무조건 NULL이다.
    2. NULL과 다른 값과(NULL포함)의 대소비교(<, =, > 등)는 무조건 UNKNOWN이다. (T/F둘다가능하기 때문)
  • NULL은 tuple에 나타날 수 있는, constant하지않은 어떠한 '값'이다.
  • 'IS NULL'을 사용하여 판단할 수 있다. (x IS NULL에서 x가 NULL값이면 TRUE)




Pitfalls Regarding NULLs

NULL은 '모르지만, 존재는 하는 값'이라 했지만, 
가만히 생각해보면 이것 또한 잘못된 표현이다. 
예를 들어, 0×i에서 도메인이 인티져 값이면 i가 NULL이어도 
0인게 맞지만, rule에 의해 unknown이다. 
또, i-i에서 어떤 인티져라도 0이지만, 역시 unknown이다. 
Be Careful!! NULL is NULL




Syntax of SQL

Ordering the Output

  • S-F-W clause 뒤에 ORDER BY를 사용하여
    정렬된 output을 얻을 수 있다.(default는 ascending, DESC(descending)을 명시하여 내림차순도 가능)

예 : 

SELECT  name
FROM  student
WHERE  dept_name = 'Comp. Sci.'
ORDER BY  s_id;


Disambiguating Attributes

  • 같은 이름의 attribute를 가진 여러 개의 relation의 combine에서 
    어떤 relation의 column인지 명시할 필요가 있다.
  • .(dot)으로 구별한다. 

예 : 

SELECT  student.name, instructor.name
FROM  student, instructor;


Tuple Variables

  • 한개의 relation에서 비교를 하고 싶을 때 
    FROM clause에 AS(생략가능)로 같은 relation을 다른 이름으로 구별한 뒤 
    쿼리문을 작성한다. 

예 : 

FROM  Movie M1, Movie M2


Union, Intersection, and Difference of Queries

  • UNION, INTERSECT, EXCEPT를 사용하여 RA에서와 같은 연산들을 수행할 수 있다. 

예 : 

(SELECT  name FROM  Movie)
  INTERSECT
(SELECT  name FROM  MovieStar);




Readable SQL Queries (가독성) 

SQL에서 일반적으로 FROM이나 WHERE clause가 상당히 중요하기 때문에 
line의 맨 앞에 작성하는 것이 당연히 가독성이 좋다. 
하지만, 짧고 간결한 SQL문이면 
다음과 같이 한 line에 작성해도, 쿼리규칙을 준수하며 가독성도 괜찮다고 할 수 있다. 



예 : 

SELECT  *		 ->		SELECT  * FROM  Movies
FROM  Movies;


Subqueries

  • SQL에서는 한 쿼리가 다양하게 쓰이는데, 
    이 쿼리의 일부분을 Subquery라고 부른다.
  • 하위 쿼리 또한 하위 쿼리를 가질 수 있고, 원하는 대로 하위 단계를 계속 쌓을 수 있다.
  • 하위쿼리가 쓰이는 경우 
    1. Subqueries는 한 개의 constant를 반환, 이 constant는 WHERE clause에서 쓰인다. (즉, WHERE clause에서 사용된다.)
    2. Subqueries는 WHERE clause에서 다양하게 쓰이는 'Relation'도 반환가능.
    3. Subqueries는 그들의 relation도 소유할 수 있다. (다른 저장된 relation과 마찬가지로) 

-> 즉, FROM clause에도 사용 가능하다. 

예 : 

SELECT name FROM student, takes WHERE course_name in (SELECT course_name FROM instructor, teached WHERE instructor.name = 'Bohyun');




Conditions Involving Relations

  1. EXISTS : 존재하는 
  2. s (NOT) IN R : s가 R에 존재(안)하는 
  3. s (<)> ALL R : s가 R의 모든 값보다 크(작)다면

   ( s <> ALL R = s NOT IN R ) 

  1. s (<)> ANY R : s가 R의 값들 중 어느 하나와 크(작)다면

   ( s = ANY R = s IN R )



EXISTS와 IN의 차이점 

둘 다 존재하는 row를 찾는 condition이지만 
NULL의 여부에 따라, EXISTS는 해당 row가 존재하는지만 찾기 때문에 
다른 row에 NULL 값이 있어도 TRUE가 반환될 수 있다.
반면 IN은 데이터의 값까지 확인하기 때문에, NULL 값 존재시 
IN은 무조건 FALSE를 반환한다.





JOINS
역시 RA와의 의미는 같고, SQL상의 표기법을 예시를 통해 알아보자. 

  • NATURAL JOINS 

예 : 

SELECT  student.name
FROM  student NATURAL JOIN instructor;


  • OUTER JOINS 

예 : 

SELECT  student.name
FROM  student FULL OUTER JOIN instructor ON ~;

SELECT  student.name
FROM  student LEFT OUTER JOIN instructor ON ~;

SELECT  student.name
FROM  student RIGHT OUTER JOIN instructor ON ~;


Full-Relation Operations

  • 적은, 몇개의 개개 tuple을 연산하는 것 말고, 
    전체 Relation에 대한 연산을 한번 알아보자. 


Eliminating Duplicates

  • 일반적으로, 쿼리 작성은 Bag 기반이기 때문에 (Set이어도 쿼리 수행 시 중복 tuple이 발생할 수 있지만) 
    중복이 허용된다. 이 때, DISTINCT 를 표기함으로써, 중복을 제거할 수 있다. 




Cost of duplicate elimination

Very expensive하다. 
time 또한 쿼리수행보다 오래걸린다 
그러므로, 현명하게 사용하자. 





Duplicates in Unions, Intersections, and Differences

  • 각 연산에 ALL을 붙여 중복을 허용할 수 있다. 

UNION ALL 
INTERSECT ALL 
EXCEPT ALL 


Grouping and Aggregations

  • RA와 같은 그룹화, Aggregation이다. 
  • GROUP BY를 사용하여 그룹화 한다. 
    전에도 언급했듯, 단순 그룹화만은 중복을 제거하며 정렬하는 것일 뿐 의미가 없다. 
    즉, Aggregation operator와 같이 사용한다. 
    • NULL의 경우, NULL도 그룹화 해서 NULL끼리의 aggregation를 시행한다. 
  • Aggregation 연산자로는 RA와 같은 의미를 가진
    • SUM, AVG, MIN, MAX, COUNT를 사용한다. ( COUNT*, COUNT (DISTINCT x) )
    • SELECT clause에 작성하며, Aggregation의 기준이 되는 그룹 명도 '1개만' 표기한다.

예 : 

SELECT  studio_name, AVG(salary)
FROM  Movies
GROUP BY  studio_name
  • HAVING을 사용하여 본래의 WHERE clause처럼 group에 조건을 부여하는 데 사용하지만, 
    이는 group화 한 이후의 조건을 따지는 것이므로 작성시 주의하자. 

예 : 

SELECT  studio_name, AVG(salary)
FROM  Movies
GROUP BY  studio_name
HAVING  AVG(salary) > 2000;






마침.


블로그 이미지

차트

소소한 일상 C코드 DB 항상 행복하게^-^★

,