PostgreSQL HAVING
La cláusula HAVING en PostgreSQL se utiliza para filtrar los registros que trabajan con funciones de agregación. Te permite especificar condiciones en los grupos creados por la cláusula GROUP BY.
Utilización
La cláusula HAVING se emplea cuando necesitas filtrar grupos de datos junto con funciones agregadas como SUM, COUNT o AVG. Va después de la cláusula GROUP BY y antes de ORDER BY si se utiliza.
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING condition;
En esta sintaxis, HAVING condition filtra los resultados devueltos por la cláusula GROUP BY basándose en los resultados de la función agregada. Mientras que WHERE filtra las filas antes de la agregación, HAVING aplica las condiciones después de la agregación.
Ejemplos
1. Filtro de grupo básico
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 10;
Esta consulta lista los departamentos con más de 10 empleados filtrando los grupos creados por la cláusula GROUP BY.
2. Utilizar SUMA con HAVING
SELECT product_id, SUM(quantity)
FROM sales
GROUP BY product_id
HAVING SUM(quantity) > 100;
Aquí, la consulta recupera los productos que han vendido más de 100 unidades filtrando en función de la suma de cantidades.
3. Condición compleja con múltiples 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 ejemplo filtra a los directivos que supervisan a más de cinco empleados y tienen un salario medio inferior a 70.000 $.
4. HAVING Sin GROUP BY
SELECT SUM(quantity)
FROM sales
HAVING SUM(quantity) > 1000;
Este ejemplo demuestra el uso de HAVING sin GROUP BY, filtrando todo el conjunto de datos para encontrar si la cantidad total supera las 1000 unidades.
Consejos y buenas prácticas
- Utilízalo con
GROUP BY.HAVINGestá diseñado para funcionar conGROUP BY; asegúrate de que tu consulta agrupa los datos adecuadamente, aunque también puede utilizarse sin él para la agregación de conjuntos de datos completos. - Optimiza con índices. Considera la posibilidad de indexar las columnas utilizadas en la cláusula
GROUP BYpara mejorar el rendimiento. - Filtra pronto con
WHERE. Utiliza la cláusulaWHEREpara filtrar las filas antes de la agregación para mayor eficacia. - Evita el uso excesivo. Utiliza
HAVINGcon moderación, ya que filtrar los resultados agregados puede consumir muchos recursos.