Subconsultas correlacionadas e não correlacionadas
Entenda subconsultas correlacionadas que fazem referência à linha externa, suas características de desempenho e quando EXISTS supera IN.
Subconsultas correlacionadas e não correlacionadas é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
Subconsultas não correlacionadas
Uma subconsulta não correlacionada não faz referência à linha externa. Ela é executada uma vez e seu resultado é reutilizado:
SELECT * FROM users
WHERE id IN (
SELECT user_id FROM orders WHERE status = 'paid'
);Subconsultas correlacionadas
Uma subconsulta correlacionada faz referência à linha externa — logicamente, ela é executada novamente para cada linha externa:
SELECT u.id, u.email
FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.user_id = u.id
AND o.total > 1000
);Como identificar a diferença
Se o SELECT interno fizer referência a uma coluna do FROM externo, ele será correlacionado.
Implicações de desempenho
Uma subconsulta correlacionada ingênua tem complexidade O(externa × interna). Os planejadores modernos geralmente a reescrevem como uma semijunção ou uma junção por hash — mas você ainda deve escrever a forma mais simples quando possível.
EXISTS versus IN
Para "pelo menos uma correspondência":
-- IN with non-correlated subquery (often the planner's favourite):
SELECT u.* FROM users u
WHERE u.id IN (SELECT user_id FROM orders);
-- EXISTS with correlated subquery (NULL-safe alternative):
SELECT u.* FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);NOT EXISTS sempre supera NOT IN
NOT IN falha quando o conjunto interno contém NULL. NOT EXISTS não falha. Prefira sempre NOT EXISTS para a antijunção:
-- BUG-prone:
SELECT u.* FROM users u
WHERE u.id NOT IN (SELECT excluded_id FROM blocklist);
-- Safe:
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT 1 FROM blocklist b WHERE b.excluded_id = u.id);Subconsultas correlacionadas em SELECT
O padrão de "consulta por linha":
SELECT u.id, u.email,
(SELECT MAX(created_at) FROM orders o WHERE o.user_id = u.id) AS last_order_at
FROM users u;
-- Often readable, but consider a LEFT JOIN + GROUP BY.Subconsultas correlacionadas em UPDATE
Obtenha um valor derivado para cada linha:
UPDATE products p
SET review_count = (
SELECT COUNT(*) FROM reviews r WHERE r.product_id = p.id
);LATERAL JOIN: um padrão correlacionado mais claro
Para "procurar algumas linhas para cada linha externa", LATERAL costuma ser mais claro e mais rápido — isso será abordado em Padrões avançados de JOIN.
Armazenamento em cache de subconsultas
O PostgreSQL não armazena em cache os resultados das subconsultas entre linhas por padrão. Se o mesmo resultado interno for necessário muitas vezes, use uma CTE.
Indexe a coluna de correlação
A subconsulta interna filtra pela chave da linha externa. Sem um índice nessa chave, você terá uma varredura completa para cada linha externa.
-- For the orders example, this is essential:
CREATE INDEX orders_user_id_idx ON orders(user_id);Resumo
Subconsultas correlacionadas fazem referência à linha externa.
- EXISTS é a forma correlacionada canônica
- Prefira NOT EXISTS a NOT IN
- Indexe a coluna de correlação
- LATERAL é uma alternativa mais clara em muitos casos
Verificação rápida
Por que NOT EXISTS é mais seguro do que NOT IN quando o conjunto interno pode conter NULL?
Perguntas Frequentes
A aula “Subconsultas correlacionadas e não correlacionadas” é grátis?
Sim — o texto completo de “Subconsultas correlacionadas e não correlacionadas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Subconsultas correlacionadas e não correlacionadas”?
Entenda subconsultas correlacionadas que fazem referência à linha externa, suas características de desempenho e quando EXISTS supera IN. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Subconsultas correlacionadas e não correlacionadas”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Subconsultas escalares, de linha e de tabela
- Subconsultas correlacionadas e não correlacionadas
- Expressões de tabela comuns (WITH)
- CTEs RECURSIVE para hierarquias