IS NULL e IS NOT NULL
Teste corretamente se há valores ausentes.
IS NULL e IS NOT NULL é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
Verificando valores ausentes
Como as comparações com NULL sempre retornam unknown, o SQL oferece dois operadores específicos para verificar valores ausentes: IS NULL e IS NOT NULL.
Essas são as únicas formas confiáveis de encontrar ou excluir valores NULL. Nesta lição, você aprenderá a usá-los corretamente.
-- Rows where phone is missing
SELECT name FROM customers WHERE phone IS NULL;
-- Rows where phone is present
SELECT name FROM customers WHERE phone IS NOT NULL;Por que = NULL falha
É tentador escrever WHERE phone = NULL, mas isso nunca encontra nada. A condição é avaliada como unknown para todas as linhas, e WHERE mantém apenas as linhas verdadeiras.
O resultado é um conjunto vazio — um erro silencioso, pois nenhum erro é gerado.
-- Always returns 0 rows, even if NULLs exist
SELECT * FROM customers WHERE phone = NULL;
-- The fix
SELECT * FROM customers WHERE phone IS NULL;IS NULL em ação
IS NULL retorna true exatamente quando o valor está ausente e false nos demais casos. Ele nunca retorna unknown.
Isso torna o operador seguro para qualquer situação em que você precise de um resultado claro de verdadeiro ou falso.
SELECT id, name, (phone IS NULL) AS missing_phone
FROM customers;
-- id | name | missing_phone
-- ---+-------+--------------
-- 1 | Alice | f
-- 2 | Bob | t
-- 3 | Carol | tIS NOT NULL em ação
IS NOT NULL é exatamente o oposto: true quando o valor está presente e false quando está ausente.
Use-o para filtrar apenas as linhas que realmente têm dados, como os clientes para os quais você pode ligar.
SELECT name, phone
FROM customers
WHERE phone IS NOT NULL;
-- name | phone
-- ------+----------
-- Alice | 555-0101Combinando com AND / OR
Você pode combinar verificações de NULL com outras condições usando AND e OR.
Por exemplo, encontre clientes ativos que ainda precisam informar um número de telefone — uma consulta comum para verificar a qualidade dos dados.
SELECT id, name
FROM customers
WHERE is_active = true
AND phone IS NULL;
-- Active customers missing a phone numberNULL em NOT IN: uma armadilha
NOT IN se comporta de forma problemática quando a lista contém um NULL. Se algum valor do conjunto for NULL, NOT IN poderá retornar unknown para todas as linhas, removendo resultados que você esperava obter.
Prefira NOT EXISTS ou filtre os valores NULL para fora da subconsulta primeiro.
-- Risky: if blocked_ids contains a NULL, this returns nothing
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked);
-- Safer
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked WHERE user_id IS NOT NULL);IS DISTINCT FROM
O PostgreSQL oferece IS DISTINCT FROM e IS NOT DISTINCT FROM — operadores de comparação seguros para NULL.
Ao contrário de =, eles tratam dois valores NULL como iguais e um valor NULL em comparação com um valor como diferente, sempre retornando true ou false, nunca unknown.
SELECT
NULL IS NOT DISTINCT FROM NULL AS a, -- true: both NULL = same
NULL IS DISTINCT FROM 5 AS b, -- true: NULL differs from 5
5 IS DISTINCT FROM 5 AS c; -- false: same valueComparando duas colunas que aceitam NULL
Ao comparar duas colunas que podem ser NULL, o = comum não identifica o caso em que ambas são NULL. IS NOT DISTINCT FROM trata essa situação corretamente.
Isso é ótimo para encontrar linhas que não foram alteradas, mesmo quando o valor é desconhecido.
-- Rows where old and new phone are 'the same',
-- counting NULL = NULL as same
SELECT id
FROM customer_changes
WHERE old_phone IS NOT DISTINCT FROM new_phone;Contando valores NULL
Um uso prático de IS NULL é auditar a qualidade dos dados — contar quantas linhas não têm um valor.
Combine-o com FILTER (PostgreSQL) ou com um CASE dentro de COUNT para contar valores NULL e valores diferentes de NULL lado a lado.
SELECT
count(*) AS total,
count(*) FILTER (WHERE phone IS NULL) AS missing,
count(*) FILTER (WHERE phone IS NOT NULL) AS present
FROM customers;Verificações de NULL em restrições CHECK
Você pode usar verificações de NULL dentro de restrições CHECK para impor regras como "se uma linha foi enviada, ela deve ter uma data de envio".
Observação: uma restrição CHECK é aprovada quando sua condição é true ou unknown, portanto pense cuidadosamente nos casos com NULL.
CREATE TABLE orders (
id integer PRIMARY KEY,
status text NOT NULL,
ship_date date,
CHECK (status <> 'shipped' OR ship_date IS NOT NULL)
);Boas práticas
Adote estes hábitos para evitar problemas com NULL:
- Sempre faça a verificação com
IS NULL/IS NOT NULL, nunca com= NULL. - Tenha cuidado com
NOT INem subconsultas que aceitam NULL. - Use
IS DISTINCT FROMpara obter igualdade segura para NULL. - Audite os dados ausentes com
count(*) FILTER (...).
-- The reliable toolkit
WHERE col IS NULL
WHERE col IS NOT NULL
WHERE a IS DISTINCT FROM b
WHERE a IS NOT DISTINCT FROM bVerificação rápida
Você quer todos os clientes cuja coluna phone não tem valor. Qual cláusula WHERE está correta?
Recapitulação
Você aprendeu a maneira correta de testar valores ausentes com IS NULL e IS NOT NULL, e por que = NULL nunca funciona.
Você também conheceu a armadilha de NOT IN, o operador compatível com NULL IS DISTINCT FROM e como auditar valores NULL com FILTER. A seguir, você aprenderá a substituir valores NULL por padrões adequados usando COALESCE e NULLIF.
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;Perguntas Frequentes
A aula “IS NULL e IS NOT NULL” é grátis?
Sim — o texto completo de “IS NULL e IS NOT NULL” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “IS NULL e IS NOT NULL”?
Teste corretamente se há valores ausentes. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “IS NULL e IS NOT NULL”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- O que NULL realmente significa
- IS NULL e IS NOT NULL
- COALESCE e NULLIF
- NULLs em agregações e junções