HAVING em comparação com WHERE
Diferencie HAVING (filtra grupos) de WHERE (filtra linhas) e aplique ambos corretamente na mesma consulta.
HAVING em comparação com WHERE é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
Duas etapas de filtragem
WHERE filtra linhas individuais ANTES do agrupamento. HAVING filtra grupos DEPOIS da agregação. Elas parecem semelhantes, mas atuam em etapas diferentes.
Exemplo de WHERE
WHERE filtra as linhas brutas. Ele não pode acessar agregações:
-- Sum totals for rows where status is 'paid':
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY user_id;Exemplo de HAVING
HAVING filtra grupos. Ele pode fazer referência a agregações:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- only users with ≥ 5 ordersCombine WHERE e HAVING
Ambas podem aparecer na mesma consulta:
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '90 days'
GROUP BY user_id
HAVING SUM(total) > 1000;Não coloque agregações em WHERE
O planejador executa WHERE antes do agrupamento — as agregações ainda não estão disponíveis:
-- WRONG:
SELECT user_id, COUNT(*) FROM orders
WHERE COUNT(*) > 5 -- ERROR
GROUP BY user_id;
-- RIGHT — move to HAVING:
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;Transfira predicados para WHERE quando possível
WHERE filtra antes do agrupamento, portanto menos linhas entram na agregação. Use HAVING apenas para condições que não possam ser expressas em WHERE.
-- Slightly slower (filters after grouping):
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING user_id IN (1,2,3);
-- Faster (filters before grouping):
SELECT user_id, COUNT(*) FROM orders
WHERE user_id IN (1,2,3)
GROUP BY user_id;Ordem lógica de execução
Ordem conceitual:
FROM— escolha as tabelas e faça a junçãoWHERE— filtre as linhasGROUP BY— crie os gruposHAVING— filtre os gruposSELECT— projete as colunasORDER BY— ordeneLIMIT— obtenha os N primeiros resultados
HAVING sem GROUP BY
Você pode usar HAVING sem GROUP BY — a tabela inteira se torna um único grupo:
SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000; -- prints only if total over 1MApelidos em HAVING
Alguns bancos de dados permitem que HAVING faça referência a apelidos de SELECT; PostgreSQL permite, MySQL permite, mas o SQL padrão não. A opção mais portável é repetir a agregação:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- portable
-- HAVING order_count >= 5 -- works in PG / MySQLHAVING com várias agregações
Use HAVING para condições compostas de agregação:
SELECT user_id, COUNT(*) AS orders, SUM(total) AS revenue
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5 AND SUM(total) > 1000;Observação sobre desempenho
Um filtro de agregação em HAVING não pode usar índices da mesma forma que WHERE em uma coluna. Transfira para WHERE tudo o que puder.
Recapitulação
WHERE = filtra linhas. HAVING = filtra grupos.
- Agregações somente em HAVING, nunca em WHERE
- Transfira predicados para WHERE para obter mais velocidade
- Use ambos quando necessário
Verificação rápida
Você quer usuários que tenham feito mais de 10 pedidos. Qual cláusula faz essa filtragem?
Perguntas Frequentes
A aula “HAVING em comparação com WHERE” é grátis?
Sim — o texto completo de “HAVING em comparação com WHERE” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “HAVING em comparação com WHERE”?
Diferencie HAVING (filtra grupos) de WHERE (filtra linhas) e aplique ambos corretamente na mesma consulta. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “HAVING em comparação com WHERE”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- COUNT, SUM, AVG, MIN, MAX
- GROUP BY com uma ou várias colunas
- HAVING em comparação com WHERE
- Armadilhas comuns: valores NULL em agregações