0Pricing
Coding Interview Prep · Aula

Subconsultas na cláusula FROM (tabelas derivadas)

Envolva uma consulta em uma tabela virtual e entenda por que aliases são obrigatórios.

Subconsultas na cláusula FROM (tabelas derivadas) é uma aula grátis de Coding Interview Prep 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 Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.

O que é uma Tabela Derivada

Uma subconsulta na cláusula FROM é chamada de tabela derivada (ou visualização embutida). Em vez de retornar um único valor, ela retorna um conjunto completo de resultados que a consulta externa trata como se fosse uma tabela real.

  • Ela pode ter várias linhas e várias colunas.
  • Você pode consultá-la, fazer junções com ela e filtrá-la como qualquer tabela.

Os entrevistadores usam tabelas derivadas para avaliar se você consegue dividir um problema em etapas.

Nomes Alternativos São Obrigatórios

A principal armadilha: uma tabela derivada deve ter um nome alternativo. Sem ele, a maioria dos mecanismos rejeita a consulta.

  • MySQL: toda tabela derivada deve ter seu próprio nome alternativo.
  • Postgres: a subconsulta em FROM deve ter um nome alternativo.

Dê-lhe um nome (aqui, dept_avg) e você poderá referenciar suas colunas usando esse nome.

SELECT dept_avg.dept_id, dept_avg.avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS dept_avg;

Por que Pré-Agregar em uma Tabela Derivada

Um problema frequente em entrevistas: mostrar cada funcionário ao lado do salário médio de seu departamento. Não é possível misturar diretamente a linha detalhada com uma agregação sem criar problemas de agrupamento.

A abordagem mais clara é calcular a média por departamento em uma tabela derivada e depois fazer uma junção dela com as linhas detalhadas. Primeiro, a tabela derivada é reduzida a uma linha por departamento.

SELECT e.name, e.salary, d.avg_salary
FROM employees e
JOIN (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d ON e.dept_id = d.dept_id;

Filtrando um Resultado de Agregação

As tabelas derivadas permitem filtrar uma agregação calculada sem fazer manobras com HAVING na consulta externa. Suponha que desejemos apenas os departamentos cuja média salarial seja superior a 60000.

Agregamos os dados internamente e depois aplicamos um WHERE simples à coluna derivada externamente. Para a consulta externa, avg_salary é uma coluna comum.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d
WHERE avg_salary > 60000;

Dois Níveis de Agregação

As tabelas derivadas são especialmente úteis quando você precisa de uma agregação de uma agregação — uma pergunta clássica de entrevista: qual é a média dos salários médios por departamento?

Não é possível aninhar AVG(AVG(...)) diretamente. A consulta interna produz uma média por departamento; a consulta externa calcula a média dessas médias.

SELECT AVG(avg_salary) AS avg_of_dept_avgs
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d;

Dando Nomes às Colunas Calculadas

Qualquer expressão em uma tabela derivada precisa de um nome alternativo para que você possa referenciá-la externamente. Caso contrário, a expressão interna salary * 12 teria um nome atribuído pelo banco de dados no qual não se pode confiar.

Sempre dê nomes alternativos às colunas calculadas — os entrevistadores percebem quando você faz referência a uma expressão sem nome e presume um nome de coluna que pode não existir.

SELECT name, annual_salary
FROM (
  SELECT name, salary * 12 AS annual_salary
  FROM employees
) AS yearly
WHERE annual_salary > 100000;

Fazendo uma Junção entre Duas Tabelas Derivadas

Você pode fazer uma junção entre várias tabelas derivadas. Aqui, comparamos a quantidade de funcionários de cada departamento com sua folha de pagamento total, fazendo uma junção entre duas subconsultas pré-agregadas.

Cada tabela derivada responde a uma subpergunta; a junção integra as respostas no relatório final. Esse raciocínio em etapas é exatamente o que entrevistas de nível intermediário valorizam.

SELECT c.dept_id, c.headcount, p.payroll
FROM (
  SELECT dept_id, COUNT(*) AS headcount
  FROM employees GROUP BY dept_id
) AS c
JOIN (
  SELECT dept_id, SUM(salary) AS payroll
  FROM employees GROUP BY dept_id
) AS p ON c.dept_id = p.dept_id;

Escopo: a Consulta Externa Não Pode Ver o Interior

Uma regra importante: a consulta externa só pode referenciar as colunas que a tabela derivada disponibiliza em sua lista de SELECT. As colunas usadas apenas dentro da subconsulta ficam invisíveis externamente.

Se a consulta interna selecionar dept_id e avg_salary, então salary ou name não estarão disponíveis externamente — foram consumidas pela agregação. Os entrevistadores exploram esse limite de escopo.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
) AS d;

Tabela Derivada versus CTE

Uma tabela derivada e uma Expressão de Tabela Comum (CTE) frequentemente produzem o mesmo plano. Os entrevistadores podem perguntar por que você escolheria uma delas:

  • Tabela derivada: inserida diretamente, adequada para um uso pontual.
  • CTE (WITH): nomeada no início, legível e reutilizável se for referenciada várias vezes.

Para uma lógica profundamente aninhada, um fluxo de CTEs é lido de cima para baixo; uma tabela derivada é lida de dentro para fora.

WITH dept_avg AS (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
)
SELECT * FROM dept_avg WHERE avg_salary > 60000;

A Subconsulta LATERAL / Correlacionada em FROM

Normalmente, uma subconsulta em FROM não pode fazer referência às linhas da consulta externa. LATERAL (Postgres) ou CROSS APPLY (SQL Server) elimina essa restrição, permitindo que a tabela derivada seja executada para cada linha externa.

Isso possibilita buscas dos N maiores resultados por linha. Conhecer essa palavra-chave demonstra conhecimento avançado, mesmo em uma entrevista de nível intermediário.

SELECT d.dept_name, top_emp.name, top_emp.salary
FROM departments d
CROSS JOIN LATERAL (
  SELECT name, salary FROM employees e
  WHERE e.dept_id = d.id
  ORDER BY salary DESC LIMIT 1
) AS top_emp;

Frase para a entrevista

Se lhe perguntarem sobre subconsultas na cláusula FROM, diga: "Uma tabela derivada é uma subconsulta em FROM que retorna um conjunto de resultados que a consulta externa usa como uma tabela. Ela precisa ter um nome alternativo, a consulta externa só pode ver as colunas selecionadas por ela e é ideal para fazer uma pré-agregação antes de uma junção ou para agregar um resultado já agregado."

Acrescente que LATERAL permite que ela faça referência às linhas externas, e terá abordado todos os pontos importantes.

Verificação rápida

Escolha a afirmação que é sempre necessária para uma subconsulta na cláusula FROM.

Revisão

Tabelas derivadas, consolidadas:

  • Uma subconsulta em FROM retorna uma tabela virtual — muitas linhas e muitas colunas.
  • Ela precisa ter um nome alternativo; a consulta externa vê apenas as colunas selecionadas por ela.
  • Use-a para fazer uma pré-agregação antes de uma junção, filtrar por agregados ou agregar um resultado já agregado.
  • Uma CTE é a alternativa nomeada e legível; LATERAL/CROSS APPLY permitem que ela faça referência às linhas externas.

A seguir: subconsultas de pertencimento a conjuntos com IN, ANY e ALL.

Perguntas Frequentes

A aula “Subconsultas na cláusula FROM (tabelas derivadas)” é grátis?

Sim — o texto completo de “Subconsultas na cláusula FROM (tabelas derivadas)” é 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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.

O que vou aprender em “Subconsultas na cláusula FROM (tabelas derivadas)”?

Envolva uma consulta em uma tabela virtual e entenda por que aliases são obrigatórios. Você pratica Coding 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 Coding Interview Prep?

Nenhuma experiência prévia é necessária. Coding 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 2 de 4.

Quanto tempo leva a aula “Subconsultas na cláusula FROM (tabelas derivadas)”?

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 Coding Interview Prep?

Sim. Cada aula de Coding 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

  1. Subconsultas escalares em SELECT e WHERE
  2. Subconsultas na cláusula FROM (tabelas derivadas)
  3. Subconsultas com IN, ANY e ALL
  4. Desempenho de EXISTS versus IN
← Voltar para Coding Interview Prep