Filtrar datos con valores fijos funciona hasta que la pregunta de negocio exige un cálculo previo. ¿Cómo saber qué clientes compraron por encima del promedio si ese promedio cambia con cada registro nuevo? La respuesta está en las subqueries dentro del WHERE, una técnica que permite usar el resultado de una consulta como criterio de filtro en otra. A continuación se desglosan los tipos de subqueries, su orden de ejecución y ejemplos prácticos con datos reales.
¿Qué es una subquery y cómo se ejecuta internamente?
Una subquery es una consulta anidada dentro de otra consulta [01:00]. La consulta exterior recibe el nombre de query principal, mientras que la interior se conoce como subquery o subselect. El motor de base de datos siempre ejecuta primero la subquery, obtiene su resultado y luego lo inyecta en la query principal para completar la operación [06:24].
Existen tres tipos principales de subqueries [01:22]:
- Subquery escalar: devuelve exactamente un valor (un número, una fecha o un texto).
- Subquery de lista: devuelve una columna con múltiples valores, usada generalmente con el operador
IN.
- Subquery correlacionada: referencia columnas de la query exterior y se ejecuta una vez por cada fila.
¿Cómo funciona una subquery escalar en el WHERE?
La subquery escalar resuelve un problema muy concreto: necesitas comparar cada fila contra un valor que solo puedes obtener con otra consulta [01:52]. El ejemplo clásico es encontrar los clientes cuyos pedidos superaron el promedio general.
sql SELECT c.nombre, p.total, p.fecha_pedido FROM clientes c JOIN pedidos p ON c.id = p.cliente_id WHERE p.total > ( SELECT AVG(total) FROM pedidos WHERE estado = 'completado' );
Al ejecutar solo la subquery interna, el resultado es un único número: 1837.64 aproximadamente [02:48]. Ese valor escalar se convierte en el umbral del filtro. La query principal entonces devuelve todos los clientes cuyo total de compra supera ese promedio [03:55].
¿Por qué no basta con un valor estático?
Escribir WHERE total > 1837 funcionaría solo en ese instante. Si mañana se registran nuevos pedidos, el promedio cambia y el filtro queda desactualizado. La subquery recalcula el valor cada vez que se ejecuta, garantizando resultados siempre precisos [00:24].
¿Cuándo usar una subquery de lista con IN?
Cuando el filtro no es un solo valor sino un conjunto de valores dinámicos, se utiliza una subquery de lista combinada con el operador IN [05:07]. La pregunta de negocio que lo ilustra: ¿qué productos se vendieron al menos una vez en Argentina?
sql SELECT nombre_producto FROM productos WHERE producto_id IN ( SELECT DISTINCT producto_id FROM ventas WHERE pais = 'Argentina' ) ORDER BY nombre_producto;
¿Qué devuelve cada parte de la consulta?
- La subquery devuelve 28 IDs de producto vendidos en Argentina [08:15].
- La tabla de productos contiene 34 productos en total [08:30].
- El resultado final muestra 24 productos que cumplen la condición [08:22].
Esto significa que de todo el catálogo, solo 24 productos registraron al menos una venta en Argentina. Sin la subquery, habría que conocer de antemano cada ID y escribirlo manualmente en el filtro.
¿Qué otras posibilidades abren las subqueries en WHERE?
Las subqueries en el WHERE permiten cubrir escenarios que los filtros simples no alcanzan [08:52]:
- Subquery escalar: ideal para umbrales calculados como promedios, máximos o mínimos.
IN y NOT IN: perfectos para filtrar por listas dinámicas que cambian con los datos.
EXISTS y NOT EXISTS: útiles cuando solo importa verificar si un registro relacionado existe o no.
Cada tipo se adapta a una necesidad distinta. La clave está en definir primero la subquery y asegurarse de que devuelva el tipo de resultado correcto: un valor único para comparaciones directas o una lista para operadores de pertenencia.
¿Has utilizado subqueries en tus proyectos o prefieres resolver estos filtros de otra forma? Comparte tu experiencia en los comentarios.