> lección 14/18 · 16 min

Subconsultas en FROM

Concepto

A veces necesitas trabajar sobre un resumen, no sobre la tabla original: primero calcular algo por grupo y después filtrar, unir u ordenar ese resultado. Una subconsulta en FROM funciona como una tabla temporal hecha con otra consulta.

Sintaxis
SELECT r.columna
FROM (SELECT ... GROUP BY ...) AS r
WHERE r.columna > valor;

1. El resumen. Escribe y ejecuta primero la consulta que agrupa.

SELECT estudiante_id, COUNT(*) AS cursos_tomados FROM inscripciones GROUP BY estudiante_id;

2. Usarlo como tabla. Entre paréntesis, en el FROM, con un alias obligatorio. Desde afuera, sus columnas se leen como las de cualquier tabla: r.cursos_tomados.

SELECT r.estudiante_id, r.cursos_tomados
FROM (SELECT estudiante_id, COUNT(*) AS cursos_tomados FROM inscripciones GROUP BY estudiante_id) AS r
WHERE r.cursos_tomados >= 2;

3. Unirlo con otra tabla. El resumen tiene ids; para mostrar nombres, se une con un JOIN como cualquier tabla.

SELECT e.nombre, r.cursos_tomados
FROM (SELECT estudiante_id, COUNT(*) AS cursos_tomados FROM inscripciones GROUP BY estudiante_id) AS r
JOIN estudiantes AS e ON e.id = r.estudiante_id
WHERE r.cursos_tomados >= 2;

Otra forma de lo mismo. Este filtro también se puede escribir con GROUP BY y HAVING. La subconsulta brilla cuando el resumen se vuelve a usar: unirlo con otra tabla, filtrarlo varias veces o resumirlo de nuevo. En la próxima lección verás WITH, que hace lo mismo y se lee mejor.

> tarea SQL

Lista los cursos con un promedio de 5.5 o más, con el título del curso y su promedio redondeado a 2 decimales. Calcula el promedio por curso en una subconsulta dentro de FROM y únela con cursos para obtener el título.

Tablas disponibles
  • cursos: id, titulo, nivel, horas
  • estudiantes: id, nombre, correo, edad, ciudad
  • inscripciones: id, estudiante_id, curso_id, nota, estado

Primero intenta: las pistas aparecen después de 2 intentos con un resultado incorrecto (los errores de código no cuentan). Llevas 0.

Aprueba las tareas de esta lección para ver el cierre.