Los NULL tienen un comportamiento especial:comparar cualquier cosa con un NULL te devuelve un NULL , que es algo más que false o 0 . Significa "desconocido".
Por ejemplo, tome esta tabla:
user_id | gender
------------------
1 | NULL
2 | 'M'
3 | 'F'
4 | 'F'
SELECT * FROM mytable WHERE gender = 'M' devolverá 1 fila, como se esperaba
SELECT * FROM mytable WHERE gender != 'M' devolverá 2 filas, NO 3 filas.
SELECT * FROM mytable WHERE gender != 'M' OR gender IS NULL devolverá las 3 filas esperadas.
Editar:para algunas aplicaciones, usando 0 (o, Dios no lo quiera, otro "número mágico") en lugar de NULL ni siquiera es aconsejable (las unidades o los valores exactos no son relevantes en este ejemplo):
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
Aquí, el NULL el 6 de enero significa "valor desconocido", tal vez porque la temperatura era tan baja que la sonda del termómetro dejó de responder. Sin embargo, tiene un significado completamente diferente al del 3 de enero, cuando la temperatura era 0. , es decir, 0 grados.
Además, como menciona @Bill Karwin, los NULL se comportan especialmente en funciones agregadas (COUNT ,SUM ,AVG etc.):calculando AVG(Temperature) en los datos anteriores le daría -14.5 , ya que se ignora la fila NULL.