0Pricing
SQL Academy · Aula

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 orders

Combine 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:

  1. FROM — escolha as tabelas e faça a junção
  2. WHERE — filtre as linhas
  3. GROUP BY — crie os grupos
  4. HAVING — filtre os grupos
  5. SELECT — projete as colunas
  6. ORDER BY — ordene
  7. LIMIT — 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 1M

Apelidos 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 / MySQL

HAVING 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

  1. COUNT, SUM, AVG, MIN, MAX
  2. GROUP BY com uma ou várias colunas
  3. HAVING em comparação com WHERE
  4. Armadilhas comuns: valores NULL em agregações
← Voltar para SQL Academy