NOT IN과 NULL
NOT IN 서브쿼리 결과에 NULL이 하나라도 있으면 아무 행도 나오지 않는 이유와, IS NOT NULL 조건이나 NOT EXISTS로 피하는 방법, 사원, 관리자 예
#핵심 요약
NOT IN을 쓸 때는 서브쿼리에서 메인쿼리로 NULL이 넘어가지 않도록 주의함
NOT IN 목록의 어느 하나라도 NULL이면 모든 행이 FALSE나 UNKNOWN이 되어 아무 행도 나오지 않음
서브쿼리에 WHERE 컬럼 IS NOT NULL을 붙이거나 NOT EXISTS를 씀
#개념과 동작 원리
NOT IN은 !=ALL과 같음
집합의 원소 중 하나라도 NULL이면 FALSE가 됨
예: empno NOT IN (7839, 7698, NULL)은 empno != 7839 AND empno != 7698 AND empno != NULL임empno != NULL은 언제나 UNKNOWN이라 전체가 참이 될 수 없음(Nulls 표의 a != NULL → UNKNOWN에서 정리)
실습 예의 흐름:
KING의 사원번호(7839)를 확인함mgr = 7839인 사원 세 명이 KING의 직속 부함empno IN (SELECT mgr FROM emp)는 직속 부하가 한 명이라도 있는 관리자임empno NOT IN (SELECT mgr FROM emp)로 부하가 없는 사원을 찾으면, KING의mgr이 NULL이라 아무 행도 나오지 않음
#필수 명령어 또는 SQL
SELECT ename
FROM emp
WHERE empno IN (SELECT mgr FROM emp);결과 해석: 자기 밑에 직속 부하가 한 명이라도 있는 관리자인 사원임
SELECT ename
FROM emp
WHERE empno NOT IN (SELECT mgr FROM emp);결과 해석: 서브쿼리 결과에 KING의 NULL mgr이 들어가므로 아무 행도 나오지 않음
SELECT ename
FROM emp
WHERE empno NOT IN (SELECT mgr
FROM emp
WHERE mgr IS NOT NULL);결과 해석: 직속 부하가 없는 사원이 나옴
EXISTS와 NOT EXISTS에서도 직속 부하가 없는 사원을 찾는 조건을 다룸
#사용 조건과 주의사항
IN은 NULL이 섞여 있어도 같은 값이 있는 행은 나옴
문제가 되는 것은 NOT IN임