집합 연산
집합 연산은 두 SELECT 결과를 합치거나, 공통 부분을 구하거나, 차집합을 구합니다. 두 쿼리의 컬럼 수와 타입이 같아야 합니다. UNION, INTERSECT, EXCEPT
기본 문법
-- 합집합 (중복 제거)
SELECT ... UNION SELECT ...
-- 합집합 (중복 포함)
SELECT ... UNION ALL SELECT ...
-- 교집합
SELECT ... INTERSECT SELECT ...
-- 차집합
SELECT ... EXCEPT SELECT ...예제
UNION — 합집합 (중복 제거)
개발팀 직원과 급여 6백만 이상 직원을 합칩니다. 중복은 자동 제거됩니다.
SELECT name, department_id, salary
FROM employees WHERE department_id = 1
UNION
SELECT name, department_id, salary
FROM employees WHERE salary >= 6000000
ORDER BY salary DESC;UNION ALL — 합집합 (중복 포함)
UNION ALL은 중복을 제거하지 않아서 UNION보다 빠릅니다.
SELECT '직원' AS 구분, name AS 이름 FROM employees
UNION ALL
SELECT '부서', name FROM departments;INTERSECT — 교집합
개발팀이면서 동시에 고급여인 직원 (department_id가 겹치는 것).
SELECT department_id FROM employees WHERE salary >= 6000000
INTERSECT
SELECT department_id FROM employees WHERE hire_date < '2021-01-01';EXCEPT — 차집합
주문이 없는 직원 ID를 구합니다.
SELECT id FROM employees
EXCEPT
SELECT DISTINCT employee_id FROM orders;알아두면 좋은 것
- 두 SELECT의 컬럼 수가 같아야 합니다. 컬럼명은 첫 번째 SELECT 기준을 따릅니다.
- UNION은 내부적으로 정렬·중복제거를 하므로 UNION ALL보다 느립니다.
- ORDER BY는 전체 결과 맨 마지막에 한 번만 씁니다.