본문으로 바로가기
TaeyoungKim.dev

SQL NULL 비교: = NULL이 0건인 이유와 IS NULL 사용법

DB/SQL작성 약 3분 읽기TaeyoungKim
LinkedInX

완료하지 않은 작업이 분명히 두 건인데, WHERE completed_at = NULL로 찾으면 0건이다. 데이터가 사라진 걸까? 다행히 그렇지는 않다. NULL은 값이 없거나 아직 알려지지 않았다는 표시이고, 일반적인 값처럼 =로 비교하지 않는다.

SQL에서 NULL은 0과 어떻게 다를까?

아래 네 작업 중 1번과 3번에는 완료 시각이 없다. 여기서는 실제 서비스 데이터가 아닌, 결과를 확인하기 위한 작은 예제를 사용한다.

sql
CREATE TABLE tasks (
  id INTEGER PRIMARY KEY,
  completed_at TEXT
);

INSERT INTO tasks (id, completed_at) VALUES
  (1, NULL),
  (2, '2024-11-18'),
  (3, NULL),
  (4, '2024-11-20');

NULL은 숫자 0도 아니고, 날짜 문자열도 아니다. 이 열에서는 '완료 시각을 기록하지 않았다'는 뜻으로 쓴다. NULL이 언제나 '미완료'를 뜻하는 것은 아니다. 그 의미는 열을 설계한 쪽이 정해야 한다.

WHERE completed_at = NULL은 왜 0건일까?

처음에는 이렇게 검색하기 쉽다.

sql
SELECT id
FROM tasks
WHERE completed_at = NULL
ORDER BY id;

결과는 0건이다. SQL에서 NULL과의 일반 비교는 참(TRUE)이나 거짓(FALSE)이 아니라 알 수 없음(UNKNOWN)이 된다. WHERE는 조건이 참인 행만 남기므로, 1번과 3번도 이 검색에서는 빠진다. 조건을 NOT (completed_at = NULL)로 뒤집어도 UNKNOWN이 참으로 바뀌지 않는다.

IS NULL로 조회하면 어떤 작업이 나올까?

값이 없는지를 묻는 조건은 = 대신 IS NULL이다.

sql
SELECT id
FROM tasks
WHERE completed_at IS NULL
ORDER BY id;
text
id
1
3

같은 네 행인데 질문을 바꾸자 찾던 두 건이 나온다. 그림의 왼쪽은 = NULL의 빈 결과, 오른쪽은 IS NULL에서 남은 1·3번이다. NULL 행이 갑자기 생긴 게 아니라, 조건이 달라졌다.

값이 있는 행은 <> NULL이 아니라 IS NOT NULL로 찾을까?

반대쪽도 같은 규칙이다. completed_at <> NULL은 날짜가 있는 행을 찾지 못한다. NULL과의 비교 결과가 여전히 UNKNOWN이기 때문이다.

sql
SELECT id
FROM tasks
WHERE completed_at IS NOT NULL
ORDER BY id;
text
id
2
4

따라서 이 예제에서 IS NULL은 1·3번, IS NOT NULL은 2·4번을 고른다. = NULL과 <> NULL은 두 쪽 모두 0건이다. 결과 건수만 보지 말고 실제 ID도 함께 확인하면, 비슷한 조건 실수를 더 빨리 찾을 수 있다.

UPDATE 전에 무엇을 확인해야 할까?

읽기 쿼리에서는 빈 화면으로 끝나지만, 같은 조건이 UPDATE에 들어가면 수정 대상이 0건이 될 수 있다. 문법 오류가 나지 않으니 더 조용하다. 수정 전에 대상 행을 먼저 조회하고, 실행 후에는 변경된 행 수를 확인하자.

sql
SELECT id
FROM tasks
WHERE id = 3 AND completed_at IS NULL;

UPDATE tasks
SET completed_at = '2024-11-21'
WHERE id = 3 AND completed_at IS NULL;

이 예제에서는 조회 결과가 3번 한 건이고, 수정도 한 건이다. id = 3을 함께 둔 이유는 완료 시각이 없는 모든 작업을 한꺼번에 바꾸지 않기 위해서다. 실제 데이터를 고칠 때는 대상 범위와 변경 건수를 확인할 수 있는 절차를 먼저 정해 두는 편이 안전하다.

핵심 요약

NULL은 보통 값처럼 =·<>로 찾지 않는다. WHERE column = NULL이 0건을 반환하면 데이터가 없어졌다고 단정하기 전에 IS NULL로 다시 조회하자. 값이 있는 행은 IS NOT NULL로 찾는다. 읽기 쿼리든 수정 쿼리든, 조건을 바꾼 뒤에는 건수와 실제 대상 ID를 함께 확인한다.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#SQL#NULL#WHERE#IS NULL#IS NOT NULL

함께 읽으면 좋은 글