Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Agrupación por selección Fundamentos de SQL

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:

  1. Toma todos los registros con el mismo valor del campo indicado (por ejemplo, user_id).
  2. Los agrupa.
  3. 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;

Cómo funciona group by

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 BY agrupa 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 BY o tengan una función agregada aplicada.
  • Los alias (AS) ayudan a que tus resultados sean más claros y legibles.

Materiales adicionales

  1. GROUP BY / PostgreSQL (en inglés)

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.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY