Subconsultas correlacionadas
Uma subconsulta que depende da linha externa.
Subconsultas correlacionadas é uma aula grátis de SQL Academy 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 Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
O que é uma subconsulta correlacionada?
Uma subconsulta correlacionada é uma subconsulta que faz referência a uma coluna da consulta externa (que a contém). Diferentemente de uma subconsulta comum, que é executada uma vez e retorna um resultado fixo, uma subconsulta correlacionada é avaliada uma vez para cada linha processada pela consulta externa.
Isso as torna poderosas para comparações linha a linha, mas também mais dispendiosas do que subconsultas simples.
Subconsulta simples vs correlacionada
A principal diferença é que uma subconsulta comum não faz referência à consulta externa e pode funcionar de forma independente. Uma subconsulta correlacionada depende da linha externa — você pode ver o alias da tabela externa aparecendo dentro da subconsulta.
No exemplo abaixo, o SELECT interno faz referência a e1.department_id da consulta externa, criando a correlação.
-- Regular subquery (runs once)
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
-- Correlated subquery (runs once per outer row)
SELECT name, salary, department_id
FROM employees e1
WHERE salary > (
SELECT AVG(salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
);Configurando as tabelas de exemplo
Vamos criar duas tabelas que usaremos ao longo desta lição: employees e departments. Elas fornecem dados realistas para demonstrar subconsultas correlacionadas em diferentes cenários.
CREATE TABLE departments (
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
department_id INT REFERENCES departments(id),
salary NUMERIC(10,2),
hire_date DATE
);
INSERT INTO departments VALUES (1,'Engineering'),(2,'Sales'),(3,'HR');
INSERT INTO employees VALUES
(1,'Alice', 1, 90000, '2020-03-01'),
(2,'Bob', 1, 75000, '2021-06-15'),
(3,'Carol', 2, 60000, '2019-01-10'),
(4,'David', 2, 68000, '2022-09-01'),
(5,'Eve', 3, 55000, '2020-07-20'),
(6,'Frank', 1, 95000, '2018-11-05'),
(7,'Grace', 3, 52000, '2023-02-28'),
(8,'Henry', 2, 71000, '2021-04-12');Funcionários que ganham acima da média do departamento
Um caso de uso clássico para subconsultas correlacionadas: encontrar todos os funcionários cujo salário excede o salário médio do próprio departamento. A consulta interna recalcula a média do departamento para cada linha de funcionário na consulta externa.
SELECT e1.name, e1.department_id, e1.salary
FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
)
ORDER BY e1.department_id, e1.salary DESC;Usando subconsultas correlacionadas em SELECT
As subconsultas correlacionadas não se limitam à cláusula WHERE — elas também podem aparecer na lista SELECT para calcular um valor para cada linha. Aqui, buscamos o salário de cada funcionário junto com o salário médio do seu departamento, tudo em uma única consulta.
SELECT
e.name,
e.salary,
(
SELECT ROUND(AVG(e2.salary), 2)
FROM employees e2
WHERE e2.department_id = e.department_id
) AS dept_avg_salary
FROM employees e
ORDER BY e.department_id, e.name;Encontrando o funcionário mais bem pago por departamento
Podemos usar uma subconsulta correlacionada para encontrar o funcionário com o salário máximo em cada departamento. A consulta interna encontra o salário máximo do departamento da linha atual, e a consulta externa mantém apenas a linha correspondente.
SELECT e1.name, e1.department_id, e1.salary
FROM employees e1
WHERE e1.salary = (
SELECT MAX(e2.salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
)
ORDER BY e1.department_id;EXISTS com uma subconsulta correlacionada
O operador EXISTS é frequentemente combinado com subconsultas correlacionadas. Ele retorna TRUE se a consulta interna produzir pelo menos uma linha. Aqui, listamos todos os departamentos que têm pelo menos um funcionário contratado antes de 2021.
SELECT d.name AS department
FROM departments d
WHERE EXISTS (
SELECT 1
FROM employees e
WHERE e.department_id = d.id
AND e.hire_date < '2021-01-01'
);NOT EXISTS com uma subconsulta correlacionada
NOT EXISTS é o oposto — retorna TRUE quando a subconsulta correlacionada não encontra nenhuma linha correspondente. Isso é útil para encontrar registros principais que não têm registros dependentes, como departamentos sem funcionários.
SELECT d.name AS department_without_employees
FROM departments d
WHERE NOT EXISTS (
SELECT 1
FROM employees e
WHERE e.department_id = d.id
);Subconsulta correlacionada em UPDATE
As subconsultas correlacionadas também funcionam dentro de instruções UPDATE. O exemplo a seguir adiciona uma coluna dept_avg e, em seguida, usa uma subconsulta correlacionada para preenchê-la com o salário médio do departamento de cada funcionário.
ALTER TABLE employees ADD COLUMN dept_avg NUMERIC(10,2);
UPDATE employees e1
SET dept_avg = (
SELECT ROUND(AVG(e2.salary), 2)
FROM employees e2
WHERE e2.department_id = e1.department_id
);
SELECT name, salary, dept_avg FROM employees ORDER BY department_id, name;Subconsulta correlacionada em DELETE
Você também pode usar uma subconsulta correlacionada em uma instrução DELETE para remover linhas com base em dados de uma tabela relacionada. A consulta abaixo exclui funcionários cujo salário seja inferior a 60% da média do departamento — um padrão de limpeza de dados.
DELETE FROM employees e1
WHERE e1.salary < (
SELECT AVG(e2.salary) * 0.60
FROM employees e2
WHERE e2.department_id = e1.department_id
);
SELECT name, salary, department_id FROM employees ORDER BY department_id;Dica de desempenho: subconsulta correlacionada vs JOIN
As subconsultas correlacionadas são executadas uma vez por linha externa, o que pode ser lento em tabelas grandes. Muitas subconsultas correlacionadas podem ser reescritas como um JOIN com uma tabela derivada ou uma CTE para obter um desempenho melhor. Entenda os dois padrões e escolha com base na legibilidade e no plano de execução.
-- Correlated version (potentially slower)
SELECT e1.name, e1.salary
FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
);
-- Equivalent JOIN + derived table (often faster)
SELECT e.name, e.salary
FROM employees e
JOIN (
SELECT department_id, AVG(salary) AS avg_sal
FROM employees
GROUP BY department_id
) dept_avg ON dept_avg.department_id = e.department_id
WHERE e.salary > dept_avg.avg_sal;Verificação rápida
Teste sua compreensão sobre subconsultas correlacionadas.
Recapitulação: subconsultas correlacionadas
Nesta lição, você aprendeu que uma subconsulta correlacionada faz referência a uma coluna da consulta externa e é reavaliada para cada linha externa. Principais pontos:
- Elas podem aparecer em SELECT, WHERE, UPDATE e DELETE.
- EXISTS / NOT EXISTS combinam naturalmente com subconsultas correlacionadas para verificar a existência de linhas relacionadas.
- São expressivas, mas podem ser lentas — considere reescrevê-las como um JOIN quando o desempenho for importante.
- O alias da tabela externa dentro da subconsulta é o que cria a correlação.
Perguntas Frequentes
A aula “Subconsultas correlacionadas” é grátis?
Sim — o texto completo de “Subconsultas 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”?
Uma subconsulta que depende da linha externa. 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 1 de 4.
Quanto tempo leva a aula “Subconsultas 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 correlacionadas
- EXISTS e NOT EXISTS
- IN versus ANY versus ALL
- Desempenho de EXISTS versus JOIN