Qual a diferença entre WHERE e HAVING no SQL?
Os comandos WHERE e HAVING são usados para aplicar filtros em consultas SQL, mas funcionam de maneira diferente.
1. WHERE: Filtrando antes do agrupamento
O WHERE é utilizado para filtrar registros individuais antes do agrupamento. Ele é aplicado diretamente sobre os dados brutos da tabela.
SELECT * FROM pedidos
WHERE valor > 100;
Essa consulta retorna apenas os pedidos cujo valor seja maior que 100, sem necessidade de agrupamento.
2. HAVING: Filtrando depois do agrupamento
O HAVING é utilizado para filtrar registros após um GROUP BY, permitindo que sejam aplicados filtros sobre dados agregados.
SELECT cliente_id, SUM(valor) AS total_gasto
FROM pedidos
GROUP BY cliente_id
HAVING SUM(valor) > 500;
Aqui, a consulta soma os valores de compras por cliente e filtra apenas aqueles que gastaram mais de 500.
Diferença principal entre WHERE e HAVING
| Comando | Funciona antes ou depois do GROUP BY? | Quando usar? |
|---|---|---|
| WHERE | Antes do GROUP BY | Para filtrar registros individuais |
| HAVING | Depois do GROUP BY | Para filtrar dados agregados |
3. Usando WHERE e HAVING juntos
Podemos utilizar WHERE e HAVING na mesma consulta:
SELECT cliente_id, SUM(valor) AS total_gasto
FROM pedidos
WHERE status = 'confirmado' -- Filtrando pedidos antes do agrupamento
GROUP BY cliente_id
HAVING SUM(valor) > 500; -- Filtrando clientes que gastaram mais de 500
Aqui:
- WHERE remove pedidos cancelados antes da agregação.
- HAVING remove clientes com gasto total inferior a 500.
Quando usar WHERE e HAVING no SQL?
Compreender a diferença entre WHERE e HAVING no SQL é essencial para criar consultas eficientes e bem estruturadas. Em um sistema de vendas, WHERE pode ser usado para excluir pedidos cancelados, enquanto HAVING ajuda a filtrar clientes que compraram acima de um determinado valor. O uso correto dessas cláusulas melhora a organização e performance das consultas, tornando a análise de dados mais eficaz.
Algumas aplicações:
- Filtrar pedidos confirmados antes de calcular o faturamento
- Remover produtos descontinuados antes de calcular a média de preços
- Selecionar clientes que gastaram acima de um valor total
- Filtrar departamentos que possuem um número mínimo de funcionários
- Gerar relatórios de vendas eliminando categorias específicas
Dicas para quem está começando
- Use
WHEREpara filtrar registros individuais antes do agrupamento - Use
HAVINGpara filtrar dados agregados após oGROUP BY - Se precisar dos dois filtros, aplique
WHEREantes eHAVINGdepois - Evite usar
HAVINGquando um simplesWHEREfor suficiente - Teste sua consulta sem
HAVINGprimeiro para entender o impacto do agrupamento
Fernando Albuquerque
Especialista em bancos de dados SQL e modelagem de dados complexos.
Mais sobre o autor