Концепция NULL
является распространенным источником путаницы для новичков в SQL, которые часто думают, что NULL
рассматривается как другие значения.
Это не тот случай. Концептуально, NULL
означает «пропущенное неизвестное значение», и поэтому оно трактуется совсем по-другому
То, что вы видите, довольно легко объяснить. Рассмотрим следующий пример:
CREATE TABLE mytb (id int, value int);
INSERT INTO mytb VALUES (1, 100);
INSERT INTO mytb VALUES (2, 200);
INSERT INTO mytb VALUES (3, NULL);
INSERT INTO mytb VALUES (4, 400);
Вышеуказанное означает, что для строки с id = 3
значение равно «unknown». Это может быть 300
, или 100
, или что-то еще.
Поэтому, когда вы запрашиваете следующее:
SELECT * FROM mytb WHERE value <> 100;
+------+-------+
| id | value |
+------+-------+
| 2 | 200 |
| 4 | 400 |
+------+-------+
2 rows in set (0.00 sec)
Строка с id = 3
не возвращается, потому что NULL <> 100
возвращает «неизвестно». Мы не знаем, имеет ли строка id = 3
значение 100, поэтому выражение не возвращает true
. Я тоже не верну false
. Возвращает «неизвестно» (NULL
).
Условие предложения WHERE
может быть выполнено только тогда, когда выражение true
. Когда вы сравниваете что-то с NULL
, выражение никогда не может быть истинным. Это будет «неизвестно».