홈 › SQL 중급 › 02 / 11

EXISTS·IN·NOT IN 과 NULL 함정

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

EXISTS · IN · NOT IN: 존재 확인과 NULL 함정

"다른 테이블에 있는가, 없는가"를 묻는 조회는 EXISTS 와 IN 으로 씁니다. 둘은 대부분 같은 결과를 내지만 의미와 성능 특성이 다릅니다. 이 레슨의 진짜 핵심은 NOT IN 입니다. 목록에 NULL 이 하나만 섞여도 결과가 통째로 0행이 되는 실무에서 가장 흔한 SQL 버그 중 하나를 직접 재현하고 세 가지 해결법을 비교합니다.

1. 왜 배우는가

"주문이 있는 직원", "아직 배정 안 된 부서"처럼 존재 여부만 확인하는 조회는 실무 조회의 큰 비중을 차지합니다. 이런 조회는 EXISTS 나 IN 으로 쓰는데, 어느 쪽을 쓰든 결과는 같아 보여 구분 없이 섞어 쓰는 경우가 많습니다.

문제는 반대 방향인 "없는 것"을 찾을 때 생깁니다. NOT IN 서브쿼리가 반환하는 목록에 NULL 이 하나라도 있으면, SQL 의 3값 논리 때문에 전체 조건이 거짓도 참도 아닌 UNKNOWN 이 되어 결과가 0행이 됩니다. 코드 리뷰에서 놓치기 쉽고, 데이터가 바뀌기 전까지는 정상처럼 보입니다.

이전 레슨(중급 01)에서 EXISTS 를 맛보기로만 다뤘다면, 이번 레슨은 EXISTS·IN·NOT IN 의 차이와 NOT IN 함정, 그리고 안전한 대안 세 가지를 직접 실행해 확인합니다.