NULLs har ett speciellt beteende:om du jämför allt med en NULL får du tillbaka en NULL
, vilket är något annat än false
eller 0
. Det betyder "okänt".
Ta till exempel den här tabellen:
user_id | gender
------------------
1 | NULL
2 | 'M'
3 | 'F'
4 | 'F'
SELECT * FROM mytable WHERE gender = 'M'
returnerar 1 rad, som förväntat
SELECT * FROM mytable WHERE gender != 'M'
returnerar 2 rader, INTE 3 rader.
SELECT * FROM mytable WHERE gender != 'M' OR gender IS NULL
returnerar de förväntade 3 raderna.
Redigera:För vissa applikationer använder du 0
(eller, gud förbjude, ett annat "magiskt tal") istället för NULL
är inte ens tillrådligt (enheter eller exakta värden är inte relevanta i det här exemplet):
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
Här är NULL
den 6 januari betyder "värde okänt" - kanske för att temperaturen var så låg att termometersonden slutade svara. Det är dock en helt annan betydelse än den 3 januari, då temperaturen var 0
, det vill säga 0 grader.
Dessutom, som @Bill Karwin nämner, fungerar NULLs speciellt i aggregerade funktioner (COUNT
,SUM
,AVG
etc.):beräknar AVG(Temperature)
på ovanstående data skulle ge dig -14.5
, eftersom NULL-raden ignoreras.