
Se você já usou WHERE e HAVING, provavelmente já pensou:
“Qual é mesmo a diferença entre os dois?”
E aí vem aquela regra decorada:
- WHERE filtra antes
- HAVING filtra depois
Você até lembra disso.
Mas na prática… ainda erra.
O problema não é saber a diferença
O problema é usar sem entender o momento certo.
Porque essa decisão não é sobre sintaxe.
👉 É sobre quando o dado ainda é detalhe
👉 ou quando ele já virou resumo
Vamos direto para o erro
Imagine que você quer:
Clientes que gastaram mais de 1000
Muita gente tenta assim:
SELECT
ID_CLIENTE,
SUM(VALOR_TOTAL) AS TOTAL
FROM pedido
WHERE SUM(VALOR_TOTAL) > 1000
GROUP BY ID_CLIENTE;E o banco reclama.
Por que isso dá erro
Porque o WHERE acontece antes do GROUP BY.
Ou seja:
- ainda não existe
SUM - ainda não existe total por cliente
- ainda estamos no nível de pedido
👉 Você está tentando filtrar algo que ainda não foi criado.
Onde o HAVING entra
Agora sim:
SELECT
ID_CLIENTE,
SUM(VALOR_TOTAL) AS TOTAL
FROM pedido
GROUP BY ID_CLIENTE
HAVING SUM(VALOR_TOTAL) > 1000;Aqui faz sentido.
Porque:
- primeiro você agrupa
- depois calcula
- depois filtra
Mas aqui vem o erro mais sutil
Muita gente começa a usar HAVING para tudo.
Mesmo quando não precisa.
Exemplo:
SELECT
ID_CLIENTE,
VALOR_TOTAL
FROM pedido
HAVING VALOR_TOTAL > 100;Isso pode até rodar em alguns bancos.
Mas está errado conceitualmente.
👉 Você está usando HAVING sem agregação.
O jeito certo de pensar
Antes de decidir entre WHERE e HAVING, pergunte:
Estou filtrando detalhe ou resumo?
📌 Se for detalhe → WHERE
- linha individual
- antes de agrupar
- nível de registro
📌 Se for resumo → HAVING
- resultado agregado
- depois do GROUP BY
- nível de grupo
O erro real não é WHERE vs HAVING
É não saber:
👉 em que estágio da query você está
Se você não sabe se está lidando com:
- dado bruto ou
- dado agregado
Você começa a usar no chute.
Checklist simples (que resolve)
Antes de escrever:
- Estou filtrando antes ou depois do GROUP BY?
- Esse valor já foi agregado?
- Estou no nível de linha ou de grupo?
- Faz sentido esse filtro existir aqui?
Se você responde isso, não erra mais.
O que isso revela sobre SQL
Esse tipo de erro mostra uma coisa importante:
👉 SQL não é sobre comando
👉 é sobre sequência lógica
Quem entende a ordem:
- erra menos
- escreve melhor
- confia mais
Próximo passo natural
Se você quer parar de errar esse tipo de coisa:
- entender o momento da query
- organizar melhor o raciocínio
- tomar decisão sem chute
🎯 A Arte da Query te coloca exatamente nesses cenários.
Porque no final:
👉 o problema nunca foi WHERE ou HAVING
👉 foi o momento em que você tentou usar cada um
0 Comentários