🙏 Realmente necesitamos su apoyo. Necesitamos financiamiento para continuar nuestra misión: publicar nuevas lecciones y mejorar la plataforma. Si puede, por favor apoye el proyecto con una donación. Ayude al proyecto ahora →
Código SQL copiado al portapapeles

Lesión 6.1 · Tiempo de lectura: ~7 min

Una subconsulta SQL te ayuda a dividir un problema en múltiples pasos dentro de una única declaración. En esta lección, aprenderás la idea central de las subconsultas, sus principales tipos y cómo usarlas en SELECT, WHERE y FROM con ejemplos de Sakila.

Introducción a las Subconsultas: Consultas Anidadas y Vista en Línea

En lecciones anteriores, ya aprendiste cómo obtener datos y combinar tablas con JOIN. Pero en tareas reales, a menudo necesitas calcular un resultado intermedio primero y luego usarlo en la consulta principal.

Eso es exactamente para lo que sirven las subconsultas: hacen que la lógica SQL sea paso a paso y más fácil de razonar.

Diagrama de subconsulta SQL que muestra la ejecución de la consulta interna primero, luego la consulta externa, y su uso en SELECT, WHERE y FROM

¿Qué es una Subconsulta?

Una subconsulta es una declaración 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 a la consulta externa, que completa el filtrado o construye el conjunto de resultados final.

-- Ejemplo conceptual
SELECT column_name
FROM table_name
WHERE column_name = (SELECT value FROM another_table);

Nota: la expresión entre paréntesis se calcula primero, luego se aplica la condición WHERE externa.


Principales Tipos de Subconsultas

  • Subconsulta escalar: devuelve un valor (una fila, una columna).
  • Subconsulta de múltiples filas: devuelve una lista de valores (una columna, muchas filas).
  • Subconsulta de tabla (Vista en Línea): devuelve un conjunto de filas y columnas que se utilizan como una tabla temporal.

Subconsulta en SELECT

Puedes colocar subconsultas directamente en la lista SELECT cuando necesitas una métrica adicional junto a las columnas base sin cambiar la granularidad de las filas. Esto es especialmente útil cuando un JOIN duplicaría fácilmente las filas o requeriría una agregación pesada.

Escenario 1: mostrar el último pago de cada cliente (fecha y monto).

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 "último" pago. Con JOIN, esto suele ser más complejo: primero calculas la fecha máxima, luego vuelves a unir y resuelves empates.

Escenario 2: mostrar cada pago y su desviación del promedio de pagos 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 mantiene su granularidad original y obtiene un punto de referencia por cliente. Un enfoque de JOIN requeriría una tabla agregada separada y una unión adicional.


Subconsulta en WHERE

El caso más común es una subconsulta dentro de WHERE, donde el filtrado depende de un valor calculado dinámicamente.

Escenario: encontrar películas cuyo replacement_cost esté por encima del promedio 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 el promedio, y la consulta externa devuelve las películas por encima de ese promedio.


Subconsulta en FROM (Vista en Línea)

Cuando una subconsulta se coloca en FROM, se comporta como una tabla temporal dentro de la consulta actual. Este patrón se llama Vista en Línea.

Importante: una Vista en Línea debe tener un alias.

Escenario: obtener 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 Convenientes Que JOIN

  • Para lógica paso a paso cuando necesitas un valor intermedio primero.
  • Para filtrado por agregados (AVG, MAX, MIN) sin complicar demasiado la consulta principal.
  • Para verificaciones de relaciones faltantes, donde NOT IN o NOT EXISTS son a menudo elecciones naturales.

Conclusiones clave de esta lección:

  • Una subconsulta es un SELECT anidado dentro de otra consulta SQL.
  • La consulta interna generalmente se ejecuta antes que la consulta externa.
  • Una subconsulta puede devolver un valor, una lista de valores o un conjunto completo similar a una tabla.
  • Una subconsulta en FROM se llama Vista en Línea y requiere un alias.
  • Las subconsultas ayudan a escribir SQL más claro y flexible.

Preguntas Frecuentes

¿Cuál es la diferencia entre una subconsulta en WHERE y en FROM?

Una subconsulta en WHERE se utiliza generalmente para filtrar filas de la consulta externa. Una subconsulta en FROM construye un conjunto de datos temporal (Vista en Línea) que puedes unir y procesar más.

¿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. Típicamente, la consulta interna se ejecuta primero, y la consulta externa utiliza su resultado para filtrar o construir la salida final.

¿Cuál es la diferencia entre subconsultas escalares y de múltiples filas?

Una subconsulta escalar devuelve un valor y comúnmente trabaja con = o >. Una subconsulta de múltiples filas devuelve un conjunto de valores y se utiliza con IN, ANY o ALL.

¿Qué es una Vista en Línea en SQL?

Una Vista en Línea es una subconsulta en FROM que se comporta como una tabla temporal dentro de una consulta. Debe tener un alias para que puedas referenciar sus columnas.

En la próxima lección, profundizaremos en las subconsultas en WHERE y cubriremos los operadores IN, EXISTS, ANY y ALL.