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 항상 행복하게^-^★

,

Extended Operators of Relational Algebra


Bags

What is Bags?

  • 일반적으로, Database의 각종 Data들은 간단한 순수 집합 베이스의 tuple들이다.
  • 가끔, Database system의 Relation은 Duplicate tuple(중복튜플)이 허용된다. 
    • (말인 즉슨 같은 tuple이 1회 이상 발생 허용) 
  • 이 때, 그 set을 Bag 혹은 Multiset이라 부른다. 

여기서의 '중복'이란, tuple의 중복이다 ( component의 중복과 다름 )


Sets vs Bags
종류의미중복 허용 여부
SetsData들의 집합
Bags마찬가지로, 
Data들의 집합

Set, Bag 둘 다 집합의 의미이며 tuple의 순서 역시 상관 없다.



Why Bags?

  • 개념상으로는, 중복을 허용하지 않아 tuple 개수가 더 적은
    Set이 Bag보다 Speed가 빠르고, 효율적인 Implementation에 유리한 것 처럼 보인다.
    하지만 이전에 언급했듯이, Union 연산은 Bag이 더 빠르다. 
    또, Projection 연산은 작업을 각 튜플에 대해 독립적으로 할 수 있게 해준다.
  • Set으로 결과를 얻으면 연산 후 일일이 다 비교하여 중복이 있는지 체크해야한다.
    반면 Bag으로 결과를 얻으면 비교 없이 작업이 종료된다.
    이와 같이, 연산을 수행하고 곧바로 종료되는 Bag과 달리, 중복 튜플을 확인작업하는 Set이 더 느리다.
    (단지 결과 Relation은 Set based가 크기가 작아서 빠르게 보이기만 할 뿐 사실상 훨씬 소요시간 ↑)
  • 또한, 평균 계산 등 아예 결과가 다른 경우도 있다. (그림 참조)

https://www.lucidchart.com/publicSegments/view/4767fc4f-e463-49e2-935d-e4b620240243/image.png



Union, Intersection, and Difference of Bags

  • Relation R에 튜플 T가 n개, Relation S에 튜플 T가 m개 있을 경우,
  • T의 개수 #T
    • #T in (R ∪ S) = n+m (개) 
    • #T in (R ∩ S) = MIN(n, m) (개) 
    • #T in (R - S) = MAX(0, n-m) (개) 

https://www.lucidchart.com/publicSegments/view/a7fc7147-3c4f-41bd-bf6b-96ed83ef7c56/image.png



Bag' operations on Sets 
Relation R과 S가 set이라고 하자.
이때 방금 언급한 Intersection, Difference 연산은
Bag-rule로 실행해도 같은 결과를 보인다.
하지만 Union 연산의 경우, Bag-rule로 실행하면
결과 Relation에 중복이 생길 수도 있다.
그러므로 Union 연산은 조심하자! 



Projection & Selection on Bags

  • Bag에 ProjectionSelection을 적용할 때, 
    각 tuple마다 독립적으로 수행(즉, 이와 같은 tuple이 있나 신경쓸 것 없이 자신만 신경쓰고)할 수 있다. 
    또한 Selection Condition 역시 각 tuple에 독립적으로 적용해야한다. 
  • Set의 연산과 중복을 허용한다는 점만 빼면 별 다를 게 없어서 그림은 생략했다. 


Algebraic Laws for Bags (연산법칙) 
Algebra(대수)에는 많은 법칙들이 있다. 
예를들어, Union 연산의 교환법칙 같은경우 Set이든 Bag이든 상관없이 성립한다. 
하지만, (R ∪ S) - T = (R - T) ∪ (S - T)같은 분배법칙같은 경우, 성립하지 않음에 주의! 

https://www.lucidchart.com/publicSegments/view/f68f959e-0207-43c9-be63-19f67abbf0c1/image.png



Product of Bags

  • Set의 Product 연산과 같다. 
    R에 tuple T1이 n개, 
    S에 tuple T2가 m개 있을 때 
    Product R × S에 tuple T1T2가 nm회 나올 뿐이다. 

