홈 › SQL 중급 › 02 / 11

EXISTS·IN·NOT IN 과 NULL 함정

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

5. 자주 하는 실수 (Tip)

실수 1: "없는 것"을 찾을 때 습관적으로 NOT IN 을 쓴다

NOT IN 은 서브쿼리 컬럼에 NULL 이 없다고 100% 확신할 때만 씁니다. 대부분의 코드베이스는 시간이 지나며 데이터가 바뀌므로, 처음부터 NOT EXISTS 를 기본값으로 삼는 편이 안전합니다.

실수 2: NULL 이 하나만 섞인 결과를 "데이터가 없나 보다"로 넘긴다

NOT IN 이 예상보다 적게, 특히 0행이 나오면 먼저 서브쿼리 결과에 NULL 이 있는지 확인합니다. SELECT COUNT(*) FROM orders WHERE emp_id IS NULL 처럼 간단한 확인 쿼리 하나면 원인을 바로 찾을 수 있습니다.

실수 3: EXISTS 서브쿼리에 상관 조건을 빠뜨린다

WHERE EXISTS (SELECT 1 FROM orders) 처럼 바깥 쿼리와 연결하는 조건(o.emp_id = e.id)을 빠뜨리면, orders 테이블에 한 행이라도 있으면 모든 직원이 참이 됩니다. EXISTS 서브쿼리는 거의 항상 상관 조건이 있어야 의미가 있습니다.

실수 4: Oracle 에서 빈 문자열을 "값 없음" 표시로 쓴다

Oracle 계열에서 '' 는 NULL 과 같습니다. "선택 안 함"을 표현하려고 빈 문자열을 넣으면 NULL 을 넣은 것과 똑같이 동작하고, NOT IN·집계 함수 등에서 NULL 과 같은 함정을 일으킵니다.