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.