Aprende SQL · lección gratuita
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.
SELECT que retorna 1 fila × 1 columna, p. ej. (SELECT AVG(salario) FROM empleados).WHERE: filtra comparando cada fila contra el valor calculado, p. ej. WHERE salario > (SELECT AVG(salario) FROM empleados).SELECT: añade una columna calculada idéntica en todas las filas, útil para mostrar la diferencia respecto a una referencia.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:
WHERE x = (SELECT a, b FROM ...) es error de sintaxis. La subconsulta escalar debe seleccionar una columna.WHERE precio = (SELECT precio FROM productos) no falla en SQLite pero usa solo la primera fila — casi nunca es lo que quieres. Si esperas varias filas, usa IN (Lección 23) o un agregado (MAX, MIN, AVG).NULL, y cualquier comparación con NULL da desconocido (la fila no pasa el filtro).SELECT nombre, salario FROM empleados WHERE salario > (SELECT AVG(salario) FROM empleados) ORDER BY salario DESC
-- 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 tuWHEREpudiera 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.
| Cláusula / Función | Qué 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 c | Añ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) |
---