← 개념서태블릿/PC 버전
2과목 · SQL 기본 및 활용·13

집합 연산자

UNION/UNION ALL/INTERSECT/EXCEPT(MINUS)의 의미, 규칙, 성능 차이를 정리합니다.

1. 집합 연산자란

두 개 이상의 SELECT 결과를 수직으로 결합하는 연산자. 집합 이론의 합집합/교집합/차집합에 해당합니다.

연산자 의미 중복
UNION 합집합 제거
UNION ALL 합집합 유지
INTERSECT 교집합 제거
EXCEPT (PG/ANSI) / MINUS (Oracle) 차집합 제거

2. 공통 규칙

  1. 두 SELECT의 컬럼 수가 같아야 한다.
  2. 각 컬럼의 데이터 타입이 호환되어야 한다.
  3. 컬럼 이름은 첫 SELECT의 이름을 따른다.
  4. 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 차이를 안다.