문제
부서 테이블에 존재하지 않는 부서번호를 가지거나 부서번호가 NULL인, 즉 '어느 부서에도 속하지 않는' 사원을 모두 조회하려 한다. 가장 적절한 SQL은?
① SELECT * FROM 사원 WHERE 부서번호 = NULL ② SELECT s.* FROM 사원 s INNER JOIN 부서 d ON s.부서번호 = d.부서번호 WHERE d.부서번호 IS NULL ③ SELECT * FROM 사원 WHERE 부서번호 IN (SELECT 부서번호 FROM 부서) ④ SELECT s.* FROM 사원 s LEFT OUTER JOIN 부서 d ON s.부서번호 = d.부서번호 WHERE d.부서번호 IS NULL
정답
4번
해설
정답은 ④이다. LEFT OUTER JOIN으로 모든 사원을 보존한 뒤, 조인에 실패해 부서 쪽 컬럼이 NULL로 채워진(=매칭되는 부서가 없는) 행만 d.부서번호 IS NULL로 걸러낸다. 이 방식은 '부서번호가 부서 테이블에 없는 고아 값'과 '부서번호 자체가 NULL인 사원'을 모두 포착한다. ① = NULL은 항상 UNKNOWN이라 결과가 비어 잘못된 표현이다(반드시 IS NULL 사용). ② INNER JOIN은 매칭된 행만 남기므로 d.부서번호가 NULL일 수 없어 항상 공집합이다. ③은 오히려 '부서에 속하는' 사원을 반환하며(반대 결과), 게다가 부서번호가 NULL인 사원은 IN 비교에서 제외된다. 보충: 안티조인은 OUTER JOIN + IS NULL 또는 NOT EXISTS로 구현하며, NOT IN은 서브쿼리 결과에 NULL이 섞이면 전체가 UNKNOWN이 되어 위험하다.