BACKEND

[DB]차집합 (LEFT OUTER JOIN + IS NULL)

handcraft 2025. 8. 19. 15:45

차집합 :

A - B : A에 있지만 B에는 없는 데이터

 

 

Oracle / MSSQL에서는 MINUS나 EXCEPT를 사용하면 쉽게 구현 가능:

 
-- Oracle
SELECT ID FROM TB1
MINUS
SELECT ID FROM TB2;

-- MSSQL
SELECT ID FROM TB1
EXCEPT
SELECT ID FROM TB2;

MySQL에서는 MINUS / EXCEPT가 없음

  • MySQL 8.0 이상에서 EXCEPT가 지원되지만, 이전 버전에서는 지원되지 않음
  • 대신 LEFT JOIN + IS NULL 패턴으로 차집합을 구현할 수 있음
-- mysql
SELECT *
FROM TB1 a
LEFT OUTER JOIN TB2 b
ON a.ID = b.ID
WHERE b.ID IS NULL;

설명

  1. LEFT OUTER JOIN TB2 b ON a.ID = b.ID
    • TB1의 모든 데이터를 기준으로 TB2와 조인
    • TB2에 일치하는 값이 없으면 b 컬럼들은 NULL
    • 즉, TB1의 모든 행이 남고, TB2에서 매칭되는 데이터는 오른쪽에 붙음
  2. WHERE b.ID IS NULL
    • 조인 결과에서 TB2에 없는 데이터만 선택
    • 즉, TB1에는 있지만 TB2에는 없는 데이터 → 차집합과 동일

요약

  • MySQL에서 차집합은 LEFT JOIN + IS NULL 패턴이 일반적
  • Oracle/MSSQL: MINUS / EXCEPT
  • MySQL 8.0+: EXCEPT 가능
  • 장점: 간단하고 직관적, 조인 컬럼 기준으로 바로 필터링 가능