I NULL hanno un comportamento speciale:confrontare qualsiasi cosa con un NULL restituisce un NULL
, che è qualcosa di diverso da false
o 0
. Significa "sconosciuto".
Ad esempio, prendi questa tabella:
user_id | gender
------------------
1 | NULL
2 | 'M'
3 | 'F'
4 | 'F'
SELECT * FROM mytable WHERE gender = 'M'
restituirà 1 riga, come previsto
SELECT * FROM mytable WHERE gender != 'M'
restituirà 2 righe, NON 3 righe.
SELECT * FROM mytable WHERE gender != 'M' OR gender IS NULL
restituirà le 3 righe previste.
Modifica:per alcune applicazioni, utilizzando 0
(o, Dio non voglia, un altro "numero magico") invece di NULL
non è nemmeno consigliabile (unità o valori esatti non sono rilevanti in questo esempio):
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
Qui, il NULL
il 6 gennaio significa "valore sconosciuto" - forse perché la temperatura era così bassa che la sonda del termometro ha smesso di rispondere. Tuttavia, è un significato completamente diverso dal 3 gennaio, quando la temperatura era 0
, ovvero 0 gradi.
Inoltre, come menziona @Bill Karwin, i NULL si comportano specialmente nelle funzioni aggregate (COUNT
,SUM
,AVG
ecc.):calcolando AVG(Temperature)
sui dati sopra riportati ti darebbero -14.5
, poiché la riga NULL viene ignorata.