개요
SQL에서 NULL의 의미와 Three-Valued Logic(3값 논리)에 대해 명확히 이해한다.
NULL은 단순히 "값이 없다"가 아니라, 여러 상황을 통칭하는 특별한 상태이며,
이 때문에 SQL의 비교 연산 및 조건 처리에서 독특한 동작을 보인다.
내용
SQL에서의 Null의 의미
NULL은 단일한 개념이 아니라 다음과 같은 여러 의미를 포함한다.
- Unknown — 값이 존재하나 현재 알 수 없음
예) 생일 정보가 아직 입력되지 않음. - Unavailable or Withheld — 값은 있으나 공개하지 않음
예) 민감한 개인정보라서 비공개 처리. - Not Applicable — 해당 속성 자체가 적용되지 않음
예) 집 전화가 없는 경우.
SQL에서는 이 모든 경우를 하나의 값 NULL로 표현한다.
따라서 NULL을 다룰 때는 단순한 빈 값과 다르게 처리해야 한다.
NULL 비교의 함정
다음과 같은 쿼리를 보자.
SELECT id
FROM employee
WHERE birth_date = NULL;
이 쿼리는 결과가 비어있다.
왜냐하면 = 연산자는 NULL을 비교할 수 없기 때문이다.
NULL 비교에는 반드시 IS 연산자를 사용해야 한다.
SELECT id
FROM employee
WHERE birth_date IS NULL;
-- 반대 조건
SELECT id
FROM employee
WHERE birth_date IS NOT NULL;
SQL에서 three-valued logic의 의미
SQL은 비교/논리 연산의 결과로 TRUE, FALSE, UNKNOWN 세 가지 값을 가진다.
즉, 2값 논리(Boolean)가 아니라 3값 논리를 사용한다.
예를 들어, 다음 데이터를 보자.
| birth_date |
| '1997-01-23' |
| ... |
| NULL |
| NULL |
| NULL |
다음의 쿼리를 실행하면
SELECT id
FROM employee
WHERE birth_date = '1997-01-23';
- 값이 1997-01-23인 경우 → TRUE
- 값이 NULL인 경우 → UNKNOWN (참일 수도, 거짓일 수도 있음)
그럼 SQL에서는 어떻게 처리하냐면 'UNKNOWN'이라고 처리한다.
UNKNWON은 'TRUE 일수도 있고, FALSE 일수도 있다'라는 의미이고,
three-valued logic은 비교/논리 연산의 결과로 true, false, unknown을 가진다는 의미이다.
Null의 비교 연산 결과
연산식결과
| 1 = 1 | TRUE |
| 1 != 1 | FALSE |
| 1 = NULL | UNKNOWN |
| 1 != NULL | UNKNOWN |
| 1 > NULL | UNKNOWN |
| NULL = NULL | UNKNOWN |
UNKNWON의 AND 비교 연산 결과
| AND | TRUE | FALSE | UNKNOWN |
| TRUE | TRUE | FALSE | UNKNOWN |
| FALSE | FALSE | FALSE | FALSE |
| UNKNOWN | UNKNOWN | FALSE | UNKNOWN |
UNKNWON의 OR 비교 연산 결과
| OR | TRUE | FALSE | UNKNOWN |
| TRUE | TRUE | TRUE | TRUE |
| FALSE | TRUE | FALSE | UNKNOWN |
| UNKNOWN | UNKNOWN | UNKNOWN | UNKNOWN |
UNKNWON의 NOT 비교 연산 결과
| TRUE | FALSE |
| FALSE | TRUE |
| UNKNOWN | UNKNOWN |
WHERE 절과 UNKNOWN
WHERE 절에서는 TRUE인 조건만 결과 튜플이 선택된다.
즉, 조건 결과가 FALSE 또는 UNKNOWN이면 해당 행은 제외된다.
이것이 중요한 이유는, NULL이 포함된 조건식은 대부분 UNKNOWN이 되기 때문에
원하지 않게 결과에서 제외될 수 있다는 점이다.
NOT IN 사용 시 주의사항
다음 조건을 보자.
v NOT IN (v1, v2, v3)
이는 아래와 동일하다.
v != v1 AND v != v2 AND v != v3
문제는 리스트 중 하나라도 NULL이 있으면
그 비교가 UNKNOWN이 되어 전체 AND 조건이 UNKNOWN이 되고, 결과가 나오지 않는다.

아래의 해결 방법이 있을 수 있을거 같다.
- NOT IN 대신 NOT EXISTS 사용
- NULL을 명시적으로 제외 (... WHERE col IS NOT NULL)
정리
- NULL은 단순한 빈 값이 아니라 여러 의미를 포괄한다.
- = 연산으로는 비교 불가, IS NULL 또는 IS NOT NULL 사용.
- SQL은 Three-Valued Logic(TRUE/FALSE/UNKNOWN)을 사용.
- WHERE 절에서는 UNKNOWN도 제외되므로, NULL 처리 로직이 필요하다.
- NOT IN에 NULL이 포함되면 의도치 않은 결과가 발생할 수 있다.
'기술 탐구 > RDB' 카테고리의 다른 글
| 데이터베이스 기본 개념 (5) | 2025.08.03 |
|---|---|
| (RDB) 데이터베이스 이상 현상과 Transaction Isolation Level (0) | 2025.01.05 |