Voltar para o conteúdo

sql

Dominando Filtros SQL: Quando Usar WHERE vs HAVING Como um Profissional

Descubra como otimizar suas consultas SQL usando WHERE e HAVING de forma eficiente e melhore seu desempenho.

Blast · 06 de mar. de 2026

Resumo rápido

  • Descubra como otimizar suas consultas SQL usando WHERE e HAVING de forma eficiente e melhore seu desempenho.

Dominando Filtros SQL: Quando Usar WHERE vs HAVING Como um Profissional

Entendendo a Diferença Essencial: WHERE vs HAVING

No contexto do SQL, compreender quando utilizar WHERE e HAVING é fundamental para realizar consultas eficientes. Embora aparentem ser similares, essas cláusulas desempenham funções distintas:

  • Cláusula WHERE: Filtra dados antes de qualquer agregação ou agrupamento. Ideal para condições que não envolvem funções de agregação.
  • Cláusula HAVING: Atua após a agregação e agrupamento, permitindo filtrar os resultados agregados.

Exemplo Prático

SELECT departamento, AVG(salario)
FROM empregados
WHERE ativo = 'Y'
GROUP BY departamento
HAVING AVG(salario) > 60000;

Nesse exemplo, somente os funcionários ativos são considerados inicialmente. Em seguida, os departamentos são filtrados com base na média salarial após a agregação.

Configuração de um Mini Conjunto de Dados

ID do FuncionárioNomeDepartamentoSalárioAtivo
1AliceVendas55000Y
2BobMarketing49000Y
3CharlieVendas62000N
4DavidVendas55000Y

Importância das Cláusulas WHERE e HAVING no SQL

Dominar WHERE e HAVING é crucial para consultas eficientes:

  • WHERE: Reduz o volume de dados processados antes da agregação, melhorando o desempenho.
  • HAVING: Aplicável após a agregação, excelente para verificar condições em resultados agrupados.

Receitas SQL

Filtragem Pré-Agregação

Como filtrar funcionários com salário superior a R$50.000 antes da agregação?

SELECT departamento, COUNT(*)
FROM empregados
WHERE salario > 50000
GROUP BY departamento;

Filtragem Pós-Agregação

Como mostrar departamentos com mais de 10 funcionários?

SELECT departamento, COUNT(*)
FROM empregados
GROUP BY departamento
HAVING COUNT(*) > 10;

Combinando WHERE e HAVING

Como identificar departamentos onde a média salarial de funcionários ativos excede R$60.000?

SELECT departamento, AVG(salario) AS media_salarial
FROM empregados
WHERE ativo = 'Y'
GROUP BY departamento
HAVING AVG(salario) > 60000;

Evitando Erros Comuns

Erro 1: Uso Incorreto de HAVING

Incorreto:

SELECT departamento, SUM(salario) FROM empregados HAVING salario > 50000 GROUP BY departamento;

Correto:

SELECT departamento, SUM(salario) FROM empregados WHERE salario > 50000 GROUP BY departamento;

Erro 2: Mistura Inadequada em HAVING

Incorreto:

SELECT departamento FROM empregados GROUP BY departamento HAVING COUNT(id) > 1 AND nome = 'John';

Correto:

SELECT departamento FROM empregados WHERE nome = 'John' GROUP BY departamento HAVING COUNT(id) > 1;

Erro 3: Uso de WHERE com Agregação

Incorreto:

SELECT regiao, AVG(vendas) FROM dados_vendas WHERE AVG(vendas) > 100000 GROUP BY regiao;

Correto:

SELECT regiao, AVG(vendas) FROM dados_vendas GROUP BY regiao HAVING AVG(vendas) > 100000;

Dicas de Desempenho

  • Otimização com WHERE diminui drasticamente os dados processados.
  • Evitar o uso incorreto de HAVING para prevenir lentidão nas consultas.
  • Conhecer particularidades dos dialetos SQL ajuda a otimizar melhor.

Conclusão

Utilizar WHERE e HAVING apropriadamente não é apenas uma técnica, mas um passo essencial para garantir eficiência em consultas SQL. Com essas práticas, é possível otimizar tempo e recursos, entregando resultados precisos de forma rápida.

Perguntas Frequentes (FAQ)

Quando devo usar a cláusula WHERE?

A cláusula WHERE deve ser usada para filtrar registros antes de qualquer operação de agrupamento ou agregação. Isso ajuda a reduzir o volume de dados processados, melhorando a eficiência da consulta.

A cláusula HAVING pode ser usada sem GROUP BY?

Sim, porém é raro e normalmente feito quando se está utilizando agregações em todo o conjunto de dados e se deseja filtrar esses valores.

Qual a principal diferença entre WHERE e HAVING?

WHERE filtra dados antes da agregação, enquanto HAVING faz a filtragem depois. WHERE é ideal para condições que não dependem de cálculos agregados, ao contrário de HAVING.

Advertisement

Advertisement

Sobre o autor

Blast

Colaborador da Blast. Guias praticos sobre dados, analytics e crescimento.

Compartilhar Twitter LinkedIn

Leituras recomendadas