Anatomia de uma subconsulta correlacionada
Entenda como a consulta interna referencia a linha externa e o modelo de execução por linha.
Anatomia de uma subconsulta correlacionada é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 1 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 Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.
O que torna uma subconsulta correlacionada
Os entrevistadores dividem as subconsultas em dois grupos. Uma subconsulta simples (não correlacionada) pode ser executada sozinha. Uma subconsulta correlacionada faz referência a uma coluna da consulta externa, portanto não pode ser executada de forma independente.
- Não correlacionada: avaliada uma vez, com o resultado reutilizado para cada linha externa.
- Correlacionada: reavaliada uma vez por linha externa, pois depende dessa linha.
O sinal revelador é uma coluna da tabela externa aparecendo dentro da consulta interna. Identifique isso e poderá nomear o padrão imediatamente.
Modelo de execução por linha
Imagine o motor percorrendo as linhas externas. Para cada linha externa, ele insere os valores dessa linha na consulta interna, executa-a e usa o resultado para decidir ou calcular algo.
Esse é o modelo mental que os entrevistadores querem que você saiba explicar: "a consulta interna é executada uma vez para cada linha externa."
Essa formulação também sugere a pergunta clássica de continuação: subconsultas correlacionadas podem ser lentas porque a consulta interna pode ser executada milhares de vezes. Corrigiremos isso na lição 4.
Identificando a referência externa
Aqui, a tabela de funcionários e o apelido externo de funcionários assalariados e1 conduzem uma consulta interna que lê e1.dept_id. Essa referência à linha externa é a correlação.
Remova o prefixo do apelido e a consulta interna não será mais compilada por conta própria. Essa dependência é exatamente o que a torna correlacionada.
SELECT e1.name, e1.salary
FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary)
FROM employees e2
WHERE e2.dept_id = e1.dept_id
);Lendo essa consulta em voz alta
Traduza a consulta anterior para o português claro, como você faria em uma entrevista:
"Para cada funcionário e1, encontre o salário médio do próprio departamento e mantenha o funcionário apenas se ele ganhar mais do que essa média do departamento."
O WHERE e2.dept_id = e1.dept_id da consulta interna vincula a média ao departamento deste funcionário. Sem essa linha, você compararia todos com a média da empresa inteira.
Os apelidos são obrigatórios
Quando a consulta interna e a externa acessam a mesma tabela, você deve criar um apelido para cada uma, para que o motor saiba a qual linha uma coluna pertence.
e1= a linha externa que está sendo testada.e2= a varredura interna da tabela.
Remova os apelidos e dept_id se torna ambíguo; muitos motores então o associam silenciosamente à tabela interna, rompendo a correlação. Os entrevistadores costumam criar exatamente esse erro.
Subconsulta correlacionada em SELECT
As subconsultas correlacionadas não se limitam a WHERE. Em uma lista de SELECT, elas produzem uma coluna calculada, novamente avaliada para cada linha externa.
Abaixo, cada pedido mostra quantos outros pedidos o mesmo cliente fez. A contagem interna é correlacionada por meio de o.customer_id.
SELECT o.order_id,
o.customer_id,
(SELECT COUNT(*)
FROM orders o2
WHERE o2.customer_id = o.customer_id) AS customer_order_count
FROM orders o;Escalar significa exatamente um valor
Uma subconsulta correlacionada usada em SELECT ou comparada com =, >, < deve retornar um único valor escalar para cada linha externa.
Se retornar mais de uma linha, o banco de dados gerará um erro como "a subconsulta retorna mais de uma linha."
Agregações como COUNT, MAX ou AVG garantem um valor, por isso são comuns em subconsultas correlacionadas escalares. Conhecer essa regra evita uma surpresa frequente durante a execução.
Quando a subconsulta retorna NULL
Uma subconsulta correlacionada escalar pode encontrar zero linhas internas. Uma agregação então retorna NULL (ou, no caso de COUNT, retorna 0).
Esse NULL é propagado para a expressão externa. Comparações com NULL produzem UNKNOWN, portanto a linha externa pode ser excluída silenciosamente.
Se precisar de um valor alternativo, envolva a subconsulta em COALESCE. Os entrevistadores gostam de perguntar o que acontece quando nenhuma linha interna corresponde, esperando que você mencione o comportamento de NULL.
SELECT c.customer_id,
COALESCE((SELECT MAX(o.amount)
FROM orders o
WHERE o.customer_id = c.customer_id), 0) AS biggest_order
FROM customers c;Exemplo resolvido: data do pedido mais recente
Uma tarefa comum: mostrar cada cliente com a data de seu pedido mais recente. Uma subconsulta correlacionada em SELECT faz isso diretamente.
Para cada linha de cliente, a consulta interna encontra a data máxima do pedido para esse cliente por meio de o.customer_id = c.customer_id.
SELECT c.customer_id,
c.name,
(SELECT MAX(o.order_date)
FROM orders o
WHERE o.customer_id = c.customer_id) AS last_order_date
FROM customers c;Por que pode ser lenta
Como a consulta interna é executada uma vez por linha externa, uma subconsulta correlacionada sobre uma tabela externa grande pode gerar milhões de execuções internas.
- Um índice na coluna correlacionada (neste caso,
orders.customer_id) permite que cada execução interna termine rapidamente. - Sem um índice, cada execução pode percorrer a tabela inteira, resultando em aproximadamente O(n*m) de trabalho.
Em entrevistas, sempre mencione o índice e a reescrita para uma junção como formas de melhorar o desempenho.
Correlacionada e não correlacionada, lado a lado
A diferença está em uma linha. A versão não correlacionada compara todos com a média da empresa; a versão correlacionada compara cada pessoa com seu próprio departamento.
Leia ambas e observe como a única linha WHERE e2.dept_id = e1.dept_id muda todo o significado.
-- Uncorrelated: one global average, computed once
SELECT name FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
-- Correlated: per-department average, recomputed per row
SELECT e1.name FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary) FROM employees e2
WHERE e2.dept_id = e1.dept_id
);Verificação rápida
Teste sua compreensão do que define uma subconsulta correlacionada.
Recapitulação: anatomia de uma subconsulta correlacionada
Principais conclusões:
- Uma subconsulta correlacionada faz referência à linha externa e é executada uma vez por linha externa.
- Crie um apelido para ambas as tabelas quando forem a mesma tabela, para manter a correlação sem ambiguidades.
- O uso escalar deve retornar exatamente um valor; nenhuma correspondência produz NULL, portanto proteja com
COALESCE. - Ela pode estar em SELECT ou WHERE, e o desempenho depende da indexação da coluna correlacionada.
Diga "é executada uma vez por linha externa" na entrevista e você terá dominado o conceito central.
Perguntas Frequentes
A aula “Anatomia de uma subconsulta correlacionada” é grátis?
Sim — o texto completo de “Anatomia de uma subconsulta correlacionada” é 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 Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.
O que vou aprender em “Anatomia de uma subconsulta correlacionada”?
Entenda como a consulta interna referencia a linha externa e o modelo de execução por linha. Você pratica SQL Interview Prep 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 Interview Prep?
Nenhuma experiência prévia é necessária. SQL Interview Prep 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 1 de 4.
Quanto tempo leva a aula “Anatomia de uma subconsulta correlacionada”?
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 Interview Prep?
Sim. Cada aula de SQL Interview Prep 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
- Anatomia de uma subconsulta correlacionada
- Agregações por grupo sem GROUP BY
- EXISTS e NOT EXISTS correlacionados
- Reescrevendo subconsultas correlacionadas como junções