데이터베이스 연구실.log

NOT IN과 NULL

NOT IN 서브쿼리 결과에 NULL이 하나라도 있으면 아무 행도 나오지 않는 이유와, IS NOT NULL 조건이나 NOT EXISTS로 피하는 방법, 사원, 관리자 예

NOT INNULLIS NOT NULL!=ALLmgr

#핵심 요약

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에서 정리)

실습 예의 흐름:

  1. KING의 사원번호(7839)를 확인함
  2. mgr = 7839인 사원 세 명이 KING의 직속 부함
  3. empno IN (SELECT mgr FROM emp)는 직속 부하가 한 명이라도 있는 관리자임
  4. empno NOT IN (SELECT mgr FROM emp)로 부하가 없는 사원을 찾으면, KING의 mgr이 NULL이라 아무 행도 나오지 않음

#필수 명령어 또는 SQL

SQL Developer 또는 SQL*Plus조회만 함
SELECT ename
  FROM emp
 WHERE empno IN (SELECT mgr FROM emp);

결과 해석: 자기 밑에 직속 부하가 한 명이라도 있는 관리자인 사원임

SQL Developer 또는 SQL*Plus조회만 함
SELECT ename
  FROM emp
 WHERE empno NOT IN (SELECT mgr FROM emp);

결과 해석: 서브쿼리 결과에 KING의 NULL mgr이 들어가므로 아무 행도 나오지 않음

SQL Developer 또는 SQL*Plus조회만 함
SELECT ename
  FROM emp
 WHERE empno NOT IN (SELECT mgr
                       FROM emp
                      WHERE mgr IS NOT NULL);

결과 해석: 직속 부하가 없는 사원이 나옴
EXISTS와 NOT EXISTS에서도 직속 부하가 없는 사원을 찾는 조건을 다룸

#사용 조건과 주의사항

IN은 NULL이 섞여 있어도 같은 값이 있는 행은 나옴
문제가 되는 것은 NOT IN임

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기