Ya estás listo para el siguiente paso: trabajar con consultas anidadas en SQL. Hoy vamos a ver qué son, para qué sirven, qué tipos existen y por qué son útiles en la vida real.
Las consultas anidadas (o subconsultas) son consultas SQL que se usan dentro de otras consultas SQL. Es como una matrioshka o una cebolla: tienes una consulta externa y dentro de ella hay otra consulta más pequeña. La subconsulta se ejecuta primero y su resultado lo usa la consulta externa (a veces llamada "principal").
Vamos a verlo con un ejemplo:
Ejemplo 1: Cómo funciona
Tenemos una tabla students con los siguientes datos:
| id | nombre | edad | grupo_id |
|---|---|---|---|
| 1 | Alicia | 20 | 1 |
| 2 | Bob | 22 | 2 |
| 3 | Clark | 21 | 1 |
| 4 | Dina | 23 | 3 |
| 5 | Emilia | 22 | 2 |
Y también una tabla groups, donde se guarda la info sobre los nombres de los grupos:
| id | nombre |
|---|---|
| 1 | Clase de matemáticas |
| 2 | Clase de física |
| 3 | Clase de literatura |
Si queremos saber los nombres de los grupos donde estudian los estudiantes, podemos usar una consulta anidada:
SELECT nombre
FROM groups
WHERE id IN (
SELECT grupo_id
FROM students
WHERE edad > 21
);
¿Qué pasa aquí?
La subconsulta:
SELECT grupo_id
FROM students
WHERE edad > 21
Esta consulta selecciona el grupo_id de todos los estudiantes mayores de 21 años. Resultado: una lista de ids de grupos, por ejemplo [2, 3].
La consulta principal:
SELECT nombre
FROM groups
WHERE id IN ([resultados de la subconsulta])
Esta consulta usa los resultados de la subconsulta y devuelve los nombres de los grupos con id igual a 2 o 3.
Resultado:
Clase de física
Clase de literatura
¿Todavía no te queda claro? Normal. Pero tranqui, ahora lo vamos a desmenuzar todo.
Empecemos con una idea simple: el resultado de una consulta SELECT es como una tabla virtual. De verdad, tiene columnas, tiene filas. ¿No es una tabla?
Y si el resultado de la consulta es una tabla, puedes usarla donde usarías tablas reales: en un JOIN, por ejemplo, o en estructuras más complejas.
No tiene nombre, y eso es un problema. Pero las columnas-expresiones tampoco tienen nombre y lo solucionamos poniéndoles alias — pseudónimos. Lo mismo se puede hacer con las tablas virtuales.
Más detalles en las próximas lecciones — no te hago spoiler :P
¿Por qué molan las consultas anidadas?
Hacen más fáciles las tareas complicadas. A veces una tabla no tiene toda la info que quieres sacar. Las subconsultas te dejan dividir la consulta en dos pasos: primero sacas un resultado intermedio y luego lo usas para obtener los datos finales.
Trabajar con resultados intermedios. Las consultas anidadas son útiles cuando necesitas hacer cálculos extra antes de procesar los datos. Por ejemplo, buscar el valor mínimo o sumar algo.
Mejoran la legibilidad del código. Las subconsultas hacen que el código sea más estructurado, sobre todo si trabajas con tablas grandes y lógica complicada.
Tipos principales de consultas anidadas
Puedes usar subconsultas en diferentes partes de una consulta SQL. Según dónde las pongas, hay varios tipos.
- Subconsultas en
SELECT. La subconsulta está en la lista de columnas y se usa para calcular valores. Esto mola, por ejemplo, para añadir una columna nueva en los resultados.
Ejemplo — añadimos una columna con la edad máxima entre los estudiantes:
SELECT nombre, edad,
(SELECT MAX(edad) FROM students) AS edad_maxima
FROM students;
Resultado:
| nombre | edad | edad_maxima |
|---|---|---|
| Alicia | 20 | 23 |
| Bob | 22 | 23 |
| Clark | 21 | 23 |
| Dina | 23 | 23 |
| Emilia | 22 | 23 |
- Subconsultas en
FROM. La subconsulta se usa como una tabla temporal. Esto es útil si primero necesitas agrupar o transformar los datos.
Ejemplo — calcular la edad media de los estudiantes en cada grupo:
SELECT tmp.grupo_id, tmp.edad_media
FROM (
SELECT grupo_id, AVG(edad) AS edad_media
FROM students
GROUP BY grupo_id
) AS tmp -- Le ponemos el alias tmp a la tabla temporal
WHERE tmp.edad_media > 21;
Resultado:
| grupo_id | edad_media |
|---|---|
| 2 | 22.0 |
| 3 | 23.0 |
- Subconsultas en
WHEREyHAVING. Las subconsultas pueden ser una condición que filtra filas. Esto se usa mucho para comprobar - si existen registros o para comparar valores.
Ejemplo — estudiantes que son mayores que la edad media:
SELECT nombre, edad
FROM students
WHERE edad > (
SELECT AVG(edad)
FROM students
);
Resultado:
| nombre | edad |
|---|---|
| Bob | 22 |
| Dina | 23 |
| Emilia | 22 |
Ventajas de usar consultas anidadas
Más flexibilidad: las consultas anidadas te dejan trabajar con estructuras de datos más complejas.
Dividir tareas en pasos: puedes separar la lógica en subconsultas, lo que hace el código más fácil de leer.
Acceso a datos intermedios: puedes procesar datos "al vuelo", sin tener que crear tablas temporales en la base de datos.
GO TO FULL VERSION