🎯 Quedan pocos días este mes Apoya SQLTest.online y ayúdanos a mantener la práctica de SQL gratuita para todos. Dona hoy →
Código SQL copiado al portapapeles

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.

Diagrama de subconsultas SQL: primero se ejecuta la consulta interna y después la externa; uso en SELECT, WHERE y FROM

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 IN o NOT EXISTS suelen ser la opción natural.

Puntos clave de esta lección:

  • Una subconsulta es un SELECT anidado 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 FROM se 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.

Intenta resolver las siguientes tareas para reforzar lo que aprendiste en esta lección.

  1. ¿Qué es una subconsulta?
  2. Películas con el Mayor Costo de Reemplazo
  3. Actores Más Populares Que HENRY BERRY
  4. Clientes con un alto número de alquileres
  5. Encontrar Aeronaves con Todas las Condiciones de Tarifa