🔹 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 BYy 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.