👉 차집합 조회 이유
- 두 테이블 간에 있는 데이터 중에서 한 테이블에만 존재하는 데이터를 찾는데 사용
👉 LEFT JOIN을 이용한 ANTI JOIN 사용하기
SELECT table1.*
FROM table1
LEFT JOIN table2 ON table1.column_1 = table2.column_1
WHERE table2.column_1 IS NULL;
- table1과 table2를 column_1을 기준으로 조인한 후, table2에서 해당 컬럼이 NULL인 table1의 행을 찾는 방법
- ⇒ table2에 없는 table1의 데이터를 의미
👉 NOT EXISTS를 이용한 서브 쿼리 사용하기
SELECT *
FROM table1
WHERE NOT EXISTS (SELECT 1
FROM table2
WHERE table2.column_1 = table1.column_1)
;
- table1의 각 행에 대해, 해당 행의 column_1 값이 table2에 존재하지 않을 경우 해당 행을 선택
👉 NOT IN
사용하기
SELECT *
FROM table1
WHERE column_1 NOT IN (SELECT column_1 FROM table2);
- table1에서 table2에 없는 column_1 값을 가진 행을 선택
👉 세 방법의 성능 비교
- NOT EXISTS
- 서브쿼리에서 조건을 만족하는 행이 하나도 없을 경우에만 외부 쿼리의 행을 선택
- 일반적으로 NOT IN이나 ANTI JOIN보다 성능이 좋은 편
- 특히 서브쿼리가 복잡하거나 큰 데이터셋을 포함하는 경우
- ANTI JOIN
- 왼쪽 테이블의 행이 오른쪽 테이블과 매칭되지 않는 경우를 찾음
- 큰 데이터셋에서는 JOIN 연산이 비용이 많이 들 수 있으나, 인덱스를 효과적으로 사용할 경우 성능이 개선될 수 있음
- 인덱스 최적화 및 적절한 조인 조건을 사용할 경우, 특히 대규모 데이터셋에서 좋은 성능을 보일 수 있음
- NOT IN
- 명시된 컬럼 값이 서브 쿼리의 결과에 포함되지 않는 행을 선택
- NULL 값을 포함한 서브 쿼리의 결과에 대해 예상치 못한 결과를 반환할 수 있으며, 서브 쿼리의 결과가 큰 경우 성능이 저하될 수 있음
- 특히, 서브 쿼리가 많은 행을 반환할 때 성능 저하가 두드러짐