A coluna que não existe e a junção que duplica
Os cinco erros de SQL gerado que mais aparecem, com o código de cada um e a verificação específica que pega.
A IA não conhece o seu schema. Ela conhece schemas parecidos com o seu — e a diferença entre os dois é onde mora o número errado.
- Reconhecer os cinco erros mais comuns em SQL assistido.
- Saber a verificação que pega cada um.
- Fornecer o schema de um jeito que reduza os erros na origem.
1. Coluna ou tabela plausível que não existe
Peça uma consulta de churn e é provável que apareça uma coluna data_cancelamento ou ativo. São nomes muito comuns — e podem não existir no seu banco, onde a mesma informação talvez esteja em status = 3 ou numa tabela de eventos.
Esse é o erro bom: o banco reclama. Custa dois minutos.
2. Junção que multiplica linhas
SELECT p.cliente_id, SUM(p.valor) AS total FROM pedidos p JOIN pedido_itens i ON i.pedido_id = p.id WHERE p.criado_em >= '2026-01-01' GROUP BY p.cliente_id;
Um pedido com 5 itens vira 5 linhas. SUM(p.valor) soma o valor do pedido cinco vezes. O faturamento aparece muito maior — e ninguém estranha, porque números grandes agradam.
SELECT p.cliente_id, SUM(p.valor) AS total
FROM pedidos p
WHERE p.criado_em >= '2026-01-01'
GROUP BY p.cliente_id;
-- Se precisar de dado do item, agregue o item primeiro:
SELECT p.cliente_id, SUM(p.valor) AS total, SUM(i.qtd) AS itens
FROM pedidos p
JOIN (
SELECT pedido_id, SUM(quantidade) AS qtd
FROM pedido_itens GROUP BY pedido_id
) i ON i.pedido_id = p.id
WHERE p.criado_em >= '2026-01-01'
GROUP BY p.cliente_id;Cada pedido continua sendo uma linha. O total do pedido é somado uma vez só.
A diferença: A regra: junção para muitos antes de agregação infla a agregação. Sempre que houver JOIN com SUM/COUNT, pergunte quantas linhas a junção produz por linha da tabela principal.
-- Antes de confiar em qualquer agregação com JOIN:
SELECT COUNT(*) FROM pedidos WHERE criado_em >= '2026-01-01';
-- 3.412
SELECT COUNT(*) FROM pedidos p
JOIN pedido_itens i ON i.pedido_id = p.id
WHERE p.criado_em >= '2026-01-01';
-- 11.847 ← a junção triplicou; qualquer SUM aqui está inflado3. NULL que some da conta em silêncio
| Função | O que faz com NULL | Consequência |
|---|---|---|
AVG(x) | Ignora a linha | Média de um subconjunto, apresentada como do todo |
COUNT(x) | Não conta a linha | Denominador menor que o esperado |
COUNT(*) | Conta a linha | Diferente de COUNT(x) — e a diferença é o número de nulos |
SUM(x) | Ignora a linha | Total menor, sem aviso |
x <> 5 | Não retorna a linha | Filtro "diferente de" exclui os nulos junto |
A última linha é a que mais surpreende: WHERE status <> 5 não traz os pedidos com status nulo. Quem espera "todos menos os cancelados" recebe menos que isso.
4. A janela de data errada
O mesmo problema que existe em código existe aqui, e com impacto maior: BETWEEN com dois extremos fechados conta a fronteira duas vezes em faixas consecutivas, e comparar uma coluna datetime com uma data pura perde as horas do último dia.
WHERE criado_em BETWEEN '2026-03-01' AND '2026-03-31' exclui tudo o que aconteceu depois da meia-noite do dia 31 — quase um dia inteiro de dados. Use sempre >= inicio AND < proximo_inicio.
5. Amostra tratada como população
Um LIMIT 1000 colocado para a consulta rodar rápido durante o desenvolvimento tem o hábito de sobreviver até a versão final. E LIMIT sem ORDER BY não devolve "mil linhas quaisquer": devolve as mil que o banco achou primeiro, que costumam ser as mais antigas ou as de uma partição só.
Escreva a consulta para responder: [pergunta em linguagem natural] Schema real (colado do banco): [cole o CREATE TABLE ou a saída de DESCRIBE das tabelas envolvidas] O que você precisa saber antes: - Volume: [tabela X tem N linhas] - Cardinalidade: [um pedido tem 1..N itens; um cliente tem 0..N pedidos] - Qualidade: [coluna Y tem ~3% de nulos; status 3 = cancelado, 7 = estornado] - Fuso: [criado_em em UTC; o negócio opera em America/Sao_Paulo] Antes da consulta, responda: 1) Quais linhas você está incluindo e excluindo, e por quê 2) Se algum JOIN pode multiplicar linhas, e como você evitou 3) O que acontece com os NULLs nas colunas que você usou Depois, a consulta. E uma segunda consulta de conferência, que valide o resultado por outro caminho.
A "consulta de conferência" é o item mais valioso: obriga a existir um segundo caminho para o mesmo número.
- O schema foi colado, não descrito de memória.
- Contei as linhas antes e depois de cada JOIN.
- Sei quantos nulos existem em cada coluna agregada.
- A faixa de data usa limite superior aberto.
- Nenhum
LIMITde desenvolvimento sobreviveu. - Existe uma segunda consulta que confirma o número por outro caminho.
- Contar as linhas antes e depois do JOIN é a checagem de dez segundos que evita metade dos números inflados.
Comentários e dúvidas
Inscreva-se grátis para comentar, tirar dúvidas, marcar seu progresso e emitir o certificado ao fim do curso.
Inscrever-se grátis com GoogleAinda não há comentários nesta aula.