핵심 요약
NULL을 0·공백과 구분하고 비교 결과 UNKNOWN이 WHERE와 연산에 미치는 영향을 이해한다.
학습 목표
- NULL의 의미와 3값 논리(TRUE·
FALSE· UNKNOWN)를 설명한다. - NULL이 비교·산술·집계 결과에 미치는 영향을 예측한다.
본문
개념 지도
업무 사실→행과 열→Key·제약조건→관계 연산→결과 집합핵심 내용
NULL은 값이 0이거나 빈 문자열이라는 뜻이 아니라 값이 없거나 아직 알 수 없음을 나타낸다. NULL과 일반 비교 연산을 수행하면 결과는 TRUE나 FALSE가 아니라 UNKNOWN이다.
WHERE commission = NULL -- 올바른 NULL 검사 아님
WHERE commission IS NULL -- NULL 검사
WHERE는 조건 결과가 TRUE인 행만 남기므로 FALSE와 UNKNOWN은 모두 제외된다. NULL + 10 같은 산술 결과는 NULL이다. 다만 집계 함수는 일반적으로 NULL을 제외하고 계산하며 COUNT(*)는 행 자체를 세고 COUNT(col)은 해당 컬럼이 NULL이 아닌 행만 센다.
Oracle은 현재 길이 0인 문자값을 NULL로 취급하는 특성이 있지만, 이는 표준 SQL의 일반 규칙으로 확대해 암기하지 않는다.
TRUE· FALSE· UNKNOWN 진리표
| A | B | A AND B | A OR B |
|---|---|---|---|
| TRUE | UNKNOWN | UNKNOWN | TRUE |
| FALSE | UNKNOWN | FALSE | UNKNOWN |
| UNKNOWN | UNKNOWN | UNKNOWN | UNKNOWN |
WHERE는 TRUE만 남기므로 FALSE와 UNKNOWN이 모두 제거되지만, NOT·
-- NULL과 비교하지 못함
WHERE commission = NULL
-- 올바른 검사
WHERE commission IS NULL
Aggregate와 NULL
COUNT(*)는 행 수를 세고, COUNT(col)은 col이 NULL이 아닌 행만 센다. SUM, AVG, MIN, MAX는 NULL을 제외하지만 모든 값이 NULL이면 결과가 NULL일 수 있다.
값: 10, NULL, 20
COUNT(*) = 3
COUNT(col) = 2
AVG(col) = 15
NVL· COALESCE 주의
NVL(col,0)은 NULL을 실제 0과 같은 업무값으로 해석하는 결정이다. 단순 표시용 치환과 조건식 의미를 구분한다. COALESCE는 왼쪽부터 첫 non-NULL을 반환하며 여러 대안을 표현할 수 있지만 타입 변환 규칙을 확인한다.
Unique와 NULL
Unique Constraint의 NULL 허용 방식은 DBMS 규칙과 복합키 조합에 영향을 받는다. “NULL끼리 같지 않으니 무조건 여러 건 허용”처럼 다른 DBMS까지 일반화하지 말고 Oracle의 실제 제약 동작을 확인한다.
시험 포인트
NULL 문제는 연산 결과와 WHERE 통과 여부를 분리해 계산한다.
| 식 | 결과 |
|---|---|
NULL = NULL | UNKNOWN |
NULL <> 10 | UNKNOWN |
NULL + 20 | NULL |
NULL IS NULL | TRUE |
COUNT(*) | NULL과 관계없이 행 수 |
COUNT(col) | col이 NULL이 아닌 행 수 |
AVG(col) | NULL을 제외한 합과 건수로 평균 |
SELECT sal / comm
FROM emp
WHERE ename = 'KING';
COMM이 NULL이면 나눗셈 결과도 NULL이다. 0으로 나눌 때의 오류와 NULL 연산을 혼동하지 않는다.
Oracle에서는 길이 0인 문자열 ''을 NULL로 취급한다. SQL Server의 빈 문자열은 NULL과 구별된다. 따라서 DBMS가 명시된 문제에서는 빈 문자열의 저장·비교 규칙을 반드시 확인한다.
NOT IN의 전개
x NOT IN (1, 2, NULL)
= x <> 1 AND x <> 2 AND x <> NULL
= TRUE/FALSE AND UNKNOWN
마지막 UNKNOWN 때문에 전체가 TRUE가 되지 않는다. 부재를 찾는 문제에서는 NOT EXISTS를 우선 검토하고, NOT IN이라면 서브쿼리 결과의 NULL 가능성을 확인한다.
자주 틀리는 부분
NULL = NULL은 TRUE가 아니다.NOT IN목록이나 서브쿼리 결과에 NULL이 섞이면 전체 조건이 UNKNOWN이 되어 예상과 달리 행이 나오지 않을 수 있다.SUM,AVG,COUNT(col)의 NULL 제외와COUNT(*)를 구분한다.
복습 문제
답을 생각한 뒤 정답과 근거를 펼쳐 보세요.
WHERE salary <> 3000은 salary가 NULL인 행을 반환하는가?
정답과 근거
반환하지 않습니다. NULL과의 비교 결과는 UNKNOWN이고 WHERE는 TRUE인 행만 남깁니다.
COUNT(*)와 COUNT(commission)의 차이는?
정답과 근거
COUNT(*)는 행을 세고 COUNT(commission)은 commission이 NULL이 아닌 행만 셉니다.
NULL NOT IN (1,2)가 UNKNOWN일 때 WHERE에서 그 행을 어떻게 처리하며 FALSE와 어떤 차이가 있는가?
정답과 근거
그 행은 WHERE 결과에서 제외됩니다. FALSE와 마찬가지로 통과하지 않지만, UNKNOWN은 NOT·