O comando HAVING é utilizado para filtrar resultados após um agrupamento realizado com GROUP BY.
Diferente do WHERE, que filtra registros antes do agrupamento, o HAVING filtra os grupos já calculados.
SELECT coluna,
FUNÇÃO_AGREGACAO(coluna)
FROM tabela
GROUP BY coluna
HAVING condição;
VENDAS
+----+----------+--------+
| ID | Cliente | Valor |
+----+----------+--------+
| 1 | Ana | 500 |
| 2 | Carlos | 700 |
| 3 | Ana | 300 |
| 4 | Pedro | 200 |
+----+----------+--------+
SELECT
cliente,
SUM(valor)
FROM vendas
GROUP BY cliente;
Retorna todos os clientes agrupados.
SELECT
cliente,
SUM(valor) AS total
FROM vendas
GROUP BY cliente
HAVING total > 500;
Retorna apenas clientes com compras superiores a 500.
SELECT
cidade,
COUNT(*) AS quantidade
FROM clientes
GROUP BY cidade
HAVING quantidade > 10;
Mostra apenas cidades com mais de 10 clientes.
SELECT
departamento,
AVG(salario) AS media
FROM funcionarios
GROUP BY departamento
HAVING media > 5000;
Exibe departamentos com média salarial acima do valor informado.
| WHERE | HAVING |
|---|---|
| Filtra registros individuais | Filtra grupos |
| Executado antes do GROUP BY | Executado após GROUP BY |
| Não usa agregações normalmente | Usado com COUNT, SUM, AVG |
SELECT
categoria,
COUNT(*) AS produtos,
AVG(preco) AS media_preco
FROM produtos
GROUP BY categoria
HAVING produtos > 5;
Exibe categorias com mais de cinco produtos cadastrados.
| Sistema | Utilização |
|---|---|
| E-commerce | Categorias com maior venda |
| Financeiro | Clientes com alto faturamento |
| RH | Departamentos com maior média salarial |
| CRM | Regiões com muitos clientes |
| Erro | Problema |
|---|---|
| Usar HAVING sem GROUP BY | Consulta incorreta |
| Usar WHERE com agregações | Erro de lógica |
| Aplicar filtro no lugar errado | Resultado incorreto |
| Esquecer função agregadora | Grupo inválido |