자격증/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에서 더더욱 주의!
반응형