SUBQUERY (Subconsulta) en SQL: qué es, cómo funciona y ejemplos prácticos

Una subquery (o subconsulta) en SQL es una consulta anidada dentro de otra consulta principal.
Permite usar el resultado de una consulta como entrada para otra, lo que brinda flexibilidad y poder al momento de recuperar o manipular datos.

👉 En otras palabras: una subquery es una consulta dentro de otra consulta.

Sintaxis básica de una subquery

SELECT columnas
FROM tabla
WHERE columna operador (
    SELECT columna
    FROM otra_tabla
    WHERE condición
);

Elementos clave:

  • La subquery va entre paréntesis.
  • Se ejecuta antes que la consulta externa.
  • Puede devolver un valor único, una fila, varias filas o incluso otra tabla.

👉 La consulta externa suele ser un SELECT con condiciones en WHERE.

Tipos de subqueries

  1. Escalares → devuelven un único valor.
  2. De una sola fila → devuelven una fila con varias columnas.
  3. De múltiples filas → devuelven varias filas (se usan con IN, ANY, ALL).
  4. En la cláusula FROM → actúan como tablas derivadas.
  5. Correlacionadas → dependen de la consulta externa para ejecutarse.

Ejemplo de subquery escalar

SELECT nombre, salario
FROM empleados
WHERE salario > (SELECT AVG(salario) FROM empleados);

👉 Devuelve empleados con salario superior al promedio.

Ejemplo de subquery con IN

SELECT nombre
FROM clientes
WHERE id IN (
    SELECT cliente_id
    FROM pedidos
    WHERE fecha > '2025-01-01'
);

👉 Devuelve clientes que hicieron pedidos en 2025 (ver más sobre el operador IN).

Ejemplo de subquery en FROM (tabla derivada)

SELECT departamento, promedio
FROM (
    SELECT departamento, AVG(salario) AS promedio
    FROM empleados
    GROUP BY departamento
) sub;

👉 La subquery genera una tabla temporal que luego se consulta.

Ejemplo de subquery correlacionada

SELECT c.nombre
FROM clientes c
WHERE EXISTS (
    SELECT 1
    FROM pedidos p
    WHERE p.cliente_id = c.id
);

👉 Devuelve clientes que tienen al menos un pedido.
La subquery depende de cada fila de la consulta externa.

👉 Usa EXISTS para comprobar que existen filas relacionadas.

Subquery en SELECT

SELECT nombre,
       (SELECT COUNT(*) FROM pedidos p WHERE p.cliente_id = c.id) AS total_pedidos
FROM clientes c;

👉 Agrega una columna calculada con el número de pedidos por cliente.

Diferencias entre SUBQUERY y JOIN

  • JOIN: combina filas de varias tablas en una misma consulta.
  • SUBQUERY: usa el resultado de una consulta como entrada para otra.

Ejemplo con JOIN:

SELECT c.nombre, COUNT(p.id)
FROM clientes c
JOIN pedidos p ON c.id = p.cliente_id
GROUP BY c.nombre;

Ejemplo con SUBQUERY:

SELECT nombre,
       (SELECT COUNT(*) FROM pedidos p WHERE p.cliente_id = c.id) AS total_pedidos
FROM clientes c;

👉 Ambos dan resultados similares, pero con enfoques diferentes.

Errores comunes con SUBQUERY

  1. Devolver múltiples filas en una subquery escalar
-- ❌ Error: más de un valor devuelto
SELECT nombre
FROM empleados
WHERE salario = (SELECT salario FROM empleados WHERE departamento = 'Ventas');
  1. Olvidar alias en subquery dentro de FROM
    👉 Siempre hay que asignar alias a la tabla derivada.
  2. Usar subqueries cuando un JOIN sería más eficiente
    👉 A veces las subqueries son más lentas en grandes volúmenes de datos.
  3. No considerar índices en subqueries correlacionadas
    👉 Puede afectar el rendimiento al ejecutarse fila por fila.

Buenas prácticas con SUBQUERY

  • Usar subqueries escalares para cálculos simples (ej. promedio, máximo).
  • Preferir JOINs cuando se trate de combinar tablas grandes.
  • Siempre dar alias a las tablas derivadas.
  • Evitar subqueries correlacionadas en tablas muy grandes (optar por JOIN o CTE).
  • Usar CTEs (Common Table Expressions) como alternativa más legible en queries complejas.

Casos de uso comunes de SUBQUERY

  1. Comparar registros con un valor calculado
    👉 Empleados con salario mayor al promedio.
  2. Filtrar con listas dinámicas
    👉 Clientes que aparecen en la tabla de pedidos.
  3. Generar tablas temporales
    👉 Subquery en FROM para calcular promedios o totales.
  4. Detección de duplicados
    👉 Usar subqueries para encontrar valores repetidos.
  5. Consultas correlacionadas en reporting
    👉 Calcular totales por cliente, categoría o período.

SUBQUERY en distintos motores de base de datos

  • MySQL: soporte completo para subqueries, con mejoras desde la versión 8.
  • PostgreSQL: soporte avanzado, ideal para subqueries complejas y CTE.
  • SQL Server: soporte completo, con optimizaciones en ejecución.
  • Oracle: pionero en el soporte de subconsultas y subqueries correlacionadas.
  • SQLite: soporta subqueries en SELECT, WHERE y FROM.

👉 En general, todos los motores modernos soportan subqueries.

Preguntas frecuentes (FAQ)

1. ¿Una subquery siempre va en WHERE?
No. Puede ir en WHERE, FROM, SELECT o incluso en HAVING.

2. ¿Qué diferencia hay entre una subquery y un JOIN?
JOIN combina tablas en una misma consulta; la subquery genera resultados intermedios.

3. ¿Puedo usar varias subqueries en la misma consulta?
Sí, incluso anidadas unas dentro de otras.

4. ¿Una subquery siempre es más lenta que un JOIN?
No siempre, pero en tablas grandes suele ser más eficiente un JOIN.

5. ¿Qué pasa si una subquery no devuelve resultados?
Depende: con IN o EXISTS puede devolver cero filas y no afectar la consulta principal.

Conclusión

Las subqueries en SQL son una herramienta poderosa que permite:

  • Realizar consultas anidadas.
  • Calcular valores dinámicos.
  • Filtrar con base en resultados de otras consultas.
  • Crear tablas derivadas para análisis avanzados.

Son fundamentales en consultas complejas y en la construcción de reportes en SQL.

Practica correlacionadas y anidadas en Subconsultas y regresa al Glosario SQL completo.

Scroll al inicio