집합 연산

관계형 모델에서의 관계형은 수학 집합론의 관계형 이론에서 유래하였다.

데이터베이스의 데이터를 집합으로 간주해 다루기 쉽게 하는 것이라고 생각하면 된다.

 

- UNION

UNION 키워드를 통해 합집합을 구할 수 있다. (집합으로 치면 A U B 를 생각하면 된다)

 

=> UNION으로 두 개의 SELECT 명령을 하나로 연계해 질의 결과를 얻을 수 있다.

 

열 이름은 서로 다르더라도 열 개수와 자료형은 같아야 UNION 으로 합집합을 구할 수 있다.

 

 

- UNION을 사용할 때의 ORDER BY

 

쿼리문의 가장 마지막에 ORDER BY를 붙이면 된다.

하지만 두 개의 SELECT 명령에서 열 이름이 서로 일치해야 ORDER BY를 사용할 수 있다.

따라서 동일하게 별명을 붙이면 정렬을 할 수 있다.

c로 별명을 붙여 열 명을 일치시키고 정렬을 하였다.

 

 

- UNION ALL

UNION ALL 을 사용하면 중복을 제거하지 않고 2개의 SELECT 명령으 결과를 그냥 합친다.

 

- 교집합과 차집합

MySQL에서는 지원되지 않지만 SQL을 이용해 교집합, 차집합을 구할 수 있다.

교집합은 INTERSECT를, 차집합은 EXCEPT를 (Oracle의 경우는 MINUS) 사용한다.

 

 

테이블 결합

집합연산은 세로(행) 방향으로 데이터가 늘어나거나 줄어드는 계산이다.

테이블 결합은 가로(열) 방향으로 데이터가 늘어나는 계산이다.

 

1. 곱집합과 교차결합

곱집합은 두 개의 집합을 곱하는 연산방법이다.

X = {A, B, C} , Y= {1, 2, 3} 이라는 집합이 있다고 하면

두 집합 X와 Y의 곱집합은 다음과 같다.

ㅡㅡㅡㅡㅡㅡㅡㅡ

A,1   A,2   A,3

B,1   B,2   B,3

C,1   C,2   C,3

ㅡㅡㅡㅡㅡㅡㅡㅡ

 

- 교차 결합(Cross Join)

지금까지 SELECT 명령에서는 FROM 구에 하나의 테이블만 지정했다.

만약 테이블을 두 개 지정하면 곱집합으로 계산된다.

 

 

- UNION 연결과 결합 연결의 차이 

UNION에 의한 연결은 세로 방향, 결합에 의한 연결은 가로방향으로 확대된다.

 

2. 내부결합(Inner Join)

ex)

SELECT * FROM 상품, 재고수
WHERE 상품.상품코드 = 재고수.상품코드
AND 상품.상품분류 = '식료품';

(두 테이블의 상품코드가 같은 행들 중에서도 상품분류가 식료품인 행의 상품, 재고수를 SELECT 해오는 명령)

 

WHERE 구에 두 개의 조건식이 지정되어 있다.

첫 번째 조건식은 교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것이고(결합조건)

두 번째 조건식은 결합조건이 아닌 검색조건이다.

 

이렇게 교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것을 '내부결합(Inner Join)' 이라고 한다.

 

3. INNER JOIN으로 내부결합하기

최근에는 INNER JOIN 키워드를 사용한 결합방법이 일반적으로 통용된다.

ex)

SELECT 상품.상품명, 재고수.재고수
FROM 상품 INNER JOIN 재고수
ON 상품.상품코드 = 재고수.상품코드
WHERE 상품.상품분류 = '식료품';

 

4. LEFT JOIN, RIGHT JOIN으로 외부결합 하기

ex)

SELECT 상품.상품명, 재고수.재고수
FROM 상품3 LEFT JOIN 재고수
ON 상품3.상품코드 = 재고수.상품코드
WHERE 상품3.상품분류 = '식료품';

 

외부결합을 사용하면 결합하는 테이블 중에 어느 쪽을 기준으로 할지 결정할 수 있다.

 

여기서는 상품3 테이블을 기준으로 하였으므로

상품3 테이블의 상품명은 데이터가 모두 나오지만

상품3.상품코드 = 재고수.상품코드 조건을 만족하지 못하면 재고수는 데이터가 NULL이 나오게 된다.

 

즉, 기준이 되는 테이블의 데이터는 결합 조건에 상관없이 모두 출력되지만 기준이 아닌 테이블의 데이터는

결합조건을 만족시키지 못하면 NULL이 나온다.

+ Recent posts