SQL desde cero · lección 3 de 6
Dejar de mirar filas sueltas y sacar totales: cuántos robos hay, cuánto botín por ciudad y qué ciudad perdió más.
Hasta ahora cada fila del resultado era una fila de la tabla. Las funciones de agregación hacen otra cosa: resumen muchas filas en un solo número. COUNT(*) cuenta filas, SUM(botin) las suma, y también están AVG, MIN y MAX.
GROUP BY parte la tabla en grupos antes de resumir: GROUP BY ciudad hace un montón por ciudad y calcula el número para cada montón. El resultado tiene una fila por grupo.
La regla que evita casi todos los errores: en el SELECT sólo puede haber columnas que estén en el GROUP BY y funciones de agregación. Y fíjate en la fila con NULL: es un robo del que no hay sospechoso.
robos
| id | sospechoso_id | ciudad | botin |
|---|---|---|---|
| 1 | 2 | Puerto Sal | 1200 |
| 2 | 2 | Puerto Sal | 800 |
| 3 | 4 | San Ciro | 300 |
| 4 | 5 | Puerto Sal | 5000 |
| 5 | 8 | Puerto Sal | 450 |
| 6 | 8 | Bahía Lumen | 950 |
| 7 | 8 | San Ciro | 150 |
| 8 | 1 | Bahía Lumen | 2200 |
| 9 | NULL | Bahía Lumen | 700 |
Puedes escribir aquí mismo: cada ejercicio se ejecuta con DuckDB en tu navegador, sin instalar nada. Con el teclado: Ctrl + Enter.
Cuenta las filas de la tabla robos.
Cambia el * de después de SELECT por COUNT(*).
La ciudad y cuántos robos hubo en cada una.
Sin GROUP BY, DuckDB no sabe qué ciudad poner junto al total. Añade al final: GROUP BY ciudad
La ciudad y la suma del botín en cada una.
Cambia COUNT(*) por SUM(botin).
Sólo la ciudad con más botín y su total.
Ordena por el total, de mayor a menor, y quédate con una fila: ORDER BY SUM(botin) DESC LIMIT 1
Lección terminada.
Lección 4: filtrar grupos con HAVING →