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 се игнорира.