NULL имеют специальное поведение: сравнение чего-либо с NULL возвращает NULL
, что является чем-то иным, чем false
или 0
. Это означает «неизвестно».
Например, возьмите эту таблицу:
user_id | gender
------------------
1 | NULL
2 | 'M'
3 | 'F'
4 | 'F'
SELECT * FROM mytable WHERE gender = 'M'
вернет 1 строку, как и ожидалось
SELECT * FROM mytable WHERE gender != 'M'
вернет 2 строки, а НЕ 3 строки.
SELECT * FROM mytable WHERE gender != 'M' OR gender IS NULL
вернет ожидаемые 3 строки.
Редактировать: Для некоторых приложений использование 0
(или, не дай Бог, другое "магическое число") вместо NULL
даже не рекомендуется (единицы или точные значения не имеют значения в этом примере):
Date | Temperature
--------------------------
2010-01-01 | 10
2010-01-02 | 4
2010-01-03 | 0
2010-01-04 | -22
2010-01-05 | -45
2010-01-06 | NULL
2010-01-07 | -34
Здесь NULL
6 января означает «значение неизвестно» - возможно, потому, что температура была настолько низкой, что датчик термометра перестал реагировать. Однако это совершенно другое значение, чем 3 января, когда температура была 0
, то есть 0 градусов.
Кроме того, как упоминает @Bill Karwin, значения NULL ведут себя особенно в агрегатных функциях (COUNT
, SUM
, AVG
и т. Д.): Вычисление AVG(Temperature)
на вышеуказанных данных даст вам -14.5
, так как Пустая строка игнорируется.