QuieroProgramar por Rodri Gonzalez
SQL · Lección 09 de 15

Subconsultas

Una subconsulta (subquery) es un SELECT dentro de otro SELECT. Te permite resolver problemas que no se pueden expresar con un solo SELECT: "clientes con saldo superior al promedio", "ciudades con más clientes que Córdoba", "el último movimiento de cada cuenta".

90–110 min Prerrequisitos: SQL 08
01

Concepto teórico

¿Dónde van las subconsultas?

Ubicación Qué devuelve Ejemplo
WHERE Un valor o una lista WHERE saldo > (SELECT AVG(saldo) FROM ...)
FROM Una tabla temporal FROM (SELECT ...) AS sub
SELECT Un valor escalar SELECT (SELECT COUNT(*) FROM ...)

Subconsulta escalar en WHERE

La más común: una subconsulta que devuelve UN solo valor y se usa para comparar:

-- Clientes con saldo mayor al promedio
SELECT nombre, saldo
FROM clientes
WHERE saldo > (SELECT AVG(saldo) FROM clientes);

Subconsulta con IN

Devuelve una lista de valores para filtrar:

-- Clientes que tienen al menos una cuenta premium
SELECT nombre FROM clientes
WHERE id IN (SELECT cliente_id FROM cuentas WHERE tipo = 'PF');

Subconsulta en FROM (tabla derivada)

Creás una "tabla temporal" con un SELECT y la usás como fuente de otro SELECT:

SELECT ciudad, total_saldo
FROM (
    SELECT ciudad, SUM(saldo) AS total_saldo
    FROM clientes GROUP BY ciudad
) AS resumen
WHERE total_saldo > 500000;

Subconsulta en SELECT (escalar)

Calculás un valor por fila usando una subconsulta:

SELECT nombre, saldo,
       ROUND(saldo * 100.0 / (SELECT SUM(saldo) FROM clientes), 1) AS pct_total
FROM clientes;
Subconsulta vs JOIN: muchas subconsultas se pueden reescribir como JOINs (y viceversa). En general, los JOINs son más eficientes para combinar tablas. Las subconsultas brillan cuando necesitás un valor calculado (promedio, total) para comparar, o cuando la lógica es más clara con anidación.
En el trabajo: "clientes que gastan más que el promedio de su segmento", "sucursales que superaron su meta del mes anterior", "productos que vendieron más que la mediana". Todas requieren subconsultas o CTEs (próxima lección).
02

Ejemplos explicados paso a paso

Ejemplo 1: Subconsulta escalar en WHERE

ejemplo_01_escalar.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 2: Subconsulta con IN

ejemplo_02_in.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 3: Subconsulta en FROM (tabla derivada)

ejemplo_03_from.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 4: Subconsulta en SELECT — % del total

ejemplo_04_select.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 5: Subconsulta con MAX — encontrar el registro máximo

ejemplo_05_max.sqlSQL

        
Hacé clic en ▶ Ejecutar
03

Referencia rápida

Tipo Sintaxis Cuándo usar
Escalar en WHERE WHERE col > (SELECT AVG(col) ...) Comparar con un valor calculado
Lista con IN WHERE id IN (SELECT id FROM ...) Filtrar por pertenencia
NOT IN WHERE id NOT IN (SELECT ...) Excluir por pertenencia
En FROM FROM (SELECT ...) AS sub Crear tabla temporal
En SELECT SELECT (SELECT COUNT(*) ...) Valor por fila
EXISTS WHERE EXISTS (SELECT 1 ...) Verificar existencia
04

Ejercicios

Nivel 1 · Básico

Ejercicio 1: Mayor al promedio

Traé clientes con score mayor al promedio. Debe incluir Pérez.

ejercicio_01.sqlDebe incluir "Pérez"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 2: El máximo

Encontrá el cliente con saldo máximo usando subconsulta. Debe incluir 890000.

ejercicio_02.sqlDebe incluir "890000"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 3: IN con subconsulta

Clientes que tienen plazo fijo. Debe incluir García.

ejercicio_03.sqlDebe incluir "García"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 4: NOT IN

Clientes que NO tienen ninguna cuenta. Debe incluir Sosa.

ejercicio_04.sqlDebe incluir "Sosa"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 5: Subconsulta en SELECT — % del total

Mostrá cada cliente con su % del saldo total. Debe incluir pct.

ejercicio_05.sqlDebe incluir "pct"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 6: Subconsulta en FROM

Creá una tabla derivada con saldo total por ciudad y filtrá las que superan $300K. Debe incluir Buenos Aires.

ejercicio_06.sqlDebe incluir "Buenos Aires"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 7: Mayor al promedio de su ciudad

Clientes con saldo mayor al promedio de su propia ciudad (subconsulta correlacionada). Debe incluir Pérez.

ejercicio_07.sqlDebe incluir "Pérez"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 8: EXISTS

Clientes que tienen al menos una transacción > $50K. Debe incluir Pérez.

ejercicio_08.sqlDebe incluir "Pérez"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 9: Subconsulta con ranking manual

Mostrá cada cliente con su posición relativa: cuántos tienen saldo MAYOR que él. Debe incluir posicion.

ejercicio_09.sqlDebe incluir "posicion"

          
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

Ejercicio 10: Análisis comparativo completo

Para cada cliente mostrá: nombre, saldo, promedio general, diferencia vs promedio, y si está por encima o debajo. Debe incluir encima.

ejercicio_10.sqlDebe incluir "encima"

          
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

En la siguiente lección (10 · CTEs con WITH) vas a aprender la alternativa más legible a las subconsultas: Common Table Expressions, que son el estándar en equipos profesionales.