Por que = NULL nunca funciona no SQL (e o que usar no lugar)
Você escreve isso, roda, e não vem nada:
SELECT nome
FROM clientes
WHERE telefone = NULL
Os dados estão lá. Tem cliente sem telefone. Mas a query devolve zero linhas. Por quê?
NULL não é um valor. É a ausência de valor.
No SQL, NULL significa “desconhecido”. E você não consegue comparar nada com “desconhecido” usando =.
Pensa assim: se eu te pergunto “a idade do João é igual à idade da Maria?” e você não sabe nenhuma das duas, a resposta não é “sim” nem “não” — é “não dá pra saber”.
O SQL trata isso do mesmo jeito. Qualquer comparação com NULL usando = não retorna nem verdadeiro nem falso: retorna NULL (desconhecido). E o WHERE só deixa passar o que é verdadeiro. Resultado: nada passa.
-- tudo isso retorna NULL, nunca TRUE:
telefone = NULL
telefone <> NULL
NULL = NULL
Sim — até NULL = NULL é “desconhecido”. Dois valores desconhecidos não são, necessariamente, iguais.
O jeito certo: IS NULL e IS NOT NULL
Pra testar ausência de valor, existe um operador próprio:
SELECT nome
FROM clientes
WHERE telefone IS NULL
E pra pegar quem tem telefone:
SELECT nome
FROM clientes
WHERE telefone IS NOT NULL
Onde isso te morde de verdade
Esse erro raramente quebra a query — ela roda, não dá aviso, só devolve um número errado. Em análise de clientes inativos, de churn, de cadastros incompletos, um = NULL esquecido faz você concluir que “não tem nenhum caso” quando, na verdade, a query está silenciosamente errada.
Pra lembrar
= NULLe<> NULLnunca retornam verdadeiro.- Use
IS NULL/IS NOT NULLpra testar ausência de valor. - Desconfie sempre que uma query “deveria ter retorno” e veio vazia.