🚀 Novembro começou! O SQLtest.online continua gratuito graças às doações de pessoas como você. Ajude-nos a atingir a meta deste mês mais cedo para que o site continue funcionando sem interrupções. Apoiar agora →
Código SQL copiado para a área de transferência

Introdução às Subconsultas: consultas aninhadas e Inline View

Lição 6.1 · Tempo de leitura: ~7 min · Tarefas para praticar ↓

Uma subconsulta em SQL permite dividir um problema em várias etapas dentro de uma única instrução. Nesta lição, você vai entender a ideia central de subconsultas, os principais tipos e como usá-las em SELECT, WHERE e FROM com exemplos da base Sakila.

Nas lições anteriores, você aprendeu a recuperar dados e combinar tabelas com JOIN. Mas em tarefas reais, muitas vezes é preciso calcular um resultado intermediário primeiro e só depois usá-lo na consulta principal.

É exatamente para isso que servem as subconsultas: elas deixam a lógica SQL mais sequencial e mais fácil de entender.

Diagrama de subconsultas SQL mostrando a execução primeiro da consulta interna, depois da externa, e o uso em SELECT, WHERE e FROM

O que é uma subconsulta

Uma subconsulta é uma instrução SELECT aninhada dentro de outra consulta SQL. A consulta que contém a subconsulta é chamada de consulta externa.

A subconsulta é sempre escrita entre parênteses ().

Como a subconsulta é executada

Na maioria dos casos, o SGBD executa primeiro a consulta interna. Em seguida, o resultado é passado para a consulta externa, que conclui o filtro ou monta o conjunto final de dados.

-- Exemplo conceitual
SELECT column_name
FROM table_name
WHERE column_name = (SELECT value FROM another_table);

Nota: a expressão entre parênteses é calculada primeiro e depois a condição do WHERE externo é aplicada.


Tipos principais de subconsultas

  • Subconsulta escalar: retorna um valor (uma linha, uma coluna).
  • Subconsulta de múltiplas linhas: retorna uma lista de valores (uma coluna, várias linhas).
  • Subconsulta tabular (Inline View): retorna um conjunto de linhas e colunas usado como tabela temporária.

Subconsulta em SELECT

Você pode colocar subconsultas diretamente na lista SELECT quando precisa exibir uma métrica adicional ao lado das colunas principais sem mudar a granularidade do resultado. Isso é especialmente útil quando um JOIN poderia duplicar linhas ou exigir agregações mais pesadas.

Cenário 1: mostrar o último pagamento de cada cliente (data e valor).

SELECT
    c.customer_id,
    c.first_name,
    c.last_name,
    (
        SELECT p.payment_date
        FROM payment AS p
        WHERE p.customer_id = c.customer_id
        ORDER BY p.payment_date DESC
        LIMIT 1
    ) AS last_payment_date,
    (
        SELECT p.amount
        FROM payment AS p
        WHERE p.customer_id = c.customer_id
        ORDER BY p.payment_date DESC
        LIMIT 1
    ) AS last_payment_amount
FROM
    customer AS c
LIMIT 10;

Resultado: para cada cliente, você obtém exatamente um pagamento "mais recente". Com JOIN, isso costuma ser mais complexo: primeiro calcula-se a data máxima, depois faz-se nova junção e tratamento de empates.

Cenário 2: mostrar cada pagamento e seu desvio em relação à média de pagamentos do cliente.

SELECT
    p.payment_id,
    p.customer_id,
    p.amount,
    (
        SELECT AVG(p2.amount)
        FROM payment AS p2
        WHERE p2.customer_id = p.customer_id
    ) AS customer_avg_amount,
    p.amount - (
        SELECT AVG(p3.amount)
        FROM payment AS p3
        WHERE p3.customer_id = p.customer_id
    ) AS delta_from_customer_avg
FROM
    payment AS p
LIMIT 15;

Resultado: cada linha de pagamento mantém a granularidade original e recebe um benchmark por cliente. Com JOIN, seria preciso criar uma tabela agregada separada e depois fazer uma junção extra.


Subconsulta em WHERE

O caso mais comum é a subconsulta dentro de WHERE, quando o filtro depende de um valor calculado dinamicamente.

Cenário: encontrar filmes com replacement_cost acima da média de todos os filmes.

SELECT
    title,
    replacement_cost
FROM
    film
WHERE
    replacement_cost > (
        SELECT AVG(replacement_cost)
        FROM film
    );

Resultado: a consulta interna calcula a média e a consulta externa retorna os filmes acima desse valor.


Subconsulta em FROM (Inline View)

Quando a subconsulta é colocada em FROM, ela funciona como uma tabela temporária dentro da consulta atual. Esse padrão é chamado Inline View.

Importante: toda Inline View precisa de alias.

Cenário: obter clientes ativos e seus pagamentos.

SELECT
    active_cust.first_name,
    p.amount
FROM
    (
        SELECT
            customer_id,
            first_name
        FROM
            customer
        WHERE
            active = 1
    ) AS active_cust
INNER JOIN
    payment AS p ON active_cust.customer_id = p.customer_id;

Resultado: a consulta externa junta o resultado da subconsulta active_cust com payment.


Quando a subconsulta é mais prática que JOIN

  • Para lógica por etapas, quando você precisa primeiro de um valor intermediário.
  • Para filtrar por agregados (AVG, MAX, MIN) sem complicar a consulta principal.
  • Para cenários de ausência de relacionamento, em que NOT IN ou NOT EXISTS costumam ser opções naturais.

Principais conclusões desta lição:

  • Uma subconsulta é um SELECT dentro de outra consulta SQL.
  • A consulta interna geralmente executa antes da consulta externa.
  • A subconsulta pode retornar um valor, uma lista de valores ou um conjunto tabular completo.
  • A subconsulta em FROM é chamada Inline View e exige alias.
  • Subconsultas ajudam a escrever SQL mais claro e flexível.

Perguntas frequentes

Qual é a diferença entre subconsulta em WHERE e em FROM?

Subconsulta em WHERE normalmente serve para filtrar linhas da consulta externa. Subconsulta em FROM cria um conjunto temporário (Inline View) que pode ser unido e processado depois.

Preciso sempre dar alias para subconsulta em FROM?

Sim. Na maioria dos SGBDs, a subconsulta em FROM precisa obrigatoriamente de alias. Sem isso, a consulta falha.

Perguntas de entrevista

O que é uma subconsulta e como ela executa?

Uma subconsulta é um SELECT aninhado dentro de uma consulta SQL externa. Em geral, a consulta interna executa primeiro e a externa usa esse resultado para filtrar ou montar o resultado final.

Qual é a diferença entre subconsulta escalar e subconsulta de múltiplas linhas?

Uma subconsulta escalar retorna um valor e normalmente trabalha com = ou >. Uma subconsulta de múltiplas linhas retorna um conjunto de valores e é usada com IN, ANY ou ALL.

O que é Inline View em SQL?

Uma Inline View é uma subconsulta em FROM que se comporta como tabela temporária dentro de uma única consulta. Ela precisa de alias para que suas colunas possam ser referenciadas.

Tente resolver as tarefas a seguir para reforcar o que voce aprendeu nesta licao.

  1. O que é uma subconsulta?
  2. Encontre filmes com o maior custo de substituição
  3. Encontre atores mais populares que HENRY BERRY
  4. Clientes com um alto número de aluguéis
  5. Aeronaves com condições tarifárias completas