
이번 포스팅에서는 SQL에서 SELECT 결과들을 합치거나 비교할 때 사용하는 집합 연산자(Set Operators) 에 대해 알아보겠습니다. 서로 다른 SELECT 결과를 하나로 통합하거나 교집합·차집합을 계산할 때 매우 유용해요!
다루는 연산자:
UNIONUNION ALLINTERSECTEXCEPT💡 모든 예시는
company_db의employees및projects테이블 기반입니다.
-- employees 테이블
emp_id | first_name | department
-------|------------|------------
1 | Alice | Engineering
2 | Bob | Marketing
3 | Charlie | Engineering
4 | Diana | HR
-- projects 테이블
project_id | emp_id | project_name
-----------|--------|--------------
101 | 1 | AI Platform
102 | 2 | Rebranding
103 | 1 | Data Lake
104 | 3 | Automation
UNION — 결과 합치기 (중복 제거)두 SELECT 문의 결과를 합칩니다. 동일한 레코드는 1개만 남깁니다.
SELECT emp_id FROM employees
UNION
SELECT emp_id FROM projects;
| emp_id |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
UNION ALL — 결과 합치기 (중복 포함)중복된 행도 모두 포함하여 결과를 합칩니다.
SELECT emp_id FROM employees
UNION ALL
SELECT emp_id FROM projects;
| emp_id |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 1 |
| 2 |
| 1 |
| 3 |
INTERSECT — 교집합양쪽 SELECT 결과에 모두 존재하는 값만 반환합니다.
SELECT emp_id FROM employees
INTERSECT
SELECT emp_id FROM projects;
| emp_id |
|---|
| 1 |
| 2 |
| 3 |
⚠️ MySQL에는 있지만 다른 DB에서는 지원을 하지 않을 수 있습니다.
EXCEPT — 차집합 (왼쪽에는 있고, 오른쪽에는 없는 것)SELECT emp_id FROM employees
EXCEPT
SELECT emp_id FROM projects;
| emp_id |
|---|
| 4 |
⚠️ MySQL은
EXCEPT도 지원하지 않음 →NOT IN,LEFT JOIN ... WHERE IS NULL로 대체 가능
다음 파트에서는 데이터 일관성과 복구 가능성을 보장하는 트랜잭션 (Transaction) 기능을 다뤄보겠습니다! 그럼 안뇽 👋