Contenido de esta guía
Qué aporta una subconsulta
La consulta interior resuelve una parte del problema y entrega su resultado a la consulta exterior. Puede producir un único valor, varias filas de una columna o incluso una tabla derivada.
Esta separación ayuda a expresar preguntas como «productos más caros que la media» o «clientes que tienen pedidos».
Tres formas habituales
- Escalar: devuelve un solo valor y puede usarse en una comparación.
- Con IN o EXISTS: decide si una fila cumple una condición relacionada.
- En FROM: actúa como una tabla temporal y necesita un alias en muchos motores.
SELECT columnas
FROM tabla
WHERE valor > (
SELECT AVG(valor)
FROM tabla
);Ejemplo guiado
Queremos clientes que tengan al menos un pedido cuyo total supera la media de todos los pedidos:
SELECT nombre
FROM clientes
WHERE id IN (
SELECT cliente_id
FROM pedidos
WHERE total > (
SELECT AVG(total)
FROM pedidos
)
)
ORDER BY nombre;| nombre |
|---|
| Ana Torres |
| Lucía Vega |
| Marta Ruiz |
| Sara Gómez |
La subconsulta más interna calcula una media aproximada de 218,44. La siguiente obtiene los identificadores de clientes con pedidos superiores a esa cifra. La consulta exterior transforma esos identificadores en nombres.
Subconsulta correlacionada
Una subconsulta correlacionada utiliza valores de la fila que la consulta exterior está evaluando. Puede expresar reglas muy claras con EXISTS, pero se analiza conceptualmente para cada fila exterior. El optimizador puede transformarla; no deduzcas su coste sin revisar el plan.
Error frecuente
Usar una subconsulta escalar que puede devolver varias filas
Una comparación como precio = (SELECT precio FROM productos) expresa que la consulta interior debe aportar un único valor. PostgreSQL genera un error si recibe varias filas; SQLite toma la primera y descarta las demás. Depender de cualquiera de esos accidentes hace que la intención sea frágil.
-- Un único valor calculado
WHERE precio > (SELECT AVG(precio) FROM productos)
-- Pertenencia a una lista
WHERE categoria_id IN (SELECT id FROM categorias)
-- Existencia de una fila relacionada
WHERE EXISTS (
SELECT 1
FROM pedidos AS p
WHERE p.cliente_id = clientes.id
)Usa LIMIT 1 solo cuando realmente quieres una fila concreta y acompáñalo de un ORDER BY que defina cuál.
Comprueba lo aprendido
Busca productos por encima del precio medio
Devuelve nombre y precio de los productos cuyo precio supera el precio medio de la tabla. Ordena de mayor a menor.
AVG(precio).precio con el valor entre paréntesis.ORDER BY precio DESC.Solución razonada
SELECT nombre, precio
FROM productos
WHERE precio > (
SELECT AVG(precio)
FROM productos
)
ORDER BY precio DESC;| nombre | precio |
|---|---|
| Portátil Pro | 999,0 |
| Monitor 27 | 249,0 |
La media de precios es 191,81 aproximadamente, por lo que solo el portátil y el monitor de 27 pulgadas quedan por encima.
Compatibilidad entre motores
Las subconsultas son una capacidad central de SQL, pero no todos los motores reaccionan igual ante una subconsulta escalar con varias filas. PostgreSQL la rechaza; SQLite utiliza el valor de la primera fila. Escribe la consulta para que la cardinalidad correcta sea evidente y comprobable, en lugar de confiar en la tolerancia de un motor.
También cambian algunos requisitos de alias, las reglas para modificar datos y las optimizaciones. EXISTS suele expresar mejor una pregunta de existencia y evita que los duplicados de la consulta interior alteren la intención.
Qué debes recordar
- Una subconsulta puede aportar un valor, una lista, una tabla derivada o una condición de existencia.
- Su posición determina cuántas filas y columnas puede devolver.
- Usa
EXISTScuando la pregunta sea si existe al menos una coincidencia. - No ocultes un error de cardinalidad con
LIMIT 1sin definir antes qué fila necesitas.
Conceptos relacionados
Fuentes técnicas
La explicación se ha contrastado con documentación oficial: