반응형
SQL에서도 집합 이론이 적용됩니다!
두 개 이상의 SELECT 결과를 합치거나 비교할 때 쓰이는 연산자들,
즉 UNION, UNION ALL, INTERSECT, MINUS(또는 EXCEPT)를 실습 예제와 함께 배워봅시다!
🧪 실습용 테이블 만들기
-- 고객 테이블 A
CREATE TABLE customers_domestic (
cust_id INT,
cust_name VARCHAR(50)
);
-- 고객 테이블 B
CREATE TABLE customers_foreign (
cust_id INT,
cust_name VARCHAR(50)
);
-- 샘플 데이터 삽입
INSERT INTO customers_domestic VALUES
(1, '홍길동'),
(2, '김영희'),
(3, '이철수');
INSERT INTO customers_foreign VALUES
(2, '김영희'),
(3, '이철수'),
(4, '존스미스'),
(5, '마이클');
🎯 포인트 요약
- customers_domestic → 국내 고객 목록
- customers_foreign → 해외 고객 목록
- 일부 고객은 두 테이블에 중복으로 존재함
1️⃣ UNION : 중복 제거한 합집합
SELECT cust_id, cust_name FROM customers_domestic
UNION
SELECT cust_id, cust_name FROM customers_foreign;
🧠 설명
- UNION은 중복을 제거한 합집합을 반환
- 결과는 자동으로 정렬(O) 됨
- 홍길동, 김영희, 이철수, 존스미스, 마이클 총 5명 나옴
2️⃣ UNION ALL : 중복 포함한 합집합
SELECT cust_id, cust_name FROM customers_domestic
UNION ALL
SELECT cust_id, cust_name FROM customers_foreign;
🧠 설명
- UNION ALL은 중복을 제거하지 않고 그냥 다 합쳐버림
- 위 예시 기준으로는 김영희, 이철수가 2번씩 나옴
- 성능 면에서도 UNION ALL이 더 빠름 (중복 체크 안 함)
3️⃣ INTERSECT : 교집합 (양쪽에 모두 있는 행)
SELECT cust_id, cust_name FROM customers_domestic
INTERSECT
SELECT cust_id, cust_name FROM customers_foreign;
🧠 설명
- 두 테이블 모두에 존재하는 공통 행만 추출
- 여기선 김영희, 이철수만 나옴
- 중복은 자동 제거됨
⚠️ MySQL은 INTERSECT, MINUS를 기본 지원하지 않음
➜ MariaDB, Oracle, PostgreSQL 사용 시 OK
➜ MySQL에서는 JOIN + DISTINCT 으로 대체 가능
4️⃣ MINUS : 차집합 (왼쪽엔 있지만 오른쪽엔 없는)
SELECT cust_id, cust_name FROM customers_domestic
MINUS
SELECT cust_id, cust_name FROM customers_foreign;
🧠 설명
- 왼쪽 테이블에는 있지만, 오른쪽 테이블에는 없는 순수 국내 고객만 추출
- 결과: 홍길동만 나옴
5️⃣ EXCEPT : MINUS와 동일 (PostgreSQL 스타일)
SELECT cust_id, cust_name FROM customers_domestic
EXCEPT
SELECT cust_id, cust_name FROM customers_foreign;
🧠 설명
- MINUS 대신 쓰이는 동일 기능의 키워드
- PostgreSQL에서는 EXCEPT만 지원하고, MINUS는 없음
🧾 한눈에 보는 집합 연산자 비교표
연산자 | 중복 제거 | 결과 | 설명 |
UNION | O | 합집합 | 두 쿼리 결과를 하나로 합치되, 중복은 제거 |
UNION ALL | X | 합집합 | 중복까지 전부 포함하여 합침 |
INTERSECT | O | 교집합 | 양쪽 쿼리에 모두 있는 행만 추출 |
MINUS | O | 차집합 | 왼쪽엔 있지만 오른쪽엔 없는 행만 추출 |
EXCEPT | O | 차집합 | MINUS와 같지만 PostgreSQL 등에서 사용 |
💡 실무 TIPS
- UNION ALL은 중복 제거 로직이 없어서 빠르다 → 성능이 중요한 경우 사용 고려
- INTERSECT, MINUS는 MySQL 미지원! → JOIN이나 NOT EXISTS로 대체해야 함
- SELECT 컬럼 수와 타입이 양쪽 쿼리에서 동일해야 집합 연산이 가능
반응형
'자격증 > SQLD' 카테고리의 다른 글
윈도우 함수 완전정복 : 순위 / 집계 / 행순서 / 비율 함수 (0) | 2025.05.12 |
---|---|
ROLLUP / CUBE / GROUPING SETS / GROUPING 완전정복 (0) | 2025.05.12 |
SQL 서브쿼리 완전 정복: 스칼라 / 인라인 뷰 / 중첩 서브쿼리 (0) | 2025.05.12 |
조인(JOIN) (0) | 2025.05.06 |
🎯 SQLD 자격증 완벽 정리 — WHERE 절 완전 정복! (0) | 2025.05.06 |