https://www.lucidchart.com/publicSegments/view/3a768e25-00d0-4814-8d57-37980e174e15/image.png



Joins of Bags

  • Join 연산 역시 별거 없다. 
    그냥 Set의 Join 연산처럼 각 tuple들에 대해 
    조건에 맞는지 비교하고 결과 tuple을 결정하기만 하면 된다. 
    또한 연산 중 중복을 제거하지 않는다. 
    즉, 각각 별개의 독립적인 tuple로 취급한다. 

https://www.lucidchart.com/publicSegments/view/e88f29aa-ef70-4c46-ab93-5617a3b09461/image.png



Extended Operators of Relational Algebra

  • 지금까지 기본 Relational Algebra와 Set&Bag구별을 해 보았는데, 이들 모두 기초 질의어이다. 
  • SQL같은 언어는 실제 Application Processing에서 상당히 중요한 몇가지 다른 연산들도 더 가지고 있다. 
  • 추출 부분에 산술이 허용되는 등 기본 관계 대수 연산이 몇 가지 측면에서 확장되었다.



Duplicate Elimination

  • 말 그대로 중복을 제거하는 연산이다. 
  • δ(R) [ :델타]로 표현하며, Bag인 R의 중복튜플들을 제거함으로써 Set으로 변환한다.

https://www.lucidchart.com/publicSegments/view/2105ef0c-911c-4707-8495-241b53bf9df9/image.png



Aggregation Operators

  • 결과를 특정 연산을 취함으로써 하나의 결과로 반환한다. 
    • SUM : Column의 SUM(합)값을 반환한다.
    • AVG : Column의 Average(평균)값을 반환한다.
    • COUNT : Column의 Count(개수)값을 반환한다. ( 이 때, 별다른 언급이 없으면 중복 포함 )
    • MIN and MAX 
      • Numerical values : 각각 smallest, largest값을 반환한다.
      • Character-String values : 각각 
        Lexicographically(Alphabetically: 사전순서대로)하게 first, last 값을 반환한다. 

https://www.lucidchart.com/publicSegments/view/3845d05a-90c6-4539-a3c0-5d8bfef6ef8b/image.png


엄밀히 따지자면, Aggregation operator는
Relational Algebra는 아니다. 하지만
뒤에 나올 Grouping에서 사용하기 때문에
같이 학습하도록 한다.



Grouping

  • 보통, 전체 Column을 가지고 Average같은 Aggregation 연산을 하지는 않는다.
    각각 Column 1개 전체의 연산 말고 좀 더 Column들을 묶어서 연산을 행한다.
    • 예를 들어, Studio마다 상영시간의 총합을 알고싶은 경우엔 어떻게 하나?
      → Studio마다 묶어서 상영시간의 총합 Group마다 독립적으로 계산한다.
  • γL(R) [ :감마]로 표현하며, List L : Attribute 및 Aggregation으로 나타낸다. 
    이 때, 그룹화의 기준이 되는 Column을 Grouping attribute
    Aggregation 연산을 하는 Column(들)을 Aggregated attribute라 한다.
  • γL(R)의 특징
    1. R의 일부를 Group화한다. 각 Group들은 Grouping attribute에 해당하는 1개의 값을 갖는 모든 tuple들로 구성된다.(중복은 제거) 
      즉 Grouping attribute에는 NULL값이 허용되지 않는다
    2. 만약 Grouping attribute가 없다면, Relation R은 1 Group이다. 
    3. L에는 Attribute, 연산, →(Renaming)등을 기재할 수 있다.
    4. L에 연산(Aggregation)이 들어가면, 각 Group당 1개의 tuple만 존재하게 된다. 


Grouping은 쉽게 말해, 공통점을 찾아 그룹화 하는 것이다.

https://www.lucidchart.com/publicSegments/view/a299bb8d-c4bf-411e-896c-f119eab52c4a/image.png



δ is a special case of γ
델타(Duplicate Elimination)는 여러 개의 표현이 존재한다.
예를들어, R(A,B,C)에 대해 δ(R) = γA, B, C(R)이다.
즉, 델타는 Aggregation 없이 모든 Columns를 각각 그룹화 하는것과 같다.
그럼 각각의 Group들은 감마 연산자 자체가 중복을 제거하기 때문에 결국 같아진다.
하지만, 델타는 더 일반적이고 중요한 연산자라 Algebraic측면에선 더욱 고려할 필요가 있다.


