반응형

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 컬럼 수와 타입이 양쪽 쿼리에서 동일해야 집합 연산이 가능
반응형

+ Recent posts