Cláusula HAVING do MySQL
A cláusula `HAVING` no MySQL é usada para filtrar registros que funcionam em dados agregados retornados por `GROUP BY`. Ele permite que você especifique as condições que determinam quais resultados de grupo serão incluídos na saída.
Uso
A cláusula `HAVING` é aplicada após `GROUP BY` para filtrar dados com base em funções agregadas como `SUM`, `COUNT` ou `AVG`. Ao contrário da cláusula `WHERE`, que não pode operar em dados agregados e é usada para filtragem em nível de linha, a `HAVING` foi projetada especificamente para condições baseadas em agregação.
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING condition;
Nessa sintaxe, `HAVING condition` especifica a condição baseada em agregação para filtrar os resultados agrupados.
Observação: Na ordem de execução das cláusulas SQL, `HAVING` é processado após `GROUP BY` e antes de `ORDER BY`.
Exemplos
1. Uso básico do HAVING
SELECT department, COUNT(employee_id) AS num_employees
FROM employees
GROUP BY department
HAVING num_employees > 5;
Este exemplo recupera departamentos com mais de cinco funcionários usando `HAVING` para filtrar o resultado agregado.
2. Usando HAVING com SUM
SELECT customer_id, SUM(order_total) AS total_spent
FROM orders
GROUP BY customer_id
HAVING total_spent > 1000;
Aqui, a cláusula `HAVING` filtra os clientes que gastaram mais de US$ 1.000 no total.
3. Múltiplas condições em HAVING
SELECT product_category, AVG(price) AS avg_price
FROM products
GROUP BY product_category
HAVING avg_price BETWEEN 100 AND 500 AND COUNT(product_id) > 10;
Este exemplo usa várias condições em `HAVING` para encontrar categorias de produtos com um preço médio entre US$ 100 e US$ 500 e mais de dez produtos.
4. Usando HAVING com ORDER BY
SELECT department, COUNT(employee_id) AS num_employees
FROM employees
GROUP BY department
HAVING num_employees > 5
ORDER BY num_employees DESC;
Este exemplo demonstra como usar `ORDER BY` com `HAVING`, classificando os resultados dos departamentos com mais de cinco funcionários em ordem decrescente pelo número de funcionários.
Dicas e práticas recomendadas
- Use `HAVING` para filtragem agregada. Aplique `HAVING` ao filtrar resultados com base em dados agregados, não para filtragem em nível de linha.
- Combine com `GROUP BY`. Sempre use `HAVING` com `GROUP BY` porque o `HAVING` opera em dados agrupados.
- Otimize com índices. Garanta a execução eficiente da consulta usando índices nas colunas envolvidas em `GROUP BY`.
- Limitar condições complexas. Mantenha as condições de `HAVING` simples para manter o desempenho e a legibilidade.