0Pricing
SQL Academy · Aula

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

  1. Subconsultas escalares, de linha e de tabela
  2. Subconsultas correlacionadas e não correlacionadas
  3. Expressões de tabela comuns (WITH)
  4. CTEs RECURSIVE para hierarquias
← Voltar para SQL Academy