Les NULL ont un comportement spécial :comparer n'importe quoi avec un NULL vous renvoie un NULL
, qui est autre chose que false
ou 0
. Cela signifie "inconnu".
Par exemple, prenez ce tableau :
user_id | gender
------------------
1 | NULL
2 | 'M'
3 | 'F'
4 | 'F'
SELECT * FROM mytable WHERE gender = 'M'
renverra 1 ligne, comme prévu
SELECT * FROM mytable WHERE gender != 'M'
renverra 2 lignes, PAS 3 lignes.
SELECT * FROM mytable WHERE gender != 'M' OR gender IS NULL
renverra les 3 lignes attendues.
Modifier :pour certaines applications, en utilisant 0
(ou, à Dieu ne plaise, un autre "nombre magique") au lieu de NULL
n'est même pas conseillé (les unités ou les valeurs exactes ne sont pas pertinentes dans cet exemple) :
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
Ici, le NULL
le 6 janvier signifie "valeur inconnue" - peut-être parce que la température était si basse que la sonde du thermomètre a cessé de répondre. Cependant, sa signification est complètement différente de celle du 3 janvier, lorsque la température était de 0
, c'est-à-dire 0 degré.
De plus, comme @Bill Karwin le mentionne, les NULL se comportent spécialement dans les fonctions d'agrégation (COUNT
,SUM
,AVG
etc.) :calcul AVG(Temperature)
sur les données ci-dessus vous donnerait -14.5
, car la ligne NULL est ignorée.