¿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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Función de agregado | una función que resume muchos registros en un valor | COUNT |
| COUNT | cuenta los registros | |
| SUM | suma los valores de un campo | |
| GROUP BY | reúne los registros que tienen el mismo valor en un campo | |
| HAVING | filtra los grupos ya formados | |
| Alias | un nombre que das a una columna del resultado | AS 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
-- 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
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfSe 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
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
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
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
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
| Venta | film | seats | Grupo | SUM(seats) |
|---|---|---|---|---|
| 1 | Cometa | 2 | Cometa | 6 |
| 2 | Cometa | 4 | Cometa | 6 |
| 3 | Mar azul | 1 | Mar azul | 1 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Pruébalo: butacas por película
-- 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
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
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
-- 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?