Uma subconsulta é uma consulta aninhada dentro de outra consulta — usada em WHERE, FROM, SELECT ou com EXISTS. Permite usar o resultado de uma consulta dentro de outra, possibilitando filtragens e computações complexas.
Uma subconsulta é uma consulta aninhada dentro de outra consulta — usada em WHERE, FROM, SELECT ou com EXISTS. Permite usar o resultado de uma consulta dentro de outra, possibilitando filtragens e computações complexas.
-- 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
Uma subconsulta em WHERE fornece valores para filtrar — uma lista (com IN) ou um valor único (com operadores de comparação).
-- 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)
);
Uma subconsulta correlacionada referencia a consulta externa — ela é executada uma vez por linha externa (potencialmente mais lenta). Uma subconsulta não correlacionada é executada uma única 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 verifica se uma subconsulta retorna qualquer linha — muitas vezes mais eficiente que IN para verificações de existência (pode parar na primeira correspondência).
-- 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.
Subconsultas são uma técnica SQL importante para consultas complexas — usar o resultado de uma consulta dentro de outra possibilita filtragens e computações que consultas simples não conseguem expressar, portanto compreendê-las é valioso para escrever consultas no mundo real.
Conhecer as formas — subconsultas em WHERE (filtrando por uma lista com IN ou um valor único com comparações), subconsultas correlacionadas (referenciando a consulta externa, executadas por linha), EXISTS (verificações de existência eficientes) e subconsultas em FROM (tabelas derivadas) — abrange os padrões comuns para expressar lógica complexa.
Compreender a distinção entre subconsultas correlacionadas e não correlacionadas é importante para desempenho (subconsultas correlacionadas são executadas uma vez por linha externa e podem ser lentas).
Igualmente valioso é conhecer o relacionamento com JOINs e CTEs: muitas subconsultas podem ser reescritas como JOINs (muitas vezes mais eficientes e legíveis) ou CTEs (mais limpas para casos complexos), portanto entender quando usar cada uma — subconsultas para clareza de filtragem/agregação, JOINs para combinar dados — é uma habilidade prática.
Como consultas do mundo real frequentemente exigem aninhamento (filtragem por resultados agregados, verificações de existência, comparação com valores computados), e como compreender subconsultas, suas características de desempenho (especialmente as correlacionadas) e seu relacionamento com JOINs/CTEs é importante para escrever consultas complexas eficazes e eficientes, dominar subconsultas é conhecimento valioso e frequentemente aplicado para SQL além de consultas básicas e um tópico comum em entrevistas que demonstra capacidade de expressar requisitos de dados complexos.