Consultas avanzadas · resultados anidados

Subquery

Una subquery o subconsulta es un SELECT incluido dentro de otra sentencia para aportar un valor, una lista o una condición.

Lectura: 6–8 minEjemplo comprobadoPráctica con pistas
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.
Ejemplo de estructura
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:

SQL
SELECT nombre
FROM clientes
WHERE id IN (
  SELECT cliente_id
  FROM pedidos
  WHERE total > (
    SELECT AVG(total)
    FROM pedidos
  )
)
ORDER BY nombre;
Resultado comprobado
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.

Alternativas según la pregunta
-- 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

Intermedia · subconsulta escalar

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.

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 EXISTS cuando la pregunta sea si existe al menos una coincidencia.
  • No ocultes un error de cardinalidad con LIMIT 1 sin definir antes qué fila necesitas.

Conceptos relacionados

Fuentes técnicas

La explicación se ha contrastado con documentación oficial: