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
, тъй като редът NULL се игнорира.