Agregando datos: COUNT, SUM, AVG, MIN y MAX
Las funciones de agregación procesan un conjunto de filas y devuelven un solo valor. Son fundamentales para obtener resúmenes y estadísticas de tus datos.
Funciones disponibles
| Función | Descripción | Ejemplo |
|---|---|---|
COUNT | Cuenta el número de filas | COUNT(*) |
SUM | Suma los valores de una columna | SUM(playtime_hours) |
AVG | Calcula el promedio | AVG(playtime_hours) |
MIN | Devuelve el valor mínimo | MIN(year) |
MAX | Devuelve el valor máximo | MAX(year) |
SELECT COUNT(*) AS total FROM videogames;COUNT(*) vs COUNT(columna)
Esta diferencia es sutil pero importante (y una pregunta clásica en entrevistas técnicas):
COUNT(*)cuenta todas las filas, sin importar si tienen valores NULL o no.COUNT(columna)cuenta solo las filas donde esa columna no es NULL.
SELECT COUNT(*) AS total_filas, COUNT(developer) AS con_developer
FROM videogames;Si hay filas donde developer es NULL, verás que total_filas es mayor que con_developer. Recuerda esta diferencia: puede ahorrarte muchos bugs.
Combinar funciones
Puedes usar varias funciones de agregación en una misma consulta:
SELECT
COUNT(*) AS total,
MIN(year) AS primer_anio,
MAX(year) AS ultimo_anio
FROM videogames;Agregar con filtros
Puedes combinar funciones de agregación con WHERE para calcular sobre un subconjunto:
SELECT AVG(playtime_hours) AS avg_hours
FROM videogames
WHERE year > 2010;GROUP_CONCAT: Concatenar valores
GROUP_CONCAT es una función de agregación que une los valores de una columna en una sola cadena separada por comas. Es perfecta para ver de un vistazo todos los elementos de un grupo:
SELECT developer, GROUP_CONCAT(title) AS juegos
FROM videogames
GROUP BY developer;Esto devuelve algo como: Nintendo → The Legend of Zelda,Super Mario Bros.. Puedes cambiar el separador pasando un segundo argumento: GROUP_CONCAT(title, ' | ').
NULL y las funciones de agregación
Un dato importante: las funciones SUM, AVG, MIN y MAX ignoran los valores NULL automáticamente. Si tienes 10 filas pero 3 tienen NULL en playtime_hours, AVG(playtime_hours) calculará el promedio solo con las 7 filas que sí tienen valor. Esto suele ser el comportamiento deseado, pero conviene saberlo para no llevarte sorpresas con los cálculos.
Nuestra tabla
| id | title | developer | year | playtime_hours |
|---|---|---|---|---|
| 1 | The Legend of Zelda | Nintendo | 1986 | 20 |
| 2 | Super Mario Bros. | Nintendo | 1985 | 10 |
| 3 | Final Fantasy VII | Square Enix | 1997 | 40 |
| 4 | The Witcher 3 | CD Projekt Red | 2015 | 100 |
| 5 | Minecraft | Mojang Studios | 2011 | 9999 |
| 6 | Grand Theft Auto V | Rockstar Games | 2013 | 80 |
| 7 | Dark Souls | FromSoftware | 2011 | 60 |
| 8 | Portal 2 | Valve | 2011 | 8 |
| 9 | Red Dead Redemption 2 | Rockstar Games | 2018 | 70 |
| 10 | The Last of Us | Naughty Dog | 2013 | 15 |
| 11 | Halo: Combat Evolved | Bungie | 2001 | 10 |
| 12 | God of War | Santa Monica Studio | 2018 | 25 |