24. GROUP BY y HAVING en MySQL
📊 Agrupar y filtrar datos en SQL con GROUP BY y HAVING
En este artículo aprenderás a utilizar las cláusulas GROUP BY y HAVING en SQL para agrupar datos y aplicar filtros sobre resultados agregados. Usaremos ejemplos prácticos con una tabla de ventas relacionada a una tabla de productos.
🧱 Creación de la tabla de ventas
Partimos del supuesto de que ya existe una tabla de productos
con su respectiva clave primaria id
. Vamos a crear la tabla ventas
y relacionarla mediante una clave foránea:
USE tiendita;
CREATE TABLE ventas (
id INT AUTO_INCREMENT PRIMARY KEY,
vendedor VARCHAR(50),
id_producto INT,
cantidad INT,
total DECIMAL(10, 2),
FOREIGN KEY (id_producto) REFERENCES productos(id)
);
📌 Insertamos los siguientes datos de ejemplo:
INSERT INTO ventas (vendedor, id_producto, cantidad, total) VALUES
('Ana', 1, 2, 30000.00),
('Luis', 2, 1, 7000.00),
('Ana', 2, 3, 21000.00),
('Pedro', 1, 1, 15000.00),
('Luis', 1, 2, 28000.00),
('Pedro', 2, 2, 14000.00),
('Ana', 3, 4, 32000.00);
---
🧮 Contar ventas por vendedor con GROUP BY y filtrar con HAVING
Ahora queremos saber cuántas ventas ha realizado cada vendedor, pero solo mostrar aquellos que tienen más de 2 ventas.
SELECT vendedor, COUNT(*) AS total_ventas
FROM ventas
GROUP BY vendedor
HAVING COUNT(*) > 2;
🔍 Aquí GROUP BY agrupa las filas por vendedor, y HAVING permite filtrar después del conteo. A diferencia de WHERE
, HAVING
se usa con funciones agregadas como COUNT
, SUM
, etc.
💰 Sumar el total vendido por cada vendedor (y filtrar con HAVING)
En este ejemplo vamos a calcular cuánto ha vendido cada vendedor en total y mostrar solo aquellos cuya suma supere los $30,000.
SELECT vendedor, SUM(total) AS total_vendido
FROM ventas
GROUP BY vendedor
HAVING total_vendido > 30000;
🧠 HAVING total_vendido > 30000
actúa sobre el resultado de la función SUM(total)
. Solo se muestran aquellos vendedores cuya suma de ventas supera esa cantidad.
🎯 Aplicar WHERE junto con GROUP BY y HAVING
En esta consulta, queremos ver las ventas solo de Ana, pero además, que el total vendido por ella sea mayor a $30,000.
SELECT vendedor, SUM(total) AS total_vendido
FROM ventas
WHERE vendedor LIKE "Ana"
GROUP BY vendedor
HAVING total_vendido > 30000;
📌 Aquí combinamos WHERE
y HAVING
:
- WHERE: filtra las filas antes de agruparlas.
- GROUP BY: agrupa solo las filas filtradas.
- HAVING: filtra sobre los datos ya agrupados.
🧠 Conclusión
Las cláusulas GROUP BY
y HAVING
son fundamentales cuando necesitas trabajar con datos agregados como sumas, promedios o conteos. Recuerda:
- ✔️ Usa
WHERE
para filtrar antes de agrupar. - ✔️ Usa
HAVING
para filtrar después de agrupar. - ✔️ Siempre que uses una función agregada (
SUM
,COUNT
, etc.),HAVING
es tu aliado.
🗨️ ¿Quieres practicar más ejemplos con JOINs, subconsultas o filtros más complejos?
Déjame tu comentario aquí abajo y dime qué te gustaría ver en el próximo artículo. ¡Y no olvides seguir el blog para más contenido educativo de bases de datos y SQL! 📚🧠
Comentarios