[데이터 모델과 SQL] 6. 집합 연산
만약 둘 이상의 테이블들을 이용해서 결과를 찾는다면 검색 결과(=결과 집합)를 기반으로 이들 사이의 교집합, 여집합, 합집합을 구할 필요가 있을 수 있다. 집합 연산의 개념과 SQL을 이용한 집합 연산(set operation)에 대해 알아보자.
● 교집합(intersection)
교집합은 두 집합의 원소들 중 공통된 원소들로 이루어진 집합이다.
A = {1, 2, 3}, B = {3, 4, 5} → A∩B = {3}
SQL을 이용하여 교집합을 구할 때는 INTERSECT 구문을 사용한다.
문법: SELECT 구문 INTERSECT [ALL] 또 다른 SELECT 구문
예) 자전거(productNumber 1, 2, 6, 11)와 헬멧(productNumber 10, 25, 26)을 둘 다 구입한 주문의 주문 번호(orderNumber)를 알고 싶다.
→ ⓐ자전거를 주문한 주문 번호 INTERSECT ⓑ헬멧을 주문한 주문 번호
ⓐ SELECT orderNumber FROM order_details WHERE productNumber IN (1, 2, 6, 11)
ⓑ SELECT orderNumber FROM order_details WHERE productNumber IN (10, 25, 26)
→ SELECT orderNumber FROM order_details WHERE productNumber IN (1, 2, 6, 11) INTERSECT SELECT orderNumber FROM order_details WHERE productNumber IN (10, 25, 26);
● 여집합(exception)
여집합은 두 집합의 차이를 나타낸다. 집합의 빼기 연산으로 표현된다.
A = {1, 2, 3}, B = {3, 4, 5} → A-B = {1, 2}, B-A = {4, 5}
여집합을 구할 때는 연산 대상의 순서에 따라 결과가 달라지는 점에 주의해야 한다.
SQL을 이용하여 교집합을 구할 때는 EXCEPT 구문을 사용한다.
문법: SELECT 구문 EXCEPT [ALL] 또 다른 SELECT 구문
예) 자전거(productNumber 1, 2, 6, 11)는 구입했지만 헬멧(productNumber 10, 25, 26)은 구입하지 않은 주문의 주문 번호를 알고 싶다.
→ ⓐ자전거를 주문한 주문 번호 EXCEPT ⓑ헬멧을 주문한 주문 번호
ⓐ SELECT orderNumber FROM order_details WHERE productNumber IN (1, 2, 6, 11)
ⓑ SELECT orderNumber FROM order_details WHERE productNumber IN (10, 25, 26)
→ SELECT OrderNumber FROM order_details WHERE ProductNumber IN (1, 2, 6, 11) EXCEPT SELECT OrderNumber FROM order_details WHERE ProductNumber IN (10, 25, 26);
● 합집합(union)
합집합은 대상이 되는 두 집합의 원소를 모두 포함하는 집합이다.
A = {1, 2, 3}, B = {3, 4, 5} → A∪B = {1, 2, 3, 4, 5}
SQL을 이용하여 교집합을 구할 때는 UNION 구문을 사용한다.
문법: SELECT 구문 UNION [ALL] 또 다른 SELECT 구문
예) 자전거 또는 헬멧을 구매한 구매건들의 구매 번호를 알고 싶다.
→ ⓐ자전거를 주문한 주문 번호 UNION ⓑ헬멧을 주문한 주문 번호
ⓐ SELECT orderNumber FROM order_details WHERE productNumber IN (1, 2, 6, 11)
ⓑ SELECT orderNumber FROM order_details WHERE productNumber IN (10, 25, 26)
→ SELECT orderNumber FROM order_details WHERE productNumber IN (1, 2, 6, 11) UNION SELECT orderNumber FROM order_details WHERE productNumber IN (10, 25, 26)
■