집합 연산(Set Operation)이란?
SQL에서 집합 연산이란, 여러 쿼리 블록의 결과들을 하나의 결과로 결합하는 것. 여기서 '쿼리 블록'은 SELECT와 같이 어떤 결과 집합을 반환하는 모든 SQL 문(SQL statement)을 의미하며, 간단한 테이블이라고도 한다.
집합 연산은 3가지로 나눌 수 있다.
Set Operation | Definition | |
1 | UNION | 두 쿼리 블록의 모든 결과를 중복을 생략하여 하나의 결과로 결합. ⇒ 합집합 |
2 | INTERSECT | 두 쿼리 블록의 결과에서 공통된 행만을 중복을 생략하고 결합. ⇒ 교집합 |
3 | EXCEPT | 두 쿼리 블록 A와 B에 대해, B에 존재하지 않는 A의 모든 결과를 중복을 생략하고 반환. ⇒ 차집합 |
- 세 집합 연산자는 모두 기본적으로 중복을 생략하여 결과를 반환한다. 즉, 중복 생략이 집합 연산자의 기본 동작이기 때문에 일반적으로 DISTINCT를 굳이 명시적으로 지정할 필요가 없다.
- 각 집합 연산자는 'ALL' 이라는 수정자(modifier)를 지원한다. 집합 연산자 뒤에 ALL 키워드가 오면 결과에 중복이 포함된다.
- 일반적으로, 쿼리 블록과 집합 연산은 어떤 순서로든 조합할 수 있다.
세 가지 집합 연산 중에서 UNION은 지난 게시물을 참고하기
👉 https://limhm4907.tistory.com/170
예를 들어 아래와 같은 테이블이 있다고 할 때, 두 개의 집합 연산 INTERSECT 와 EXCEPT 에 대해 알아보자.
SELECT * FROM Order
+----+-------------+-------+--------+
| id | name | pizza | hotdog |
+----+-------------+-------+--------+
| 1 | Jenny | NULL | 17 |
| 2 | Michael | 3 | 0 |
| 3 | Austen | 2 | 3 |
| 4 | Sebastian | NULL | 11 |
| 5 | Camila | 12 | NULL |
| 6 | Gabriel | NULL | NULL |
+----+-------------+-------+--------+
1. INTERSECT (교집합)
SELECT * FROM Order WHERE pizza > 0 -- query 1
INTERSECT
SELECT * FROM Order WHERE hotdog > 0 -- query 2
+----+--------+-------+--------+
| id | name | pizza | hotdos |
+----+--------+-------+--------+
| 3 | Austen | 2 | 3 |
+----+--------+-------+--------+
pizza와 hotdog를 둘 다 주문한 사람을 찾기 위해서 INTERSECT 연산을 할 수 있다. pizza와 hotdog를 모두 주문한 사람은 단 1명으로 id가 3인 Austen 뿐이다.
2. EXCEPT (차집합)
SELECT * FROM Order WHERE pizza > 0 -- query 1
EXCEPT
SELECT * FROM Order WHERE hotdog > 0 -- query 2
+----+---------+-------+--------+
| id | name | pizza | hotdog |
+----+---------+-------+--------+
| 2 | Michael | 3 | 0 |
| 5 | Camila | 12 | NULL |
+----+---------+-------+--------+
오직 pizza만 주문한 사람을 찾기 위해 EXCEPT 연산을 할 수 있다. pizza만 주문한 사람은 Michael, Camila 두명이다. 만약 hotdog만 주만한 사람을 찾고 싶다면 쿼리 작성 순서를 반대로 해주면 된다. EXCEPT 앞에 query 2를 먼저 작성해주면 된다.
[참고 자료]
MySQL Documentation > Set Operations with UNION, INTERSECT, and EXCEPT
https://dev.mysql.com/doc/refman/8.4/en/set-operations.html
https://dev.mysql.com/doc/refman/8.4/en/intersect.html
https://dev.mysql.com/blog-archive/intersect-and-except-in-mysql-80/
'데이터 처리 도구 > SQL' 카테고리의 다른 글
[MySQL] WITH절 사용하여 CTE 생성하기 (0) | 2024.07.28 |
---|---|
[MySQL] 정규표현식 함수 (Regular Expressions) (0) | 2024.07.11 |
정규 표현식(Regular Expression) (0) | 2024.03.20 |
[MySQL] 집합 연산(1): UNION, UNION ALL 사용하여 조회 결과 결합하기 (0) | 2022.09.07 |
[MySQL] 비트 연산과 관련 함수(CONV, BIN, BIT_LENGTH) (0) | 2022.09.04 |