PostgreSQL HAVING
A cláusula HAVING no PostgreSQL é usada para filtrar registros que funcionam com funções agregadas. Ela permite que você especifique condições em grupos criados pela cláusula GROUP BY.
Uso
A cláusula HAVING é empregada quando você precisa filtrar grupos de dados em conjunto com funções agregadas como SUM, COUNT, ou AVG. Ela vem depois da cláusula GROUP BY e antes de ORDER BY, se usada.
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING condition;
Nessa sintaxe, o site HAVING condition filtra os resultados retornados pela cláusula GROUP BY com base nos resultados da função agregada. Enquanto WHERE filtra as linhas antes da agregação, HAVING aplica as condições após a agregação.
Exemplos
1. Filtro de grupo básico
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 10;
Essa consulta lista os departamentos com mais de 10 funcionários filtrando grupos criados pela cláusula GROUP BY.
2. Usando SUM com HAVING
SELECT product_id, SUM(quantity)
FROM sales
GROUP BY product_id
HAVING SUM(quantity) > 100;
Aqui, a consulta recupera produtos que venderam mais de 100 unidades, filtrando com base na soma das quantidades.
3. Condição complexa com vários agregados
SELECT manager_id, COUNT(employee_id), AVG(salary)
FROM employees
GROUP BY manager_id
HAVING COUNT(employee_id) > 5 AND AVG(salary) < 70000;
Este exemplo filtra gerentes que supervisionam mais de cinco funcionários e têm um salário médio abaixo de US$ 70.000.
4. HAVING sem GROUP BY
SELECT SUM(quantity)
FROM sales
HAVING SUM(quantity) > 1000;
Este exemplo demonstra o uso do site HAVING sem GROUP BY, filtrando todo o conjunto de dados para descobrir se a quantidade total excede 1.000 unidades.
Dicas e práticas recomendadas
- Use com
GROUP BY.HAVINGfoi projetado para funcionar comGROUP BY; garanta que sua consulta agrupe os dados adequadamente, embora também possa ser usado sem ele para a agregação de todo o conjunto de dados. - Otimize com índices. Considere indexar as colunas usadas na cláusula
GROUP BYpara melhorar o desempenho. - Filtre cedo com
WHERE. Use a cláusulaWHEREpara filtrar as linhas antes da agregação para aumentar a eficiência. - Evite o uso excessivo. Use o site
HAVINGcom moderação, pois a filtragem de resultados agregados pode consumir muitos recursos.