2과목 · SQL 기본 및 활용·13장
집합 연산자
UNION/UNION ALL/INTERSECT/EXCEPT(MINUS)의 의미, 규칙, 성능 차이를 정리합니다.
1. 집합 연산자란
두 개 이상의 SELECT 결과를 수직으로 결합하는 연산자. 집합 이론의 합집합/교집합/차집합에 해당합니다.
| 연산자 | 의미 | 중복 |
|---|---|---|
UNION |
합집합 | 제거 |
UNION ALL |
합집합 | 유지 |
INTERSECT |
교집합 | 제거 |
EXCEPT (PG/ANSI) / MINUS (Oracle) |
차집합 | 제거 |
2. 공통 규칙
- 두 SELECT의 컬럼 수가 같아야 한다.
- 각 컬럼의 데이터 타입이 호환되어야 한다.
- 컬럼 이름은 첫 SELECT의 이름을 따른다.
ORDER BY는 마지막 SELECT 뒤에 한 번만.
SELECT emp_id, name FROM emp
UNION
SELECT cust_id, name FROM customer
ORDER BY 2; -- 별칭 대신 열 위치로도 가능
3. UNION vs UNION ALL
UNION: 중복 제거를 위해 내부적으로 정렬/해시 수행 → 느림.UNION ALL: 단순 연결 → 빠름. 중복이 문제 안 되면 UNION ALL 우선 선택.
-- 2024년 + 2025년 주문을 모두 보고 싶다 (중복 없음이 보장됨)
SELECT * FROM orders_2024
UNION ALL
SELECT * FROM orders_2025;
4. INTERSECT
양쪽 모두에 나타난 행만. 중복 제거됨.
-- 두 이벤트 모두에 참여한 고객
SELECT cust_id FROM event_a_log
INTERSECT
SELECT cust_id FROM event_b_log;
5. EXCEPT / MINUS
첫 쿼리에서 두 번째 쿼리를 뺀 결과.
-- A 이벤트엔 참여했지만 B 이벤트엔 참여하지 않은 고객 (Oracle)
SELECT cust_id FROM event_a_log
MINUS
SELECT cust_id FROM event_b_log;
-- PostgreSQL/ANSI
SELECT cust_id FROM event_a_log
EXCEPT
SELECT cust_id FROM event_b_log;
6. NULL과 집합 연산
UNION / INTERSECT / EXCEPT 모두 NULL을 같은 값으로 취급해 중복을 판단합니다 (= 비교와 다름).
SELECT NULL FROM dual
UNION
SELECT NULL FROM dual;
-- 결과는 NULL 1행 (같은 값으로 보아 중복 제거)
7. 성능 팁
- 가능하면 UNION ALL. 중복 제거가 꼭 필요할 때만
UNION. - 큰 집합에
EXCEPT/INTERSECT대신NOT EXISTS/EXISTS가 더 빠른 경우가 많음 — DBMS 옵티마이저와 인덱스 상황에 따라 다름.
8. 자주 출제되는 포인트
UNION= 중복 제거,UNION ALL= 중복 유지.- 컬럼 수·타입이 같아야 한다.
ORDER BY는 마지막 쿼리 뒤 한 번.- Oracle은
MINUS, 나머지는EXCEPT. - NULL도 집합 연산에선 같은 값으로 중복 처리.
9. 요약 체크리스트
- UNION/UNION ALL/INTERSECT/EXCEPT의 의미를 집합으로 설명할 수 있다.
- UNION ALL을 선호하는 이유를 말할 수 있다.
- 컬럼 수/타입 규칙과 ORDER BY 위치를 안다.
- DBMS별 MINUS/EXCEPT 차이를 안다.