핵심 인사이트 (3줄 요약)

  1. 본질: EXISTS는 서브쿼리 결과가 존재하는지(T/F) 판별하는 반존재(Semi-Join) 연산이고, IN은 값 목록에 포함되는지 판별하며, 대량 데이터에서 EXISTS가 IN보다 성능이 좋은 경우가 많다.
  2. 가치: "주문이 있는 고객만"(EXISTS)과 "주문이 없는 고객"(NOT EXISTS)은 실무에서 가장 빈번한 패턴이며, 옵티마이저가 IN→EXISTS, 서브쿼리→JOIN으로 자동 변환하기도 한다.
  3. 판단 포인트: 서브쿼리 결과가 NULL을 포함하면 NOT IN은 모든 행을 제외하는 함정이 있으므로, NOT EXISTS가 안전하다.

Ⅰ. 개요 및 필요성

EXISTS:  SELECT * FROM cust c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.cust_id = c.id)
IN:      SELECT * FROM cust WHERE id IN (SELECT cust_id FROM orders)
NOT IN 함정: NULL 포함 시 전체 제외 → NOT EXISTS 권장
  • 📢 섹션 요약 비유: EXISTS는 "이 사람 명단에 있어?(T/F)", IN은 "이 값이 목록에 있어?"이다.

Ⅱ~Ⅴ. 결론

EXISTS·NOT EXISTS는 Semi-Join/Anti-Join의 표준 표현이며, NOT IN의 NULL 함정을 반드시 인지해야 한다.


📌 관련 개념 맵

개념연결 포인트
EXISTS존재 여부 (T/F)
NOT EXISTSAnti-Join (안전)
IN값 목록 포함
NOT INNULL 함정 주의
Semi-Join옵티마이저 변환

📈 관련 키워드 및 발전 흐름도

[IN 서브쿼리 (기본)] → [EXISTS (상관 서브쿼리)]
    → [옵티마이저 자동 변환 (IN↔EXISTS)]
    → [현재: Anti-Join 최적화 — NOT EXISTS 자동 변환]

👶 어린이를 위한 3줄 비유 설명

  1. EXISTS는 "이 명단에 이름이 있어? 있으면 OK!" 확인하는 거예요.
  2. NOT IN은 **빈칸(NULL)**이 있으면 모두 탈락시키는 함정이 있어요.
  3. 그래서 NOT EXISTS를 쓰는 게 더 안전하답니다!