- El problema inicial
- La solución: GROUP BY
- Alias para columnas
- ¿Qué pasa si intento agregar otra columna?
- Cómo funciona GROUP BY
- Corrigiendo la consulta
Imagina que queremos saber cuántos cursos ha tomado cada estudiante en nuestra escuela en línea. A primera vista, parece sencillo: solo necesitamos contar las inscripciones en la tabla course_members. Pero si tenemos cientos de estudiantes, hacerlo uno por uno sería una locura 😅
En esta lección aprenderás cómo resolverlo fácilmente con el operador GROUP BY.
El problema inicial
Primero, seleccionemos todos los identificadores de usuarios únicos que aparecen en la tabla course_members:
SELECT DISTINCT user_id
FROM course_members
ORDER BY user_id;
Ver en DB Fiddle
Hasta aquí bien: sabemos quiénes se inscribieron. Pero si queremos contar cuántos cursos ha tomado cada usuario, podríamos intentar hacerlo así:
SELECT COUNT(*) FROM course_members WHERE user_id = 2;
SELECT COUNT(*) FROM course_members WHERE user_id = 3;
-- Y así sucesivamente...
Ver en DB Fiddle
💡 El problema es que tendríamos que escribir una consulta para cada estudiante, y eso es inviable si hay muchos.
La solución: GROUP BY
Nos permite agrupar filas con valores iguales (por ejemplo, por user_id) y aplicar una función agregada sobre cada grupo. En nuestro caso: agrupar por usuario y contar cuántos registros (cursos) tiene cada uno.
SELECT
user_id,
COUNT(*)
FROM course_members
GROUP BY user_id
ORDER BY user_id;
Ver resultado
| user_id | count |
|---|---|
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 5 | 3 |
| 9 | 1 |
✨ En una sola consulta, conseguimos lo mismo que antes hacíamos con muchas. Cada fila del resultado representa un grupo: un usuario y su cantidad de cursos.
Ver en DB Fiddle
Alias para columnas
El sistema asigna automáticamente a la segunda columna el nombre count. Podemos hacerla más legible con alias, usando la palabra clave AS.
SELECT
user_id AS student,
COUNT(*) AS courses_count
FROM course_members
GROUP BY user_id
ORDER BY user_id;
Ver resultado
| student | courses_count |
|---|---|
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 5 | 3 |
| 9 | 1 |
| ... |
Ver en DB Fiddle
Los alias hacen que tus consultas sean más claras, sobre todo cuando trabajas con reportes. Solo recuerda: los nombres no pueden tener espacios ni comenzar con un número.
¿Qué pasa si intento agregar otra columna?
Veamos qué ocurre si añadimos created_at (fecha de registro) a la misma consulta:
SELECT
user_id AS student,
created_at,
COUNT(user_id) AS courses_count
FROM course_members
GROUP BY user_id
ORDER BY user_id;
Esto provocará un error ⛔️
Query Error: column "course_members.created_at" must appear in the GROUP BY clause
or be used in an aggregate function
El error nos dice que el SGBD no sabe qué hacer con created_at: hay varias fechas diferentes dentro del mismo grupo, y no se puede mostrar “una sola”.
Cómo funciona GROUP BY
Cuando usas GROUP BY, la base de datos:
- Toma todos los registros con el mismo valor del campo indicado (por ejemplo,
user_id). - Los agrupa.
- Aplica las funciones agregadas (
COUNT,MAX,MIN,AVG, etc.) sobre cada grupo.
👉 Solo puedes mostrar:
- El campo por el que agrupas (porque es igual en todo el grupo).
- O campos sobre los que aplicas funciones agregadas.
Por eso el ejemplo anterior fallaba: queríamos mostrar created_at, pero sin decirle a SQL cómo combinar varios valores distintos.
Corrigiendo la consulta
Supongamos que queremos saber la fecha del último curso de cada estudiante. Podemos usar MAX(created_at) para obtener la más reciente.
SELECT
user_id AS student,
COUNT(user_id) AS courses_count,
MAX(created_at) AS last_reg
FROM course_members
GROUP BY user_id
ORDER BY user_id;
Ver en DB Fiddle
💡 Ahora sí funciona, porque la base sabe qué hacer con los valores de created_at: de todos los que hay en el grupo, toma el más reciente (MAX).
Resumen
GROUP BYagrupa filas con valores iguales en una o más columnas.- Se usa junto con funciones agregadas (
COUNT,SUM,AVG,MAX,MIN). - Solo puedes mostrar columnas que estén en el
GROUP BYo tengan una función agregada aplicada. - Los alias (
AS) ayudan a que tus resultados sean más claros y legibles.
Materiales adicionales
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.