Aprende SQL · lección gratuita

Lección 22 · Subconsultas escalares

Resumen

Una subconsulta es una consulta SELECT anidada dentro de otra. Cuando esa subconsulta devuelve exactamente un valor (una fila y una columna) se llama subconsulta escalar y puede usarse en cualquier sitio donde caería un valor literal: en WHERE, en la lista de SELECT, en HAVING o incluso en un ORDER BY. Son la base para comparar cada fila contra un agregado global (un promedio, un máximo, una fecha de referencia) sin tener que calcular ese número a mano.

Sintaxis / Conceptos

La subconsulta va siempre entre paréntesis. Una subconsulta escalar es semánticamente un valor único, así que el motor la ejecuta de forma independiente, obtiene el escalar y luego ejecuta la consulta externa sustituyendo ese valor. Como no depende de la fila externa, se calcula una sola vez (a esto se le llama subconsulta no correlacionada; las correlacionadas se ven en la Lección 24).

Errores comunes:

SELECT nombre, salario FROM empleados WHERE salario > (SELECT AVG(salario) FROM empleados) ORDER BY salario DESC

Ejemplos

-- Empleados que ganan MÁS que el salario promedio de toda la empresa.
-- La subconsulta (SELECT AVG(salario) ...) se evalúa una vez y devuelve un único número.
SELECT nombre, cargo, salario
FROM empleados
WHERE salario > (SELECT AVG(salario) FROM empleados)
ORDER BY salario DESC;

-- Subconsulta escalar en la lista de SELECT: comparar cada salario con el promedio global.
-- 'prom_global' es idéntico en todas las filas; 'dif' muestra cuánto se aleja cada empleado.
SELECT nombre,
       salario,
       (SELECT AVG(salario) FROM empleados)           AS prom_global,
       salario - (SELECT AVG(salario) FROM empleados) AS dif
FROM empleados
ORDER BY dif DESC;

-- El producto más caro: comparamos contra el precio máximo (subconsulta con MAX).
SELECT nombre, precio
FROM productos
WHERE precio = (SELECT MAX(precio) FROM productos);

-- Usando una fecha de referencia escalar: clientes dados de alta DESPUÉS de TechNova.
SELECT empresa, fecha_alta
FROM clientes
WHERE fecha_alta > (SELECT fecha_alta FROM clientes WHERE empresa = 'TechNova')
ORDER BY fecha_alta;
💡 Si una subconsulta escalar de tu WHERE pudiera devolver varias filas (p. ej. (SELECT fecha_alta FROM clientes WHERE pais = 'Perú')), SQLite tomará silenciosamente la primera. Reduce siempre a un único valor con un agregado o una clave que garantice unicidad.

Cheatsheet

Cláusula / FunciónQué hace
(SELECT AVG(col) FROM t)Subconsulta escalar: devuelve 1 valor reutilizable
WHERE x > (SELECT ...)Compara cada fila contra el escalar calculado
SELECT (SELECT ...) AS cAñade una columna constante (mismo valor por fila)
= (SELECT MAX(col) ...)Selecciona las filas con el valor máximo
(SELECT col FROM t WHERE clave = ?)Escalar por clave única (1 fila garantizada)

---

← JOINs de múltiples tablasSubconsultas con IN, ANY y ALL →

Ver todas las lecciones de Aprende SQL →