데이터 처리 도구/SQL

[MySQL] 집합 연산(2): INTERSECT, EXCEPT

yourhm 2024. 8. 6. 11:24

집합 연산(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

 

[MySQL] 집합 연산(1): UNION, UNION ALL 사용하여 조회 결과 결합하기

집합 연산(Set Operation)이란?SQL에서 집합 연산이란, 여러 쿼리 블록의 결과들을 하나의 결과로 결합하는 것. 여기서 '쿼리 블록'은 SELECT와 같이 어떤 결과 집합을 반환하는 모든 SQL 문(SQL statement)

limhm4907.tistory.com

 

 

 

예를 들어 아래와 같은 테이블이 있다고 할 때, 두 개의 집합 연산 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

 

MySQL :: MySQL 8.4 Reference Manual :: 15.2.14 Set Operations with UNION, INTERSECT, and EXCEPT

15.2.14 Set Operations with UNION, INTERSECT, and EXCEPT SQL set operations combine the results of multiple query blocks into a single result. A query block, sometimes also known as a simple table, is any SQL statement that returns a result set, such as S

dev.mysql.com

 

 

https://dev.mysql.com/doc/refman/8.4/en/intersect.html

 

MySQL :: MySQL 8.4 Reference Manual :: 15.2.8 INTERSECT Clause

query_expression_body INTERSECT [ALL | DISTINCT] query_expression_body [INTERSECT [ALL | DISTINCT] query_expression_body] [...] query_expression_body: See Section 15.2.14, “Set Operations with UNION, INTERSECT, and EXCEPT” INTERSECT limits the result

dev.mysql.com

 

https://dev.mysql.com/blog-archive/intersect-and-except-in-mysql-80/

 

MySQL :: Intersect and Except in MySQL 8.0

Intersect and Except in MySQL 8.0 With the latest MySQL release (8.0.31), MySQL adds support for the SQL standard INTERSECT and EXCEPT table operators:  Let’s have a look how to use them. We will use the following table: CREATE TABLE `new` ( `id` int NO

dev.mysql.com