Trabalhar com NULL aparece em vários cenários: desde lidar com dados faltando em relatórios até filtrar e ordenar. Se tu tivesse que escolher entre deixar um valor faltando na tabela ou colocar um número estranho tipo 9999, a maioria ia preferir NULL — sim, eu sei que não é o mais prático, mas pelo menos é honesto. Bora ver alguns casos típicos.
Exemplo: ordenando produtos com preços ausentes
Imagina que a gente gerencia uma loja online e tem uma tabela de produtos:
| product_id | name | price |
|---|---|---|
| 1 | Telefone | 45000 |
| 2 | Notebook | NULL |
| 3 | Câmera | 25000 |
| 4 | Relógio inteligente | NULL |
A gente quer ordenar os produtos pelo preço, mas os produtos sem preço (NULL) têm que ficar no final.
SELECT product_id, name, price
FROM products
ORDER BY price ASC NULLS LAST;
Resultado:
| product_id | name | price |
|---|---|---|
| 3 | Câmera | 25000 |
| 1 | Telefone | 45000 |
| 2 | Notebook | NULL |
| 4 | Relógio inteligente | NULL |
Repara na construção chave NULLS LAST. Por padrão, o PostgreSQL no ASC coloca os NULL no começo, mas com esse parâmetro a gente joga eles pro final.
Exemplo: filtrando estudantes sem data de nascimento
A gente tem uma tabela de estudantes e quer pegar só quem não tem data de nascimento informada.
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
Query:
SELECT student_id, name
FROM students
WHERE birth_date IS NULL;
Resultado:
| student_id | name |
|---|---|
| 2 | Anna Song |
| 4 | Maria Chi |
A gente conseguiu puxar a informação dos estudantes que não têm data de nascimento conhecida.
Exemplos de uso de funções pra lidar com NULL
Exemplo: cálculo do valor total considerando possíveis NULL
Na tabela de pedidos ficam os valores dos pedidos. Só que nem sempre os dados estão completos, então a gente precisa considerar que nesses casos o valor pode ser 0.
Exemplo de dados:
| order_id | customer_name | order_amount |
|---|---|---|
| 1 | Alex | 1200 |
| 2 | Maria | 2500 |
| 3 | Max | NULL |
| 4 | Xena | 3100 |
Query:
SELECT SUM(COALESCE(order_amount, 0)) AS total_amount
FROM orders;
Resultado:
| total_amount |
|---|
| 6800 |
A gente usa COALESCE(order_amount, 0) pra trocar NULL por 0 antes de somar. Assim evita erro ou conta errada.
Exemplo: mostrando texto no lugar de NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
No relatório, precisa mostrar o texto "Não informado" pra todos os dados vazios no lugar de NULL.
SELECT
customer_name,
COALESCE(order_amount::TEXT, 'Não informado') AS order_status
FROM orders;
Resultado:
| customer_name | order_status |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | Não informado |
| Xena | 3100 |
COALESCE() deixa mostrar o texto que tu quiser se o valor for NULL.
Cenários mais avançados com NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
O objetivo é ordenar os pedidos de modo que os pedidos sem valor fiquem no começo, e depois do maior pro menor valor.
SELECT customer_name, order_amount
FROM orders
ORDER BY order_amount DESC NULLS FIRST;
Resultado:
| customer_name | order_amount |
|---|---|
| Max | NULL |
| Xena | 3100 |
| Maria | 2500 |
| Alex | 1200 |
Aqui a gente usou NULLS FIRST pra colocar os NULL antes de todo mundo.
Exemplo: filtrando dados e trocando valores NULL
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
Em alguns relatórios, precisa mostrar só as linhas onde o valor tá preenchido ou trocar por "Desconhecido" se for NULL.
SELECT
student_id,
name,
COALESCE(birth_date::TEXT, 'Desconhecido') AS birth_date_info
FROM students;
Resultado:
| student_id | name | birth_date_info |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | Desconhecido |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | Desconhecido |
Isso é muito útil pra relatórios onde é importante mostrar que o dado tá faltando.
Dicas práticas
Trabalhar com NULL exige atenção redobrada. Olha só umas dicas boas:
- Usa
IS NULLeCOALESCE()pra checar e trocar valores ausentes. - Lembra que funções agregadas ignoram
NULL, menos oCOUNT(*). - Pra ordenar, lembra das palavras-chave
NULLS FIRSTeNULLS LAST. - Nos relatórios, sempre diz como tu trata
NULL, pra não dar confusão com a galera.
Essas dicas vão te ajudar não só a escrever queries certas, mas também a impressionar na entrevista. Saber lidar com dados reais sempre vale mais do que só teoria!
GO TO FULL VERSION