정처LAB 자체 제작내용 검수 완료정처LAB SQLD 자체 제작 3회 · SQL 기본 및 활용 · WHERE와 3값 논리 · 17번
T(col)에 1, 2, 3, NULL이 저장되어 있다. 다음 조건으로 조회했더니 3을 포함한 어떤 행도 반환되지 않았다. 그 이유로 가장 정확한 것은?
WHERE col NOT IN (1, 2, NULL)
1
조건은 col<>1 AND col<>2 AND col<>NULL처럼 평가되며 마지막 비교가 UNKNOWN이어서 어느 행도 TRUE가 되지 않는다
정답 근거SQL의 3값 논리에서 어떤 값도 NULL과 같거나 다르다고 확정할 수 없다. 3<>1과 3<>2는 TRUE지만 3<>NULL은 UNKNOWN이므로 AND 전체가 UNKNOWN이고 WHERE 절을 통과하지 못한다.
2
IN 목록의 NULL은 자동으로 무시되므로 실제로는 col NOT IN (1, 2)와 같지만 옵티마이저가 3을 누락한 것이다
오답 이유NOT IN 목록의 NULL은 무시되지 않는다. 목록에 NULL이 섞이면 각 행의 전체 부정 조건이 TRUE로 확정되지 않을 수 있으므로 옵티마이저 누락으로 볼 수 없다.
3
NULL 비교는 항상 FALSE이므로 NULL 행만 제거되고 3은 반환되어야 하며, 결과가 비었다면 트랜잭션 격리 수준 문제이다
오답 이유NULL 비교 결과는 FALSE가 아니라 UNKNOWN이다. 이 현상은 격리 수준이 아니라 WHERE 절이 TRUE인 행만 선택하는 SQL 3값 논리 때문에 발생한다.
4
NOT IN은 NULL 안전 비교를 사용하는 NOT EXISTS로 자동 변환되므로 3이 제외된 원인은 암시적 형 변환이다
오답 이유NOT IN과 NOT EXISTS는 NULL 처리 의미가 자동으로 같아지지 않는다. 암시적 형 변환보다 하위 목록의 NULL 존재 여부가 직접 원인이다.
정답·상세해설
정답 1번
NOT IN (1, 2, NULL)은 개념적으로 col<>1 AND col<>2 AND col<>NULL을 모두 만족해야 한다. 3을 대입하면 앞의 두 비교는 TRUE지만 3<>NULL은 UNKNOWN이므로 전체 결과도 UNKNOWN이다. WHERE 절은 TRUE인 행만 남기기 때문에 3도 반환되지 않으며, col 자체가 NULL인 행 역시 비교 결과가 UNKNOWN이다. 하위 질의에서 목록을 만든다면 NULL을 제거하거나 업무 의미에 맞는 상관 NOT EXISTS를 사용해야 한다.