Hodnoty NULL mají zvláštní chování:porovnání čehokoli s hodnotou NULL vám vrátí hodnotu NULL
, což je něco jiného než false
nebo 0
. Znamená to „neznámý“.
Vezměme si například tuto tabulku:
user_id | gender
------------------
1 | NULL
2 | 'M'
3 | 'F'
4 | 'F'
SELECT * FROM mytable WHERE gender = 'M'
vrátí 1 řádek podle očekávání
SELECT * FROM mytable WHERE gender != 'M'
vrátí 2 řádky, NE 3 řádky.
SELECT * FROM mytable WHERE gender != 'M' OR gender IS NULL
vrátí očekávané 3 řádky.
Upravit:U některých aplikací pomocí 0
(nebo, nedej bože, další "magické číslo") místo NULL
není ani vhodné (jednotky nebo přesné hodnoty nejsou v tomto příkladu relevantní):
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
Zde je NULL
6. ledna znamená "hodnota neznámá" - možná proto, že teplota byla tak nízká, že sonda teploměru přestala reagovat. Je to však úplně jiný význam než 3. ledna, kdy byla teplota 0
, tedy 0 stupňů.
Také, jak zmiňuje @Bill Karwin, hodnoty NULL se chovají speciálně v agregačních funkcích (COUNT
,SUM
,AVG
atd.):výpočet AVG(Temperature)
na výše uvedených datech by vám dalo -14.5
, protože řádek NULL je ignorován.