Nos módulos anteriores, aprendemos como recuperar dados de tabelas e uni-los. No entanto, às vezes uma única consulta não é suficiente para obter a resposta de que você precisa. Você pode precisar encontrar um valor primeiro (como uma média ou um ID específico) e depois usar esse valor em outra consulta. É aqui que entram as Subconsultas.
Uma Subconsulta (ou Consulta Interna) é uma instrução SELECT aninhada dentro de outra instrução SQL. A consulta que contém a subconsulta é chamada de Consulta Externa (ou Consulta Principal).
As subconsultas são sempre colocadas entre parênteses ().
Normalmente, o banco de dados executa a Consulta Interna primeiro. O resultado dessa consulta interna é então passado para a Consulta Externa, que o utiliza para completar sua própria execução.
-- Exemplo Conceitual
SELECT column_name
FROM table_name
WHERE column_name = (SELECT value FROM another_table);
^------- Isso executa primeiro -------^
As subconsultas são frequentemente categorizadas pelo tipo de dados que retornam:
FROM como se fosse uma tabela temporária.O uso mais comum de uma subconsulta é na cláusula WHERE para filtrar dados com base em um valor dinâmico.
Cenário: Encontrar filmes que tenham um custo de substituição superior à média do custo de substituição de todos os filmes.
SELECT
title,
replacement_cost
FROM
film
WHERE
replacement_cost > (SELECT AVG(replacement_cost) FROM film);
Quando você coloca uma subconsulta na cláusula FROM, ela é chamada de Inline View. Você está essencialmente criando uma tabela temporária "na hora" que existe apenas durante a execução dessa consulta.
Nota: Você deve dar um alias (apelido) a uma inline view.
Cenário: Obter uma lista de clientes ativos e uni-la aos seus dados de pagamento.
SELECT
active_cust.first_name,
p.amount
FROM
(SELECT * FROM customer WHERE active = 1) AS active_cust
INNER JOIN
payment AS p ON active_cust.customer_id = p.customer_id;
Nesse caso, a consulta externa une o resultado da subconsulta (active_cust) com a tabela payment.
AVG ou MAX) para filtrar linhas individuais.NOT IN ou NOT EXISTS.SELECT dentro de outra consulta.WHERE или SELECT.FROM e requerem um alias.