0Pricing
SQL Interview Prep · Aula

IS NULL, IS NOT NULL e igualdade segura para NULL

Teste corretamente NULL e conheça os operadores seguros para NULL de cada dialeto.

IS NULL, IS NOT NULL e igualdade segura para NULL é uma aula grátis de SQL Interview Prep 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 Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.

Como testar NULL corretamente

A lição anterior mostrou que você não pode usar = para encontrar NULL. Então, como fazer isso? Com os predicados dedicados IS NULL e IS NOT NULL.

Estas são as únicas formas corretas e portáveis de verificar valores ausentes, e os entrevistadores rejeitarão col = NULL sempre que o virem.

Esta lição aborda IS NULL, IS NOT NULL, a família IS DISTINCT FROM e os operadores de igualdade específicos de cada dialeto que tratam NULL com segurança. Conhecer as diferenças entre bancos de dados é um forte sinal de experiência avançada.

IS NULL e IS NOT NULL

IS NULL retorna TRUE quando o valor é NULL e FALSE nos demais casos. O mais importante é que nunca retorna UNKNOWN, portanto é seguro usá-lo diretamente em WHERE.

IS NOT NULL é seu complemento exato: TRUE para qualquer valor existente, FALSE para NULL.

Esses predicados são a base do tratamento de NULL. Eles fazem parte do SQL padrão e funcionam de forma idêntica em MySQL, Postgres, SQL Server, Oracle e SQLite.

-- Find employees with no recorded bonus
SELECT name FROM employees WHERE bonus IS NULL;

-- Find employees that do have a bonus
SELECT name FROM employees WHERE bonus IS NOT NULL;

Por que col = NULL está sempre errado

Uma armadilha garantida em entrevistas: um candidato escreve WHERE bonus = NULL esperando encontrar bonificações ausentes. A consulta retorna zero linhas.

Lembre-se da lógica de três valores: bonus = NULL é UNKNOWN para todas as linhas, inclusive as que contêm NULL, porque nada é igual a algo desconhecido. WHERE mantém somente TRUE, portanto nada corresponde.

Alguns bancos de dados, em modos fora do padrão, reescrevem silenciosamente = NULL como IS NULL, mas você nunca deve depender disso. Sempre escreva IS NULL explicitamente.

-- WRONG: returns zero rows, bonus = NULL is UNKNOWN for all
SELECT name FROM employees WHERE bonus = NULL;

-- RIGHT:
SELECT name FROM employees WHERE bonus IS NULL;

Contando valores NULL e não NULL

Uma tarefa comum de analistas é auditar a qualidade dos dados: quão completa está uma coluna? Combine IS NULL com COUNT para informar os valores ausentes.

Observe o contraste: COUNT(*) conta todas as linhas, enquanto COUNT(bonus) conta apenas as bonificações não NULL. A diferença entre ambos equivale à quantidade de valores NULL, um fato que retomaremos na lição sobre agregações.

SELECT
  COUNT(*)                                AS total_rows,
  COUNT(bonus)                            AS with_bonus,
  COUNT(*) - COUNT(bonus)                 AS missing_bonus,
  SUM(CASE WHEN bonus IS NULL THEN 1 ELSE 0 END) AS missing_check
FROM employees;

O problema que a igualdade segura para NULL resolve

Suponha que você queira comparar duas colunas e considerar “ambas NULL” como uma correspondência. A simples a = b falha: quando ambas são NULL, o resultado é UNKNOWN, então o par é excluído, embora intuitivamente sejam “iguais”.

Isso ocorre ao comparar uma linha antiga com uma nova para detectar alterações ou ao fazer uma junção em colunas opcionais. Você precisa de uma comparação em que NULL igual a NULL resulte em TRUE e NULL em comparação com um valor resulte em FALSE. É isso que a igualdade segura para NULL oferece.

-- Goal: change-detection where two NULLs count as equal
-- Plain equality fails when both sides are NULL:
--   NULL = NULL -> UNKNOWN (treated as not-equal)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note = n.note;  -- misses rows where both notes are NULL

IS DISTINCT FROM (SQL padrão)

A comparação segura para NULL do padrão ANSI é IS DISTINCT FROM e seu inverso IS NOT DISTINCT FROM. Elas são compatíveis com Postgres, SQL Server (2022+) e outros bancos.

  • a IS NOT DISTINCT FROM b significa “iguais, considerando NULL = NULL como igualdade”.
  • a IS DISTINCT FROM b significa “diferentes, tratando NULL como um valor normal”.

Essas expressões sempre retornam TRUE ou FALSE, nunca UNKNOWN, portanto são seguras em qualquer lugar que aceite um predicado.

-- TRUE when notes match, including both NULL
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS NOT DISTINCT FROM n.note;

-- TRUE when notes differ (NULL vs value counts as different)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS DISTINCT FROM n.note;

Operador <=> do MySQL

O MySQL oferece um operador compacto de igualdade segura para NULL, escrito como <=> (o operador nave espacial).

a <=> b retorna 1 (TRUE) quando os dois lados são iguais ou ambos são NULL, e 0 (FALSE) caso contrário. É o equivalente no MySQL a IS NOT DISTINCT FROM.

