As subqueries (ou consultas internas) são ferramentas poderosas no SQL que
permitem aninhar uma consulta dentro de outra. Elas são geralmente divididas
em categorias baseadas em onde são usadas ou no tipo de dado que
retornam.
Aqui está o detalhamento dos principais tipos:
1. Pelo Retorno de Dados
Essa classificação foca no "formato" do resultado que a subquery entrega para
a consulta principal.
Subquery Escalar: Retorna um único valor (uma linha e uma coluna). É
muito usada em cláusulas SELECT ou em comparações diretas no
WHERE.
o Exemplo: Buscar produtos com preço acima da média.
Subquery de Linha: Retorna uma única linha, mas com múltiplas
colunas. Permite comparar vários valores de uma vez.
Subquery de Tabela (ou de Múltiplas Linhas): Retorna uma ou mais
colunas e várias linhas. Geralmente usada com os operadores IN, ANY
ou ALL.
2. Pela Relação com a Consulta Principal
Aqui o diferencial é se a subquery consegue "viver sozinha" ou se depende da
consulta externa.
Subquery Independente (Self-contained): É executada uma única vez.
O banco de dados resolve a subquery primeiro e passa o resultado para
a query principal.
Subquery Correlacionada: É uma subquery que faz referência a uma
coluna da consulta principal. Ela é executada repetidamente, uma vez
para cada linha processada pela consulta externa.
o Nota: Embora poderosas, elas tendem a ser mais lentas em
grandes volumes de dados.
3. Pela Localização no Código
Dependendo de onde você a "pendura" no seu comando SQL, ela assume
papéis diferentes:
Localização Nome Comum Propósito
Subquery de Cria uma coluna calculada dinamicamente
SELECT
Projeção para cada linha.
Inline View / Trata o resultado da subquery como se
FROM
Tabela Derivada fosse uma tabela temporária.
Localização Nome Comum Propósito
WHERE / Filtra os resultados da query principal com
Filtro de Subquery
HAVING base nos dados da subquery.
Bônus: Operadores Comuns
Ao trabalhar com subqueries de múltiplas linhas, você encontrará
frequentemente estes operadores:
EXISTS / NOT EXISTS: Verifica se a subquery retorna qualquer linha (muito
usado em subqueries correlacionadas).
IN / NOT IN: Verifica se um valor está dentro da lista retornada.
ANY / ALL: Compara um valor individual com cada valor da lista (ex: >
ANY significa "maior que o menor valor da lista").
Você está tentando otimizar uma consulta específica ou apenas explorando a
teoria para algum projeto?