NULL mają specjalne zachowanie:porównanie czegokolwiek z NULL daje z powrotem NULL
, czyli coś innego niż false
lub 0
. Oznacza „nieznany”.
Weźmy na przykład poniższą tabelę:
user_id | gender
------------------
1 | NULL
2 | 'M'
3 | 'F'
4 | 'F'
SELECT * FROM mytable WHERE gender = 'M'
zwróci 1 wiersz, zgodnie z oczekiwaniami
SELECT * FROM mytable WHERE gender != 'M'
zwróci 2 wiersze, a NIE 3 wiersze.
SELECT * FROM mytable WHERE gender != 'M' OR gender IS NULL
zwróci oczekiwane 3 wiersze.
Edycja:w przypadku niektórych aplikacji użycie 0
(lub, nie daj Boże, inny "magiczny numer") zamiast NULL
nie jest nawet zalecane (jednostki lub dokładne wartości nie mają znaczenia w tym przykładzie):
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
Tutaj NULL
6 stycznia oznacza "wartość nieznana" - może dlatego, że temperatura była tak niska, że sonda termometru przestała reagować. Jest to jednak zupełnie inne znaczenie niż 3 stycznia, kiedy temperatura wynosiła 0
, czyli 0 stopni.
Ponadto, jak wspomina @Bill Karwin, wartości NULL zachowują się specjalnie w funkcjach agregujących (COUNT
,SUM
,AVG
itp.):obliczanie AVG(Temperature)
na powyższych danych dałoby ci -14.5
, ponieważ wiersz NULL jest ignorowany.