¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Contar y agrupar datos con GROUP BY

Después de esta lección: Puedo resumir los datos de una tabla con COUNT, SUM y GROUP BY.

Lección de 45 min7 comandosLaboratorio de MySQL y phpMyAdmin con una base de datos de una tienda para practicar SQL

¿Cuántas entradas se vendieron cada día?

El cine del barrio quiere saber qué película vende más. Tiene miles de ventas y nadie va a leerlas una a una.

SQL puede resumir los datos: contar registros, sumar un campo y sacar una media. Con GROUP BY lo hace para cada grupo, por ejemplo cada película.

Al terminar esta lección

Nota

Puedo resumir los datos de una tabla con COUNT, SUM y GROUP BY.

Palabras clave

PalabraQué significaEjemplo
Función de agregadouna función que resume muchos registros en un valorCOUNT
COUNTcuenta los registros
SUMsuma los valores de un campo
GROUP BYreúne los registros que tienen el mismo valor en un campo
HAVINGfiltra los grupos ya formados
Aliasun nombre que das a una columna del resultadoAS total

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

COUNT y SUM resumen muchos registros en uno

Una función de agregado toma muchos registros y devuelve un solo valor. COUNT(*) cuenta los registros. SUM(campo) suma un campo. AVG(campo) calcula la media, MIN el menor y MAX el mayor.

Con AS pones nombre a la columna del resultado.

Pruébalo: contar y sumar las ventas del cine

Código: sql
-- Cuántas ventas hay y cuántas butacas se vendieron.
SELECT COUNT(*) AS ventas, SUM(seats) AS butacas FROM tickets;
-- Añade WHERE day = 'sabado' y ejecútalo otra vez.

Preparar el terminal

Nota

Con el laboratorio iniciado, ejecuta las dos líneas siguientes. Ya las usaste antes, y repetirlas no hace daño.

Aceptar el certificado del servidor

Comando
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnf

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un nombre corto para la tienda

Comando
alias sql='mariadb -h db -u student -pstudent shop -t -e'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Contar los productos

Comando
sql "SELECT COUNT(*) AS products FROM products"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Sumar las existencias de la tienda

Comando
sql "SELECT SUM(stock) AS units FROM products"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

El precio medio de la cocina

Comando
sql "SELECT COUNT(*) AS items, ROUND(AVG(price), 2) AS average FROM products WHERE category_id = 4"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

GROUP BY hace un resumen por cada grupo

Contar todo el cine da un solo número. Pero a menudo quieres una cifra por película. GROUP BY film reúne las ventas de cada película en un grupo.

La función de agregado se calcula para cada grupo. Los campos que muestres sin función tienen que estar en el GROUP BY.

Ejemplo resuelto: butacas de tres ventas, por película

VentafilmseatsGrupoSUM(seats)
1Cometa2Cometa6
2Cometa4Cometa6
3Mar azul1Mar azul1

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Pruébalo: butacas por película

Código: sql
-- Las butacas vendidas de cada película.
SELECT film, SUM(seats) AS butacas
FROM tickets
GROUP BY film
ORDER BY butacas DESC;
-- Cambia SUM(seats) por COUNT(*) y mira qué cuenta ahora.

Productos de cada categoría

Comando
sql "SELECT c.name AS category, COUNT(*) AS products FROM products p JOIN categories c ON c.id = p.category_id GROUP BY c.name ORDER BY products DESC, c.name"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que WHERE filtra también los grupos. No puede: WHERE actúa antes de formar los grupos y no conoce el resultado de COUNT. Para filtrar por un resumen, usa HAVING, después de GROUP BY.

HAVING filtra los grupos ya formados

Imagina que solo te interesan las categorías con cinco productos o más. Primero se forman los grupos y se cuentan. Después HAVING descarta los que no llegan.

El orden de una consulta es: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY.

Categorías con cinco productos o más

Comando
sql "SELECT category_id, COUNT(*) AS products FROM products GROUP BY category_id HAVING COUNT(*) >= 5 ORDER BY category_id"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pruébalo: películas con muchas ventas

Código: sql
-- Solo las películas con más de 3 ventas.
SELECT film, COUNT(*) AS ventas
FROM tickets
GROUP BY film
HAVING COUNT(*) > 3;
-- Cambia el 3 por un 4 y mira qué pasa.

Para ir más lejos: pedidos por cliente

En la tienda, la tabla orders tiene un customer_id por pedido. Escribe una consulta que cuente cuántos pedidos hizo cada cliente.

Después muestra solo los clientes con más de tres pedidos. ¿Cuál va en WHERE y cuál en HAVING?

Sobre este laboratorio y su código: Laboratorio de MySQL y phpMyAdmin con una base de datos de una tienda para practicar SQL

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.