MySQL에서 차집합 구하기 : NOT IN, ANTI JOIN, NOT EXISTS 방법 비교

LeeYulhee·2023년 12월 4일
0

👉 차집합 조회 이유


  • 두 테이블 간에 있는 데이터 중에서 한 테이블에만 존재하는 데이터를 찾는데 사용



👉 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 값을 포함한 서브 쿼리의 결과에 대해 예상치 못한 결과를 반환할 수 있으며, 서브 쿼리의 결과가 큰 경우 성능이 저하될 수 있음
    • 특히, 서브 쿼리가 많은 행을 반환할 때 성능 저하가 두드러짐
profile
끝없이 성장하고자 하는 백엔드 개발자입니다.

0개의 댓글