자격증/SQLD

SQL NOT EXISTS 문법의 핵심 이해! - NULL이 포함된 조건 비교 주의점

2주녘 2025. 5. 24. 18:24
반응형

문제 설명

다음 SQL의 결과는 무엇일까요?

SELECT COUNT(*)
FROM T1
WHERE NOT EXISTS (
  SELECT 'X'
  FROM T2
  WHERE T1.COL1 = T2.COL1
);

T1 테이블

COL1

10
20

T2 테이블

COL1

10
NULL

① 2  ② 0  ③ 1  ④ 오류 발생


쿼리 분석 및 핵심 포인트

이 문제는 단순한 NOT EXISTS 서브쿼리 문제가 아니에요. NULL과의 비교 연산이 핵심 포인트입니다.

1.  NOT EXISTS란?

  • NOT EXISTS (SELECT ... FROM T2 WHERE 조건)은 T2의 조건절을 만족하는 값이 존재하지 않을 때 참이 됩니다.
  • 즉, T2에서 T1.COL1 = T2.COL1절대 참이 되지 않는 경우에만 해당 T1 행이 결과에 포함돼요.

 

2.  비교 연산자 =  NULL

여기서 주의할 점! SQL에서 NULL = 어떤 값은 무조건 UNKNOWN이 되고, 이는 WHERE 절에서 거짓(FALSE)으로 처리돼요.

예시:

  • 10 = 10 → TRUE
  • 10 = NULL → UNKNOWN → WHERE에서 걸러짐
  • NULL = NULL → UNKNOWN

실제 동작 흐름 분석

T1의 각 행에 대해 서브쿼리를 돌려보자!

T1의 첫 번째 행: COL1 = 10

서브쿼리:

SELECT 'X' FROM T2 WHERE T1.COL1 = T2.COL1;
-- 즉, WHERE 10 = T2.COL1;
  • T2에 10이 있음 → 조건 만족하는 행 있음 → EXISTS는 TRUE → NOT EXISTS는 FALSE
  • → T1의 이 행은 제외됨

 

T1의 두 번째 행: COL1 = 20

서브쿼리:

SELECT 'X' FROM T2 WHERE 20 = T2.COL1;
  • T2에는 20이 없음
  • 20 = NULL → 비교 불가(UNKNOWN)→ 이 행은 결과에 포함됨
  • → 조건을 만족하는 행이 하나도 없음EXISTS는 FALSE → NOT EXISTS는 TRUE

 

정답

→ 조건을 만족하는 행은 딱 T1의 두 번째 행 1개

③ 1


마무리 요약 정리

포인트 설명
NOT EXISTS 조건을 만족하는 값이 없을 때 참
NULL = 값 항상 UNKNOWN으로 평가됨
조건절 내 NULL 처리 조심해야 하며, 존재 유무 판단 시 혼란을 유발함
NULL이 있는 컬럼과 비교하는 서브쿼리에서는, 절대 = 조건이 항상 원하는 결과를 주지 않음! EXISTS/NOT EXISTS에서 더더욱 주의!
반응형