이 글은 Velog에서 이전한 글입니다. Velog 원문 보기
내용
- SQL에서 null의 의미
- null과 three-valued logic !
- true, false 그리고 unkonown
- where 절과 three-valued logic의 관계
- not in 사용 시 주의 사항
⭐️ SQL에서 NULL의 의미
- unknown
- unavailable or withheld
- not applicable
employee 테이블이 있다고 합시다. 테이블에는 id, name, birth_date 등의 attribute가 있다고 하겠습니다.
이때 id가 14인 직원은 생일 정보를 기입하지 않아서 birth_date가 NULL이고
id가 15인 직원 또한 생일 정보가 누락돼서 birth_data가 NULL이라고 하겠습니다.
둘 다 생일 정보가 모두 NULL이니까 두 직원의 생일이 같다고 할 수 있을까요?
아닙니다. 같을수도 있지만 다를수도 있습니다.
때문에 SQL에서는 NULL 비교를 할 때 같다, 다르다를 단정지을 수 없습니다.
생일 정보가 NULL인 직원의 id를 가져오는 쿼리문
SELECT id FROM employee WHERE birth_data = NULL;
## 결과 ##
Empty set
생일 정보가 NULL인 직원의 id를 가져오는 쿼리문을 실행했더니 결과로 Empty가 나왔습니다. 그렇다면 생일 정보가 NULl인 직원은 없다고 할 수 있을까요?
아닙니다. 이런 문제가 있기 때문에 NULL은 '=' 비교 연산자를 사용하면 안됩니다.
NULL을 비교 연산하는 방법
SELECT id FROM employee WHERE birth_date IS NULL
NULL을 비교 연산하는 경우에는 '='가 아닌 'IS'를 사용해야합니다.
⭐️ NULL과 Three-Valued Logic

위 사진은 EMPLOYEE 테이블의 사진입니다.
이때 아래의 쿼리문을 실행한다고 합시다
SELECT * FROM employee where bitrh_data = '1990-03-09;
이 쿼리문은 생년월일이 1990년 03월 09일인 직원을 모두 조회하는 쿼리입니다. 그런데 여기서 질문이 있습니다
id가 14, 15인 직원은 생일을 비교하는 단계에서 True, False 둘 중에서 어떤 결과가 나올까요?
이전에서 언급한 것처럼 생일 정보가 NULL이기 때문에 생년월일이 1990년 03월 09일 일수도 있고 아닐수도 있습니다. 때문에 여기서 새로운 개념이 나옵니다.
📌 UNKNOWN
- SQL에서 NULL과 비교 연산을 하게 되면 그 결과는 UNKNOWN이다
- UNKNOWN은 'TRUE 일수도 있고 FALSE일 수도 있다'라는 의미이다
- three-valued logic: 비교/논리 연산의 결과로 TRUE, FALSE, UNKNOWN을 가진다.
UNKNOWN의 논리 연산 결과

📌 WHERE 절과 Three-valued logic의 관계
WHERE절의 condition(s)
- where절에 있는 condition(s)의 결과가 TRUE인 tuple(s)만 선택 된다.
- 즉, 결과가 FALSE거나 UNKNOWN이면 tuple은 선택되지 않는다.
특히나 두번째 설명이 매우 중요합니다. WHERE 절의 결과가 FASLE인 것만 선택되지 않는 것이 아니라 결과가 UNKNOWN인 tuple도 선택되지 않습니다.
이 점을 정확히 알아야 예상치 못한 동작이 발생했을 때 대처가 가능합니다.
📌 NOT IN 사용 시 주의 사항
v NOT IN (v1, v2, v3)는 아래와 같은 의미이다.
- v != v1 AND v != v2 AND v != v3
만약 v1, v2, v3 중에 하나가 NULL이라면?
출처
글에 사용된 내용 및 사진은 모두 아래 영상의 자료입니다.
유튜브-쉬운코드
시니어 백엔드 개발자가 알려주는 데이터베이스 개론 & SQL
'Backend > Database' 카테고리의 다른 글
| ✏️ [Spring DB] 프로젝트 생성 (0) | 2026.07.23 |
|---|---|
| ✏️ [Database] 테이블 조인(join) (0) | 2026.07.23 |
| ✏️ [Database] subquery (쿼리 안의 쿼리) (0) | 2026.07.23 |
| ✏️ [Database] 데이터 조회하기 (SELECT) (0) | 2026.07.23 |
| ✏️ [Database] 테이블에 데이터 추가 / 수정 / 삭제하기 (0) | 2026.07.23 |