홈 › SQL 중급 › 02 / 11

EXISTS·IN·NOT IN 과 NULL 함정

세미 조인·안티 조인, 3값 논리
섹션 6진행 0 / 11

6. 정리

EXISTS 와 IN 은 존재 여부만 확인하는 세미 조인이라 결과가 대부분 같고, JOIN 과 달리 매칭되는 행이 여러 개여도 바깥 행이 중복되지 않습니다. 반대로 NOT IN 은 서브쿼리 목록에 NULL 이 하나라도 있으면 3값 논리(UNKNOWN)로 인해 전체 결과가 0행이 되는 함정이 있고, NOT EXISTS·IS NOT NULL 추가·LEFT JOIN 안티 조인 세 가지로 피할 수 있습니다.

DB별로는 Oracle 계열이 빈 문자열을 NULL 로 취급해 이 함정을 더 자주 만나고, MySQL·MSSQL 은 실제 NULL 값이 있을 때만 같은 문제가 생깁니다. 옵티마이저는 EXISTS·IN·NOT EXISTS·NOT IN 을 세미 조인·안티 조인으로 변환해 실행하며, EXISTS 는 첫 행을 찾으면 더 찾지 않고 멈추는 단락 평가로 동작합니다.

다음 레슨(중급 04)은 UNION·INTERSECT·MINUS(EXCEPT) 같은 집합 연산을 다룹니다.