NULLs têm um comportamento especial:comparar qualquer coisa com um NULL retorna um
NULL
, que é algo diferente de false
ou 0
. Significa "desconhecido". Por exemplo, pegue esta tabela:
user_id | gender
------------------
1 | NULL
2 | 'M'
3 | 'F'
4 | 'F'
SELECT * FROM mytable WHERE gender = 'M'
retornará 1 linha, como esperado SELECT * FROM mytable WHERE gender != 'M'
retornará 2 linhas, NÃO 3 linhas. SELECT * FROM mytable WHERE gender != 'M' OR gender IS NULL
retornará as 3 linhas esperadas. Editar:para alguns aplicativos, usando
0
(ou, Deus me livre, outro "número mágico") em vez de NULL
nem é aconselhável (unidades ou valores exatos não são relevantes neste exemplo): 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
Aqui, o
NULL
em 6 de janeiro significa "valor desconhecido" - talvez porque a temperatura estava tão baixa que a sonda do termômetro parou de responder. No entanto, é um significado completamente diferente de 3 de janeiro, quando a temperatura era 0
, ou seja, 0 graus. Além disso, como @Bill Karwin menciona, NULLs se comportam especialmente em funções agregadas (
COUNT
,SUM
,AVG
etc.):calculando AVG(Temperature)
nos dados acima lhe daria -14.5
, pois a linha NULL é ignorada.