한양과학기술고등학교

에듀테크 프로젝트 대시보드

집합 연산

UNION UNION ALL INTERSECT EXCEPT VALUES

두 결과 집합을 세로로 합치거나 교집합·차집합을 구합니다. 컬럼 개수와 타입이 맞아야 합니다.

1. 세 연산

연산의미중복
UNION합집합제거 (정렬 비용)
UNION ALL그냥 이어붙이기유지 (빠름)
INTERSECT양쪽 모두에 있는 행제거
EXCEPT왼쪽에만 있는 행제거
팁
  • 중복이 없다는 걸 알면 항상 UNION ALL — UNION 은 전체 정렬/해시로 dedup 함

2. 예

-- 활성 + 대기 사용자 한 목록으로
SELECT id, name FROM active_users
UNION ALL
SELECT id, name FROM pending_users
ORDER BY name;          -- ORDER BY 는 전체에 한 번만, 맨 끝에
-- 이번 달 로그인했지만 지난 달엔 안 한 사용자
SELECT user_id FROM logins WHERE month = '2026-09'
EXCEPT
SELECT user_id FROM logins WHERE month = '2026-08';

3. VALUES 를 테이블처럼

-- 임시 매핑 테이블
SELECT code, label
FROM (VALUES
    ('P', '대기'), ('S', '발송'), ('D', '완료')
) AS status(code, label);

-- 조인에도
SELECT o.*, m.label
FROM orders o
JOIN (VALUES ('P','대기'),('S','발송')) AS m(code, label) ON m.code = o.status;

4. 다중행 INSERT 와의 관계

INSERT INTO status (code, label)
VALUES ('P', '대기'), ('S', '발송'), ('D', '완료');   -- 같은 VALUES 문법
"인덱스는 공짜가 아니다 — 읽기를 빠르게 하고 쓰기를 느리게 한다"