Puedes ejecutar cualquier consulta SQL en nuestra consola interactiva: Abrir consola SQL →
HAVING en SQL: filtra grupos después de agrupar
La cláusula HAVING permite filtrar resultados después de usar GROUP BY. WHERE filtra filas; HAVING filtra grupos. Es esencial para reportes y análisis avanzados.
Tabla de contenidos
1. ¿Qué es HAVING?
HAVING se usa para filtrar grupos creados con GROUP BY. Es similar a WHERE, pero WHERE filtra filas y HAVING filtra grupos completos.
SELECT ciudad, COUNT(*)
FROM usuarios
GROUP BY ciudad
HAVING COUNT(*) > 2;
2. Diferencia entre WHERE y HAVING
- WHERE filtra filas antes de agrupar.
- HAVING filtra grupos después de agrupar.
-- Filtra filas
SELECT * FROM usuarios
WHERE edad > 18;
-- Filtra grupos
SELECT ciudad, COUNT(*)
FROM usuarios
GROUP BY ciudad
HAVING COUNT(*) > 2;
3. Uso básico de HAVING
SELECT categoria, SUM(precio)
FROM productos
GROUP BY categoria
HAVING SUM(precio) > 100;
4. HAVING con funciones de agregación
SELECT ciudad, AVG(edad)
FROM usuarios
GROUP BY ciudad
HAVING AVG(edad) > 25;
5. HAVING con múltiples condiciones
SELECT categoria, COUNT(*), SUM(precio)
FROM productos
GROUP BY categoria
HAVING COUNT(*) > 1 AND SUM(precio) > 50;
6. Ejemplos prácticos
SELECT ciudad, COUNT(*) FROM usuarios GROUP BY ciudad HAVING COUNT(*) > 1;
SELECT categoria, SUM(precio) FROM productos GROUP BY categoria HAVING SUM(precio) > 100;
SELECT departamento, AVG(salario) FROM empleados GROUP BY departamento HAVING AVG(salario) > 2000;
7. Ejercicios para practicar
- Filtra ciudades con más de 2 usuarios.
- Filtra categorías con suma de precios mayor a 200.
- Filtra departamentos con más de 3 empleados.
- Filtra grupos cuyo promedio de edad sea mayor a 30.
- Filtra categorías con más de 1 producto y suma mayor a 50.
SELECT ciudad, COUNT(*) FROM usuarios GROUP BY ciudad HAVING COUNT(*) > 2;
SELECT categoria, SUM(precio) FROM productos GROUP BY categoria HAVING SUM(precio) > 200;
SELECT departamento, COUNT(*) FROM empleados GROUP BY departamento HAVING COUNT(*) > 3;
SELECT ciudad, AVG(edad) FROM usuarios GROUP BY ciudad HAVING AVG(edad) > 30;
SELECT categoria, COUNT(*), SUM(precio) FROM productos GROUP BY categoria HAVING COUNT(*) > 1 AND SUM(precio) > 50;
8. Mini‑proyecto: Filtrar ventas por categoría
CREATE TABLE ventas (
id INT PRIMARY KEY,
producto VARCHAR(50),
categoria VARCHAR(50),
precio DECIMAL(10,2)
);
INSERT INTO ventas VALUES (1, 'Camiseta', 'Ropa', 19.99);
INSERT INTO ventas VALUES (2, 'Pantalón', 'Ropa', 29.99);
INSERT INTO ventas VALUES (3, 'Auriculares', 'Electrónica', 49.99);
SELECT categoria,
COUNT(*) AS total_productos,
SUM(precio) AS suma_precios
FROM ventas
GROUP BY categoria
HAVING SUM(precio) > 40;
9. Errores comunes
- Usar WHERE en lugar de HAVING para filtrar grupos.
- No incluir GROUP BY antes de HAVING.
- Aplicar HAVING sin funciones de agregación.
- Confundir COUNT(*) con COUNT(columna).
10. Preguntas frecuentes
¿HAVING reemplaza a WHERE?
No, HAVING filtra grupos; WHERE filtra filas.
¿HAVING siempre requiere GROUP BY?
Sí, HAVING solo funciona después de agrupar.