🔹 Introducción
- Seleccionar y filtrar datos (
SELECT
,WHERE
,ORDER BY
). - Hacer resúmenes con funciones de agregación (
COUNT
,AVG
,MIN
,MAX
). - Agrupar resultados con
GROUP BY
y filtrarlos conHAVING
. - Combinar tablas con
JOIN
.
Pero hay ocasiones en que necesitamos usar el resultado de una consulta dentro de otra consulta.
Eso se logra con una subconsulta (o subquery).
👉 Una subconsulta es una consulta SQL anidada dentro de otra consulta.
🔹 1. Tipos de subconsultas
Las subconsultas se pueden usar en distintos lugares:
- En la cláusula
WHERE
(para filtrar datos usando el resultado de otra consulta). - En la cláusula
FROM
(como si fuera una tabla temporal). - En la cláusula
SELECT
(para calcular valores adicionales).
🔹 2. Nuestra base de ejemplo
Seguimos con nuestras tablas de alumnos y cursos:
alumnos
id | nombre | edad | ciudad |
---|---|---|---|
1 | Ana | 20 | Buenos Aires |
2 | Juan | 17 | Ciudad de México |
3 | Laura | 22 | Madrid |
4 | Pedro | 18 | Madrid |
cursos
id | curso |
---|---|
1 | Matemáticas |
2 | Historia |
3 | Inglés |
inscripciones
alumno_id | curso_id |
---|---|
1 | 1 |
1 | 3 |
2 | 2 |
3 | 1 |
4 | 3 |
🔹 3. Subconsulta en WHERE
Queremos ver los alumnos que tienen la edad máxima.
Primero:
SELECT MAX(edad) FROM alumnos;
Esto devuelve 22
.
Ahora usamos esa consulta dentro de WHERE
:
SELECT nombre, edad
FROM alumnos
WHERE edad = (SELECT MAX(edad) FROM alumnos);
📊 Resultado esperado:
nombre | edad |
---|---|
Laura | 22 |
🔹 4. Subconsulta en FROM
Podemos usar una subconsulta como tabla temporal.
Ejemplo: obtener la edad promedio por ciudad y luego mostrar solo las que superan 18.
SELECT ciudad, promedio
FROM (
SELECT ciudad, AVG(edad) AS promedio
FROM alumnos
GROUP BY ciudad
) AS sub
WHERE promedio > 18;
📊 Resultado esperado:
ciudad | promedio |
---|---|
Buenos Aires | 20 |
Madrid | 20 |
👉 La subconsulta calcula los promedios.
👉 La consulta principal filtra los que son mayores a 18.
🔹 5. Subconsulta en SELECT
Podemos usar una subconsulta para agregar un valor calculado en cada fila.
Ejemplo: mostrar cada alumno junto con el promedio general de edad:
SELECT nombre, edad,
(SELECT AVG(edad) FROM alumnos) AS promedio_general
FROM alumnos;
📊 Resultado esperado:
nombre | edad | promedio_general |
---|---|---|
Ana | 20 | 19.25 |
Juan | 17 | 19.25 |
Laura | 22 | 19.25 |
Pedro | 18 | 19.25 |
👉 La subconsulta devuelve el promedio una sola vez, pero se repite en cada fila.
🔹 6. Ejemplos prácticos
📌 Ejemplo 1: Mostrar el nombre de los alumnos que están inscriptos en el curso “Inglés”.
SELECT nombre
FROM alumnos
WHERE id IN (
SELECT alumno_id
FROM inscripciones
WHERE curso_id = (
SELECT id FROM cursos WHERE curso = 'Inglés'
)
);
📊 Resultado esperado:
nombre |
---|
Ana |
Pedro |
📌 Ejemplo 2: Mostrar los cursos que tienen más de 1 alumno.
SELECT curso
FROM cursos
WHERE id IN (
SELECT curso_id
FROM inscripciones
GROUP BY curso_id
HAVING COUNT(*) > 1
);
📊 Resultado esperado:
curso |
---|
Matemáticas |
Inglés |
🔹 7. Ejercicio práctico
- Muestra el alumno con la menor edad usando una subconsulta en
WHERE
. - Calcula el promedio de edad por ciudad usando una subconsulta en
FROM
. - Muestra los nombres de los alumnos que están inscriptos en “Matemáticas” usando una subconsulta.
🔹 Soluciones
SELECT nombre, edad
FROM alumnos
WHERE edad = (SELECT MIN(edad) FROM alumnos);
SELECT ciudad, promedio
FROM (
SELECT ciudad, AVG(edad) AS promedio
FROM alumnos
GROUP BY ciudad
) AS sub;
SELECT nombre
FROM alumnos
WHERE id IN (
SELECT alumno_id
FROM inscripciones
WHERE curso_id = (
SELECT id FROM cursos WHERE curso = 'Matemáticas'
)
);
📝 Mini Quiz
Resultados
#1. ¿Qué es una subconsulta en SQL?
#2. ¿Dónde se puede usar una subconsulta?
#3. Si quiero mostrar el alumno más joven usando una subconsulta, ¿qué función necesito?
🔹 Resumen de la lección
- Una subconsulta es una consulta dentro de otra.
- Se puede usar en:
WHERE
→ para comparar valores con resultados de otra consulta.FROM
→ como tabla temporal.SELECT
→ para calcular valores adicionales.
- Son muy útiles cuando necesitamos pasos intermedios sin crear nuevas tablas.
👉 En la próxima lección aprenderás sobre Vistas (Views): consultas guardadas que se comportan como tablas virtuales, ideales para simplificar queries complejas.
⚡ Aprende más practicando con las demás secciones del Curso SQL.