Introducción a las subconsultas: consultas anidadas e Inline View
Lección 6.1 · Tiempo de lectura: ~7 min · Tareas de práctica ↓
Una subconsulta SQL te ayuda a dividir un problema en varios pasos dentro de una sola sentencia. En esta lección aprenderás la idea básica de las subconsultas, sus tipos principales y cómo usarlas en SELECT, WHERE y FROM con ejemplos de Sakila.
En las lecciones anteriores ya aprendiste a obtener datos y a combinar tablas con JOIN. Pero en las tareas reales a menudo necesitas calcular primero un resultado intermedio y después usarlo en la consulta principal.
Para eso sirven precisamente las subconsultas: hacen que la lógica SQL avance paso a paso y sea más fácil de razonar.
Qué es una subconsulta
Una subconsulta es una sentencia SELECT anidada dentro de otra consulta SQL. La consulta que la contiene se llama consulta externa.
Una subconsulta siempre se escribe entre paréntesis ().
Cómo se ejecuta una subconsulta
En la mayoría de los casos, el SGBD ejecuta primero la consulta interna. Su resultado se pasa después a la consulta externa, que termina el filtrado o construye el resultado final.
-- Conceptual example
SELECT column_name
FROM table_name
WHERE column_name = (SELECT value FROM another_table);
Nota: primero se calcula la expresión entre paréntesis y después se aplica la condición WHERE externa.
Tipos principales de subconsultas
- Subconsulta escalar: devuelve un solo valor (una fila, una columna).
- Subconsulta de varias filas: devuelve una lista de valores (una columna, muchas filas).
- Subconsulta de tabla (Inline View): devuelve un conjunto de filas y columnas que se usa como tabla temporal.
Subconsulta en SELECT
Puedes poner subconsultas directamente en la lista de SELECT cuando necesitas una métrica adicional junto a las columnas base sin cambiar la granularidad de las filas. Es especialmente útil cuando un JOIN duplicaría filas con facilidad o exigiría una agregación pesada.
Escenario 1: mostrar el último pago de cada cliente (fecha e importe).
SELECT
c.customer_id,
c.first_name,
c.last_name,
(
SELECT p.payment_date
FROM payment AS p
WHERE p.customer_id = c.customer_id
ORDER BY p.payment_date DESC
LIMIT 1
) AS last_payment_date,
(
SELECT p.amount
FROM payment AS p
WHERE p.customer_id = c.customer_id
ORDER BY p.payment_date DESC
LIMIT 1
) AS last_payment_amount
FROM
customer AS c
LIMIT 10;
Resultado: para cada cliente obtienes exactamente un pago, el "último". Con JOIN esto suele ser más complejo: primero calculas la fecha máxima, después vuelves a unir y resuelves los empates.
Escenario 2: mostrar cada pago y su desviación respecto al pago medio de ese cliente.
SELECT
p.payment_id,
p.customer_id,
p.amount,
(
SELECT AVG(p2.amount)
FROM payment AS p2
WHERE p2.customer_id = p.customer_id
) AS customer_avg_amount,
p.amount - (
SELECT AVG(p3.amount)
FROM payment AS p3
WHERE p3.customer_id = p.customer_id
) AS delta_from_customer_avg
FROM
payment AS p
LIMIT 15;
Resultado: cada fila de pago conserva su granularidad original y recibe una referencia por cliente. Con JOIN haría falta una tabla agregada aparte y una unión adicional.
Subconsulta en WHERE
El caso más habitual es una subconsulta dentro de WHERE, cuando el filtrado depende de un valor calculado dinámicamente.
Escenario: encontrar las películas cuyo replacement_cost supera la media de todas las películas.
SELECT
title,
replacement_cost
FROM
film
WHERE
replacement_cost > (
SELECT AVG(replacement_cost)
FROM film
);
Resultado: la consulta interna calcula la media y la externa devuelve las películas por encima de esa media.
Subconsulta en FROM (Inline View)
Cuando una subconsulta está en FROM, se comporta como una tabla temporal dentro de la consulta actual. Este patrón se llama Inline View.
Importante: una Inline View debe tener un alias.
Escenario: obtener los clientes activos y sus pagos.
SELECT
active_cust.first_name,
p.amount
FROM
(
SELECT
customer_id,
first_name
FROM
customer
WHERE
active = 1
) AS active_cust
INNER JOIN
payment AS p ON active_cust.customer_id = p.customer_id;
Resultado: la consulta externa une el resultado de la subconsulta active_cust con payment.
Cuándo las subconsultas son más cómodas que JOIN
- Para una lógica paso a paso, cuando primero necesitas un valor intermedio.
- Para filtrar por agregados (
AVG,MAX,MIN) sin complicar en exceso la consulta principal. - Para comprobar relaciones ausentes, donde
NOT INoNOT EXISTSsuelen ser la opción natural.
Puntos clave de esta lección:
- Una subconsulta es un
SELECTanidado dentro de otra consulta SQL. - La consulta interna normalmente se ejecuta antes que la externa.
- Una subconsulta puede devolver un valor, una lista de valores o un conjunto completo con forma de tabla.
- Una subconsulta en
FROMse llama Inline View y necesita un alias. - Las subconsultas ayudan a escribir SQL más claro y flexible.
Preguntas frecuentes
¿Qué diferencia hay entre una subconsulta en WHERE y en FROM?
Una subconsulta en WHERE suele servir para filtrar las filas de la consulta externa. Una subconsulta en FROM construye un conjunto de datos temporal (Inline View) que puedes unir y seguir procesando.
¿Siempre necesito un alias para una subconsulta en FROM?
Sí. En la mayoría de los SGBD, una subconsulta en FROM debe tener un alias. Sin él, la consulta falla.
Preguntas de entrevista
¿Qué es una subconsulta y cómo se ejecuta?
Una subconsulta es un SELECT anidado dentro de una consulta SQL externa. Normalmente la consulta interna se ejecuta primero, y la externa usa su resultado para filtrar o construir el resultado final.
¿Qué diferencia hay entre las subconsultas escalares y las de varias filas?
Una subconsulta escalar devuelve un solo valor y suele usarse con = o >. Una subconsulta de varias filas devuelve un conjunto de valores y se usa con IN, ANY o ALL.
¿Qué es una Inline View en SQL?
Una Inline View es una subconsulta en FROM que se comporta como una tabla temporal dentro de una consulta. Debe tener un alias para poder referirse a sus columnas.