관계형 DB를 조작하는 SQL은 관계 대수(Relational Algebra)를 기초로 만들어져 있다.
물론 SQL은 Relation 내에 중복을 허용하는 bag 기반이라 조금은 다르지만 큰 틀은 비슷해서 관계 대수의 기본 연산들과 SQL의 기본 연산들을 정리하고 비교해보려고 한다.
관계 대수에서 사용되는 기호랑 연산 이름을 쓰고 뭔지 적고 SQL에서 어떤 절과 비슷한지 적으려고 한다.
기본적으로 관계 대수의 연산들은 릴레이션(relation)을 대상으로 하며 그 결과 또한 릴레이션이 된다.
$\sigma_p(R)$ : Select (WHERE in SQL)
관계 대수에서 select란 연산을 위 기호로 쓴다. 어떤 릴레이션 d$R$에서 조건 $P$에 맞는 릴레이션들을 걸러내는 역할을 한다.
SQL에서 이와 같은 역할을 하는 것을 WHERE이다. SQL에서도 SELECT라는 것이 있기 때문에 헷갈릴 수도 있지만 관계 대수에서 Select는 조건문으로 릴레이션을 걸러내는 역할을 한다.
예시) $\sigma_{id=1}(R)$
$\Pi_{A_1, A_2, \ldots , A_n}(R)$ : Projetion(SELECT in SQL)
릴레이션 R의 속성(Attribute) $A_1, A_2, \ldots , A_n$을 뽑아서 튜플로 만든 릴레이션을 결과로 내놓는 연산이다.
SQL에서 이와 같은 역할을 하는 것이 SELECT다. select id, account from customer; 뭐 이런 식으로 쓰는 SQL 구문이 있다면 관계 대수 형식으로 나타낸다면 $\Pi_{id, account}(customer)$가 되겠다.
$R \cup S$ : Union(UNION in SQL)
일반적인 set operation인 union이다. 관계 대수에서나 SQL에서나 크게 다를 건 없다. 다만, SQL은 중복을 허용하는 bag 기반이라고 했는데 SQL에서 UNION을 하게 되면 기본적으로는 중복을 허용하지 않는다.
만약 중복을 허용하는 union을 SQL에서 하고 싶다면 ALL을 붙여줘야 한다. 그리고 이는 SQL에서의 set operation들에 공통적으로 해당한다.
$R \cap S$ : Intersection(INTERSECT in SQL)
$ R - S $ : Difference(EXCEPT in SQL)
두 집합 연산 모두 있으며 이는 중복을 허용하지 않는다. ALL도 따로 없다.
$R \times S$ : Product (CROSS JOIN in SQL)
릴레이션 R, S의 Cartesian Product를 만드는 연산이다. $R={(1,1), (1,2)}$, $S={(3, 3), (3, 4)}$라고 치면 $R \times S = {(1,1,3,3), (1,1,3,4), (1,2,3,3), (1,2,3,4)}$처럼 $R$의 각 원소와 $S$의 각 원소를 전부 concat 해준 결과를 내는 연산이다.
$R \bowtie S$ : Natural Join (NATURAL JOIN in SQL)
릴레이션 $R$과 $S$가 공통으로 가지고 있는 속성에 대해서 그 속성이 서로 같은 튜플을 뽑는 연산이다.
$R$과 $S$가 둘 다 id라는 속성을 갖고 있다면 $\sigma_{R.id=S.id}(R \times S)$와 그 결과가 같다.
Aggregate
Aggregation은 릴레이션을 입력받고 해당 릴레이션의 튜플들을 그룹화 해서 각 그룹을 하나의 값으로 만드는 연산이다.
예를 들자면 sum이라는 연산이 릴레이션 내의 특정 튜플들의 합을 구해주는 Aggregation 연산이 되겠다.
SQL에선 sum이나 count, max 같은 연산?들이 이러한 연산이고 group by로 그룹화할 속성(attribute)를 지정하기도 한다. 항상 중요한 것인데 aggregate를 했을 때는 group by에 있는 속성 외에는 select clause에서 지정할 수 없다.
aggregate는 그룹별로 연산을 진행하는데 group by를 따로 안하면 입력받은 릴레이션 전체를 그냥 하나의 그룹으로 보고 그걸 하나의 값으로 만들었기 때문에 속성들이 없어지기 때문이다.
'DB 공부' 카테고리의 다른 글
DBMS는 저장소를 어떻게 관리하는가? - 2 (2) | 2021.06.08 |
---|---|
DBMS는 저장소를 어떻게 관리하는가? (0) | 2021.06.02 |
SQL에서 NULL과의 연산 (0) | 2021.05.21 |
SQL 쿼리 연습문제 2 (0) | 2021.05.18 |
SQL 쿼리 연습문제 (0) | 2021.05.14 |