CodeGym /Cursos /SQL SELF /Erros comuns ao trabalhar com NULL

Erros comuns ao trabalhar com NULL

SQL SELF
Nível 10 , Lição 4
Disponível

Nessa aula a gente vai conhecer melhor aquele velho conhecido misterioso, o NULL. Claro, seus próprios erros com ele ainda estão por vir, mas... quem avisa, amigo é. Bora ver alguns erros clássicos envolvendo o NULL.

Erro 1: Usar o operador = pra checar NULL

Provavelmente o erro mais famoso entre quem tá começando em SQL é tentar usar o operador = pra ver se um valor é NULL.

O que acontece?

SELECT *
FROM students
WHERE age = NULL;

Achando que isso vai mostrar todos os estudantes com idade indefinida, você vai se decepcionar: essa query não retorna nada. Por quê? Porque NULL não é um valor, então operadores de comparação normais não funcionam com ele. Como diz o livro mágico do SQL: "NULL não pode ser comparado diretamente com nada".

Como deveria ser?

Pra checar se um valor é NULL, usa IS NULL:

SELECT *
FROM students
WHERE age IS NULL;

Agora sim, você pega todos os estudantes cuja idade não foi informada.

Erro 2: Funções agregadas ignoram NULL (menos COUNT(*))

Quando você faz queries com funções agregadas, o NULL é automaticamente ignorado nos cálculos. Isso pode dar uns resultados meio doidos.

O que acontece?

SELECT AVG(salary) AS avg_salary
FROM employees;

Se a coluna salary tiver NULL, essas linhas são simplesmente ignoradas, e a média vai ser calculada sem considerar esses registros. Isso pode dar uma ideia errada do salário médio.

Como evitar?

Antes de fazer agregação, garante que você tá trocando NULL por um valor padrão. Por exemplo, usa COALESCE():

SELECT AVG(COALESCE(salary, 0)) AS avg_salary
FROM employees;

Agora os valores NULL vão virar 0 antes do cálculo.

Erro 3: Comparar NULL com outro NULL

No banco de dados, NULL não é igual a nada, nem mesmo a outro NULL. Isso pode surpreender.

O que acontece?

SELECT *
FROM students
WHERE NULL = NULL;

Essa query também retorna vazio. Por quê? Porque o SQL acha que a ausência de um valor não pode ser "igual" à ausência de outro. Pois é, SQL é quase filosofia.

Como deveria ser?

Se você precisa checar se dois campos são NULL, usa construções tipo IS NULL. Por exemplo:

SELECT *
FROM students
WHERE first_name IS NULL AND last_name IS NULL;

Erro 4: Divisão por NULL

Dividir por NULL não é só erro, é quase um crime matemático, que o SQL pune com um resultado sem sentido: NULL.

O que acontece?

SELECT 10 / NULL AS result;

O resultado? NULL. O SQL nem tenta entender o que você quis fazer.

Como evitar?

Pra não cair nessa, usa COALESCE() ou NULLIF():

SELECT 10 / COALESCE(divisor, 1) AS result
FROM calculations;

Nessa query, se divisor for NULL, ao invés de dividir por NULL, vai dividir por 1.

Erro 5: Operadores lógicos bugados com NULL

NULL quebra a lógica assim que aparece nas expressões. Por exemplo, a condição TRUE AND NULL retorna NULL, não TRUE nem FALSE.

O que acontece?

SELECT *
FROM students
WHERE age > 18 OR age = NULL;

Nesse caso, mesmo que age > 18 seja verdadeiro pra alguns registros, algumas linhas com NULL na coluna age podem ficar de fora do resultado. Por quê? Porque a parte age = NULL vai retornar NULL, não TRUE.

Como deveria ser?

Sempre trata explicitamente os valores NULL nas condições lógicas:

SELECT *
FROM students
WHERE age > 18 OR age IS NULL;

Erro 6: Comportamento inesperado ao ordenar NULL (o erro mais "pesado")

Se você usa ORDER BY numa query, o comportamento do NULL pode te surpreender. Por padrão, o PostgreSQL coloca as linhas com NULL no final quando ordena crescente, e no começo quando ordena decrescente.

O que acontece?

SELECT product_name, price
FROM products
ORDER BY price;

Se price tiver NULL, essas linhas vão aparecer no final da lista.

Como evitar surpresas?

Você pode dizer explicitamente como ordenar os NULL usando NULLS FIRST ou NULLS LAST:

SELECT product_name, price
FROM products
ORDER BY price NULLS FIRST;

Erro 7: Trabalhar errado com chaves estrangeiras e NULL

Valores NULL em colunas de chave estrangeira podem causar uns comportamentos inesperados às vezes.

O que acontece?

Se você colocou chaves estrangeiras numa tabela e tenta inserir uma linha deixando o campo da chave estrangeira vazio, o PostgreSQL nem liga. Isso acontece porque valores NULL não são checados nas tabelas relacionadas.

Como trabalhar certo?

Usa restrições NOT NULL se quiser garantir que não vai ter NULL nesses campos. Ou só lembra que valores NULL ficam "órfãos", sem pertencer a nenhuma tabela relacionada.

Mais sobre tabelas relacionadas e chaves estrangeiras você vai ver na próxima aula :P

1
Pesquisa/teste
Expressões condicionais, nível 10, lição 4
Indisponível
Expressões condicionais
Expressões condicionais
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION