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.