VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
mysql -u root -p sakila로 클라이언트를 여세요.
IS NULL의 동작 방식
COLUMN_NAME을 검사할 열로 바꾸세요.
IS NULL은 열에 값이 없을 때 참입니다. IS NOT NULL은 값이 있을 때 참입니다. 이 2개가 믿을 수 있는 유일한 검사이고, 그 이유는 밑바탕의 규칙입니다: NULL이 관련된 모든 비교는 NULL을 내는데, NULL은 참도 거짓도 아니므로 WHERE가 그 행을 버립니다.
예제
- 빠진 값 찾기
Sakila는 영화가 원래 만들어진 언어를 기록하는 열을 두고 있지만, 결코 채우지 않습니다.
NULL을 출력합니다.
- 값이 있는 행 찾기
1,000개의 영화가 모두 그 열을 비워 두므로, 반대 검사는 아무것도 반환하지 않습니다.
- 가끔 빠져 있는 열
address2는 주소의 두 번째 줄입니다. Sakila에는 603개의 주소가 있고, 그중 4개는 두 번째 줄을 없음으로, 나머지 599개는 빈 문자열로 기록합니다.
없는 값과 빈 값은 다릅니다
603개의 주소 중 4개만 두 번째 줄이 기록되지 않았습니다. 나머지 599개는 빈 문자열을 가지고 있는데, 그것은 값입니다: 누군가 일부러 거기에 아무것도 쓰지 않은 것입니다.NULL을 출력하고 빈 문자열에는 아무것도 출력하지 않으므로, 둘은 화면에서는 거의 같아 보이고 쿼리에서는 전혀 다르게 동작합니다. IS NULL은 처음 4개의 행을 찾고 = ''는 나머지 599개를 찾습니다. 어느 검사도 둘 다 찾지 못하므로, 둘이 섞인 열에서 모든 빈칸을 잡으려면 address2 IS NULL OR address2 = ''가 필요합니다.
= NULL은 결코 아무것과도 일치하지 않습니다
모든 영화의original_language_id가 NULL이므로, 이 쿼리는 1,000개의 행을 반환할 것처럼 보입니다.
=는 2개의 값이 같은지 묻는데, NULL은 값이 아니므로 답은 예도 아니오도 아닙니다. 답은 NULL이고, WHERE는 조건이 참인 행만 남깁니다.
같은 함정이 <> NULL도 잡는데, 이것도 아무것과도 일치하지 않습니다. IS NULL과 IS NOT NULL이 이 일을 위해 만들어진 연산자입니다.
연산자 하나가 이 규칙을 벗어납니다. <=>는 NULL 안전 동등 연산자입니다: 언제나 1 또는 0으로 답하고, 2개의 NULL을 같은 것으로 칩니다. 둘 다 값이 없을 수 있는 2개의 열을 비교하면서 그 경우를 일치로 치고 싶을 때 쓰세요. 연산자 수업에서는 <=>를 그것이 대체하는 비교 연산자들 옆에서 보여줍니다.
요약
- 없는 값을 검사하려면
IS NULL과IS NOT NULL을 사용하세요. = NULL이나<> NULL은 결코 쓰지 마세요. 둘 다 어떤 행과도 일치하지 않고 아무 말도 하지 않습니다.- NULL과의 모든 비교는 NULL을 내고,
WHERE는 그것을 참이 아닌 것으로 다룹니다. - 2개의 NULL을 같은 것으로 쳐야 할 때는
<=>를 사용하세요. IS NULL은 빈 문자열을 찾지 못하므로, 빈 문자열은 따로 검사하세요.
함께 보기
- WHERE — 이 검사들이 들어가는 절
- 연산자 — 다른 연산자에 대해 NULL이 동작하는 방식
- IN —
NOT IN목록의 NULL이 어떤 행도 반환하지 않는 이유 - MySQL의 NULL — 조인, 집계, 인덱스, 제약 조건에서의 NULL