Una subconsulta es una consulta anidada dentro de otra consulta — se utiliza en WHERE, FROM, SELECT, o con EXISTS. Te permite usar el resultado de una consulta dentro de otra, lo que permite filtrado complejo y cálculos.
Una subconsulta es una consulta anidada dentro de otra consulta — se utiliza en WHERE, FROM, SELECT, o con EXISTS. Te permite usar el resultado de una consulta dentro de otra, lo que permite filtrado complejo y cálculos.
-- find users who have placed an order (their id is in the orders table)
SELECT name FROM users
WHERE id IN (SELECT user_id FROM orders); -- the subquery returns a list of user_ids
-- find products more expensive than the average
SELECT name, price FROM products
WHERE price > (SELECT AVG(price) FROM products); -- subquery returns a single value
Una subconsulta en WHERE proporciona valores para filtrar — una lista (con IN) o un valor único (con operadores de comparación).
-- for each user, find those with above-average orders FOR THEIR COUNTRY
SELECT name FROM users u
WHERE order_count > (
SELECT AVG(order_count) FROM users
WHERE country = u.country -- references the OUTER query's row (correlated)
);
Una subconsulta correlacionada hace referencia a la consulta externa — se ejecuta una vez por cada fila externa (potencialmente más lenta). Una subconsulta no correlacionada se ejecuta una sola vez.
-- users who have at least one order (often more efficient than IN)
SELECT name FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id -- just checks existence
);
EXISTS comprueba si una subconsulta devuelve alguna fila — a menudo más eficiente que IN para comprobaciones de existencia (puede detenerse en la primera coincidencia).
-- use a subquery result as a table
SELECT country, avg_age FROM (
SELECT country, AVG(age) AS avg_age FROM users GROUP BY country
) AS country_stats
WHERE avg_age > 30;
Many subqueries can be rewritten as JOINs (often more efficient/readable).
WHERE id IN (SELECT ...) → can often be a JOIN
Use subqueries for clarity in filtering/aggregation; JOINs for combining data.
CTEs (WITH) are often a cleaner alternative to complex nested subqueries.
Las subconsultas son una técnica SQL importante para consultas complejas — usar el resultado de una consulta dentro de otra permite filtrado y cálculos que las consultas simples no pueden expresar, por lo que comprenderlas es valioso para escribir consultas del mundo real.
Conocer las formas — subconsultas en WHERE (filtrado por una lista con IN o un valor único con comparaciones), subconsultas correlacionadas (haciendo referencia a la consulta externa, ejecutándose por fila), EXISTS (comprobaciones de existencia eficientes), y subconsultas en FROM (tablas derivadas) — cubre los patrones comunes para expresar lógica compleja.
Comprender la distinción entre subconsultas correlacionadas y no correlacionadas es importante para el rendimiento (las subconsultas correlacionadas se ejecutan una vez por cada fila externa y pueden ser lentas).
Igualmente valioso es conocer la relación con JOINs y CTEs: muchas subconsultas pueden reescribirse como JOINs (a menudo más eficientes y legibles) o CTEs (más limpias para casos complejos), así que entender cuándo usar cada una — subconsultas para claridad de filtrado/agregación, JOINs para combinar datos — es una habilidad práctica.
Dado que las consultas del mundo real a menudo requieren anidamiento (filtrado por resultados agregados, comprobaciones de existencia, comparación con valores calculados), y dado que comprender las subconsultas, sus características de rendimiento (especialmente las correlacionadas), y su relación con JOINs/CTEs es importante para escribir consultas complejas efectivas y eficientes, dominar las subconsultas es conocimiento valioso y frecuentemente aplicado para SQL más allá de consultas básicas y es un tema común en entrevistas que demuestra la capacidad de expresar requisitos de datos complejos.