nullジマ

집합 연산

집합 연산은 두 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는 전체 결과 맨 마지막에 한 번만 씁니다.