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".
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;
Ejemplos explicados paso a paso
Ejemplo 1: Subconsulta escalar en WHERE
Hacé clic en ▶ Ejecutar
Ejemplo 2: Subconsulta con IN
Hacé clic en ▶ Ejecutar
Ejemplo 3: Subconsulta en FROM (tabla derivada)
Hacé clic en ▶ Ejecutar
Ejemplo 4: Subconsulta en SELECT — % del total
Hacé clic en ▶ Ejecutar
Ejemplo 5: Subconsulta con MAX — encontrar el registro máximo
Hacé clic en ▶ Ejecutar
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 |
Ejercicios
Ejercicio 1: Mayor al promedio
Traé clientes con score mayor al promedio. Debe incluir Pérez.
Hacé clic en ▶ Ejecutar
Ejercicio 2: El máximo
Encontrá el cliente con saldo máximo usando subconsulta. Debe incluir 890000.
Hacé clic en ▶ Ejecutar
Ejercicio 3: IN con subconsulta
Clientes que tienen plazo fijo. Debe incluir García.
Hacé clic en ▶ Ejecutar
Ejercicio 4: NOT IN
Clientes que NO tienen ninguna cuenta. Debe incluir Sosa.
Hacé clic en ▶ Ejecutar
Ejercicio 5: Subconsulta en SELECT — % del total
Mostrá cada cliente con su % del saldo total. Debe incluir pct.
Hacé clic en ▶ Ejecutar
Ejercicio 6: Subconsulta en FROM
Creá una tabla derivada con saldo total por ciudad y filtrá las que superan $300K. Debe incluir
Buenos Aires.
Hacé clic en ▶ Ejecutar
Ejercicio 7: Mayor al promedio de su ciudad
Clientes con saldo mayor al promedio de su propia ciudad (subconsulta correlacionada). Debe incluir
Pérez.
Hacé clic en ▶ Ejecutar
Ejercicio 8: EXISTS
Clientes que tienen al menos una transacción > $50K. Debe incluir Pérez.
Hacé clic en ▶ Ejecutar
Ejercicio 9: Subconsulta con ranking manual
Mostrá cada cliente con su posición relativa: cuántos tienen saldo MAYOR que él. Debe incluir
posicion.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
Resumen y conexión
- Subconsultas en WHERE: comparar con valores calculados (
> (SELECT AVG(...))). - Subconsultas con IN/NOT IN: filtrar por pertenencia a una lista dinámica.
- Subconsultas en FROM: crear tablas temporales para consultas de dos pasos.
- Subconsultas en SELECT: calcular un valor por fila (% del total).
- EXISTS: verificar si existe al menos un registro relacionado.
- Subconsultas correlacionadas: la subconsulta usa valores del SELECT externo.
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.