혹자는 감마(Grouping)를 Set Projection의 확장(Extension)이라 여긴다.
즉, γA1A2..An(R) = πA1A2..An(R)이다. (물론 Set 한정, Bag이면 다름) 
그러므로 감마는 종종 일반화된 추출(Generalized Projection)이라 불린다.



Extending the Projection Operator

  • Extended Projection도 저번에 보았던 Projection과 거의 유사한데, 
    Attribute list L에 다음과 같은 요소들을 기재하여 좀 더 구체적인 추출이 가능하다.
  • πL(R) [ :파이]로 표현하며, 여기서 L값의 의미는,
    1. Relation R의 Column.
    2. x→y 표현 : x와 y는 둘 다 Column name이고, x를 y로 Renaming한다. 결과 Schema 역시 y로 표기된다.
    3. E→z 표현 : E는 Expression(Column, 상수, 산수, 스트링 연산자 등)
      z는 그 E의 계산 결과를 Renaming한 Column name이다.


신기하게도, 중복이 생길 수 있다.

https://www.lucidchart.com/publicSegments/view/3ca4fada-d84b-437d-b778-ad3a8d293be8/image.png



The Sorting Operator

질의의 결과 데이터를 저장해두고, 다음에 또 보고 싶을 때가 있다.
이를 위해 τL(R) [ :타우]을 사용해 정렬하는데, L은 Column의 listR은 역시 Relation이다.
즉, τL(R)는

  1. L이 하나의 Column : 이 Column의 값만을 기준으로 tuple을 정렬한다. (같다면 임의로 배치)
  2. L이 다수의 Column : 앞의 Column 기준으로 tuple을 정렬하고
    만약 같은 tuple이 있다면 그 다음 Column 기준으로 정렬하고,
    이런 방식으로 계속 정렬한다. ( L = A1,A2,...An에서 A1기준, A2기준,...An기준 )
    이 때도, n개 의 Column 말고 다른 Column만 다른 tuple이 존재하고, n개의 Column 값이 전부
    같으면, 임의로 배치한다. 즉, 기준Column이 아닌 다른 Column으로는 정렬상태를 알 수 없다.

https://www.lucidchart.com/publicSegments/view/d723c21b-faf0-46e5-8379-e64a92dc7f04/image.png

τ는 Anomalous(변칙적, 가변적)이기 때문에, 결과가 Set(순서가 상관이 없는)이 아니라 
List of tuples(순서가 상관이 있는)로 반환하는 유일한 연산이다.
그래서 Sorting은 Final Step 연산이다. 만약 τ 뒤에 또 다른 Operator가 나온다면, 
정렬된 순서는 다시 섞이게 된다.


Outerjoins

Why? 

  • 조건에 부합하는 tuple만을 반환하는 Join연산을 지난번에 살펴보았다.
    하지만, 결과 Relation에서는 흔적도 찾아볼 수 없는,
    조건에 부합하지 않고 'dangling'되는 tuple(들)이 있어,
    원래의 Relation을 완벽하게 표현할 수는 없다.
    → To avoid dangling tuple's loss
  • 이를 위해, Outerjoin 연산을 사용하며,
    실제로 많은 상용 DB system에서 다양하게 쓰인다.


How to use it 

  • 기본 Join으로 연산을 하되, 부합하지 않아 삭제될 tuple들도 
    결과 Relation의 하위에 기재한다. 이 때, 빈 칸( NULL값 )은 로 표시한다.
  • Theta-join의 조건(Predicate, Condition) 역시 추가할 수 있다.
    (이 때는 먼저 Condition에 만족하는 튜플들을 반환한 뒤
    나머지 제거되는 튜플들을 NULL 값과 같이 표시한다)

https://www.lucidchart.com/publicSegments/view/64ec85df-13f1-4ad7-9a77-2e61c307848c/image.png






마침.


블로그 이미지

차트

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

,