Se o entrevistador pedir uma correspondência segura para NULL especificamente no MySQL, esta é a resposta idiomática.

-- MySQL: 1 when both equal or both NULL
SELECT (NULL <=> NULL) AS both_null,   -- 1
       (NULL <=> 5)    AS null_vs_val, -- 0
       (5 <=> 5)       AS val_eq;      -- 1

SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note <=> n.note;

Folha de consulta rápida entre dialetos

Os entrevistadores valorizam candidatos que conhecem os limites de portabilidade. Veja o mapa de igualdade segura para NULL:

  • ANSI / Postgres / SQL Server 2022+: IS NOT DISTINCT FROM
  • MySQL / MariaDB: <=>
  • SQLite: IS e IS NOT funcionam como igualdade segura para NULL
  • Oracle: não há operador nativo; emule-o com DECODE(a, b, 1, 0) = 1 ou truques com COALESCE

Quando não tiver certeza de qual mecanismo está sendo usado, use como alternativa a forma manual portável mostrada a seguir.

-- SQLite NULL-safe equality
SELECT * FROM t WHERE a IS b;      -- TRUE when both NULL
SELECT * FROM t WHERE a IS NOT b;  -- complement

Correspondência manual portável e segura para NULL

Quando não houver um operador nativo disponível, você poderá construir uma igualdade segura para NULL a partir de elementos básicos. O padrão portável combina uma igualdade normal com uma cláusula explícita para o caso em que ambos sejam NULL.

Leia assim: “são iguais, OR ambos estão ausentes”. Isso funciona em todos os bancos de dados, o que faz dele uma ótima resposta quando o entrevistador não especifica um dialeto.

SELECT *
FROM old_t o JOIN new_t n ON o.id = n.id
WHERE (o.note = n.note)
   OR (o.note IS NULL AND n.note IS NULL);

-- Alternative using COALESCE with a sentinel that
-- cannot occur in real data:
-- WHERE COALESCE(o.note, '##NULL##') = COALESCE(n.note, '##NULL##')

Exemplo mais aprofundado: chaves de JOIN seguras para NULL

Uma armadilha realista: fazer um JOIN usando uma chave que aceita NULL. Se region puder ser NULL nos dois lados, um JOIN comum por igualdade eliminará silenciosamente esses pares, porque NULL = NULL é UNKNOWN.

Se a regra de negócio for “linhas sem região ainda devem corresponder a outras linhas sem região”, você deverá tornar a condição do JOIN segura para NULL. Declare essa suposição explicitamente na entrevista e escolha o operador correspondente ao mecanismo.

-- Postgres / ANSI: match including both-NULL regions
SELECT a.id, b.id
FROM table_a a
JOIN table_b b
  ON a.region IS NOT DISTINCT FROM b.region;

-- MySQL equivalent: ON a.region <=> b.region

Pontos para abordar na entrevista

Para responder de forma clara a qualquer pergunta sobre testes de NULL:

  • Use sempre IS NULL / IS NOT NULL; nunca use = NULL.
  • Esses predicados retornam apenas TRUE ou FALSE, portanto são seguros em WHERE.
  • Para fazer a correspondência “NULL é igual a NULL”, use IS NOT DISTINCT FROM (ANSI) ou <=> (MySQL).
  • Declare qual dialeto você está utilizando; quando não tiver certeza, ofereça como alternativa a cláusula OR portável.

Mencionar tanto o operador padrão quanto o do fornecedor demonstra uma abrangência que chama a atenção dos entrevistadores.

Verificação rápida

Escolha a comparação correta e segura para NULL.

Recapitulação

Agora você sabe testar NULL corretamente:

  • IS NULL / IS NOT NULL são os únicos testes portáveis corretos para NULL; eles nunca retornam UNKNOWN.
  • col = NULL sempre retorna zero linhas; é uma armadilha clássica de entrevistas.
  • A igualdade segura para NULL trata dois NULL como iguais: IS NOT DISTINCT FROM (ANSI/Postgres), <=> (MySQL), IS (SQLite).
  • Quando não houver um operador, use (a = b) OR (a IS NULL AND b IS NULL).

A seguir: substituir valores padrão para NULL com COALESCE, NULLIF e funções específicas de cada fornecedor, como ISNULL.

Perguntas Frequentes

A aula “IS NULL, IS NOT NULL e igualdade segura para NULL” é grátis?

Sim — o texto completo de “IS NULL, IS NOT NULL e igualdade segura para 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 Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.

O que vou aprender em “IS NULL, IS NOT NULL e igualdade segura para NULL”?

Teste corretamente NULL e conheça os operadores seguros para NULL de cada dialeto. Você pratica SQL Interview Prep 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 Interview Prep?

Nenhuma experiência prévia é necessária. SQL Interview Prep 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, IS NOT NULL e igualdade segura para 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 Interview Prep?

Sim. Cada aula de SQL Interview Prep 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

  1. Lógica de três valores e UNKNOWN
  2. IS NULL, IS NOT NULL e igualdade segura para NULL
  3. COALESCE, NULLIF e ISNULL
  4. NULLs em agregações, junções e DISTINCT
← Voltar para SQL Interview Prep