Cláusula HAVING de MySQL
La cláusula `HAVING` de MySQL se utiliza para filtrar registros que trabajan sobre datos agregados devueltos por `GROUP BY`. Te permite especificar las condiciones que determinan qué resultados de grupo se incluyen en la salida.
Utilización
La cláusula `HAVING` se aplica después de `GROUP BY` para filtrar datos basados en funciones agregadas como `SUM`, `COUNT` o `AVG`. A diferencia de la cláusula `WHERE`, que no puede operar sobre datos agregados y se utiliza para filtrar a nivel de fila, `HAVING` está específicamente diseñada para condiciones basadas en agregados.
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING condition;
En esta sintaxis, `Condición de agrupación` especifica la condición basada en la agrupación para filtrar los resultados agrupados.
Nota: En el orden de ejecución de las cláusulas SQL, `HAVING` se procesa después de `GROUP BY` y antes de `ORDER BY`.
Ejemplos
1. Uso básico de HAVING
SELECT department, COUNT(employee_id) AS num_employees
FROM employees
GROUP BY department
HAVING num_employees > 5;
Este ejemplo recupera los departamentos con más de cinco empleados utilizando `HAVING` para filtrar el resultado agregado.
2. Utilizar HAVING con SUM
SELECT customer_id, SUM(order_total) AS total_spent
FROM orders
GROUP BY customer_id
HAVING total_spent > 1000;
Aquí, la cláusula `HAVING` filtra a los clientes que han gastado más de 1000 $ en total.
3. Condiciones múltiples en 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 ejemplo utiliza varias condiciones en `HAVING` para encontrar categorías de productos con un precio medio entre 100 y 500 $ y más de diez productos.
4. Utilizar HAVING con 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 ejemplo demuestra el uso de `ORDENAR POR` con `HAVING`, ordenando los resultados de los departamentos con más de cinco empleados en orden descendente por el número de empleados.
Consejos y buenas prácticas
- Utiliza `HAVING` para el filtrado agregado. Aplica `HAVING` al filtrar resultados basados en datos agregados, no para filtrar a nivel de fila.
- Combínalo con `GRUPO POR`. Utiliza siempre `HAVING` con `GROUP BY` porque `HAVING` opera sobre datos agrupados.
- Optimiza con índices. Garantiza una ejecución eficaz de la consulta utilizando índices en las columnas implicadas en `GROUP BY`.
- Limita las condiciones complejas. Simplifica las condiciones de `HAVING` para mantener el rendimiento y la legibilidad.