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

Tags: | | |

0 Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Solicitar exportação de dados

Use este formulário para solicitar uma cópia de seus dados neste site.

Solicitar a remoção de dados

Use este formulário para solicitar a remoção de seus dados neste site.

Solicitar retificação de dados

Use este formulário para solicitar a retificação de seus dados neste site. Aqui você pode corrigir ou atualizar seus dados, por exemplo.

Solicitar cancelamento de inscrição

Use este formulário para solicitar a cancelamento da inscrição do seu e-mail em nossas listas de e-mail.