Voltar para a lista de artigos Artigos
7 minutos de leitura

Quais são os diferentes tipos de subconsultas SQL?

As subconsultas podem ser usadas em muitos casos de negócios. Que tipos de subconsultas SQL oferecem? E como você pode usá-los eficientemente? Neste artigo, eu o guiarei através de diferentes tipos de subconsultas e as situações típicas quando elas forem úteis.

O que é uma subconsulta SQL?

Uma subconsulta, ou consulta aninhada, é uma consulta colocada dentro de outra consulta SQL. Há muitos cenários diferentes onde você pode querer incluir uma consulta nas cláusulas WHERE, FROM, ou SELECT de sua consulta principal.

É sempre mais fácil compreender novos conceitos quando eles são apresentados com exemplos. Então, vamos começar! Imagine que nós administramos várias galerias de arte e temos as seguintes tabelas em nosso banco de dados:

galleries

idcity
1London
2New York
3Munich

paintings

idnamegallery_idprice
1Patterns35000
2Ringer14500
3Gift13200
4Violin Lessons26700
5Curiosity29800

sales_agents

idlast_namefirst_namegallery_idagency_fee
1BrownDenis22250
2WhiteKate33120
3BlackSarah21640
4SmithHelen14500
5StewartTom32130

managers

idgallery_id
12
23
41

Um dos casos mais simples de uso da subconsulta é incluí-la na cláusula WHERE para filtrar os resultados. Por exemplo, se você quisesse ver informações apenas sobre os agentes de vendas que receberam uma taxa de agência superior à média no mês passado, você poderia usar a seguinte consulta SQL:

SELECT *
FROM sales_agents
WHERE agency_fee > 
(SELECT AVG(agency_fee)
 FROM sales_agents);

Aqui, sua subconsulta calcula a taxa média de agência que sua equipe de vendas recebeu no mês passado e retorna um valor único ($2728). Então você usa este valor para filtrar os resultados de sua consulta principal e informações de retorno somente para aqueles agentes de vendas cuja taxa de agência foi maior do que a média:

idlast_namefirst_namegallery_idagency_fee
2WhiteKate33120
4SmithHelen14500

As subconsultas SQL podem retornar valores únicos ou tabelas inteiras. Pode haver subconsultas aninhadas ou subconsultas correlatas. Cada um destes tipos de subconsultas funciona bem para certos casos de uso. Se você quiser informações mais detalhadas sobre isto, leia nosso guia para iniciantes em subconsultas SQL. Neste artigo, vou fornecer exemplos de diferentes tipos de subconsultas em SQL e guiá-lo através dos cenários típicos quando este tipo de subconsulta é particularmente útil.

Subconsultas Scalar

Quando uma subquisição retorna um único valor, ou exatamente uma linha e exatamente uma coluna, nós a chamamos de subquisição escalar. Este tipo de subconsulta é freqüentemente usado na cláusula WHERE para filtrar os resultados da consulta principal. A subconsulta em nosso exemplo anterior é uma subconsulta escalar, pois retorna um único valor (ou seja, a taxa de agência média).

As subconsultas escalares também podem ser usadas na declaração SELECT da consulta principal. Por exemplo, digamos que queremos ver o preço médio de todas as nossas pinturas ao lado do preço de cada pintura.

SELECT name AS painting,
	 price,
	 (SELECT AVG(price)
  FROM paintings) AS avg_price
FROM paintings;

A subconsulta aqui retorna um valor escalar ($5840) que é simplesmente adicionado a cada linha da tabela resultante:

paintingpriceavg_price
Patterns50005840
Ringer45005840
Gift32005840
Violin Lessons67005840
Curiosity98005840

Note que a subconsulta (também chamada de consulta interna) neste exemplo é totalmente independente da consulta principal (também chamada de consulta externa) - você pode executar a consulta interna por conta própria e obter um resultado significativo.

Subconsultas de Múltiplas Linhas

Se sua subconsulta retornar mais de uma fila, ela pode ser referida como uma subconsulta de múltiplas filas. Observe que este tipo de subconsulta inclui (1) subconsultas que retornam uma coluna com múltiplas linhas (ou seja, uma lista de valores) e (2) subconsultas que retornam múltiplas colunas com múltiplas linhas (ou seja, tabelas).

As subconsultas que retornam uma coluna e múltiplas linhas são freqüentemente incluídas na cláusula WHERE para filtrar os resultados da consulta principal. Neste caso, elas são normalmente usadas com operadores como IN, NOT IN, ANY, ALL, EXISTS, ou NOT EXISTS que permitem aos usuários comparar um determinado valor com os valores da lista retornada pela subconsulta.

Deseja saber mais sobre as Subconsultas SQL com o operador IN? Assista a um episódio de nossa série We Learn SQL no Youtube. Lembre-se de assinar o nosso canal.

Por exemplo, digamos que você queira calcular a taxa média de agência para aqueles agentes que não são gerentes. Você pode usar a seguinte subconsulta para responder a esta pergunta:

SELECT AVG(agency_fee)
FROM sales_agents
WHERE id NOT IN (SELECT id
                 FROM managers);

A consulta interna retornará uma lista de todas as identificações dos gerentes. Então a consulta externa filtra somente os agentes de vendas que não estão na lista de gerentes e calcula uma taxa média de agência paga a esses agentes. A consulta retorna um único valor - a taxa média de agência paga aos não-gerentes ($1885).

Confira nosso guia de subconsultas SQL para mais exemplos de subconsultas de várias linhas.

Subconsultas correlatas

Há também subconsultas SQL onde a consulta interna se baseia em informações obtidas da consulta externa. Estas são subconsultas correlacionadas. Devido à interdependência entre a consulta principal e a consulta interna, este tipo de subconsulta pode ser mais difícil de entender. Leia este guia para iniciantes para se tornar mais proficiente com subconsultas correlatas em SQL.

Mais uma vez, vamos direto para os exemplos! As subconsultas correlatas são comumente usadas nas instruções SELECT, WHERE e FROM.

Se quisermos calcular o número de pinturas encontradas em cada uma de nossas galerias, podemos utilizar a seguinte consulta. Observe a subconsulta correlata na declaração SELECT:

SELECT city, 
 (SELECT count(*)
  FROM paintings p
  WHERE g.id = p.gallery_id) total_paintings
FROM galleries g;

Aqui, a subconsulta retorna um valor escalar com o número total de pinturas na galeria correspondente. A consulta principal exibe esta informação junto com a cidade onde a galeria de arte está localizada.

citytotal_paintings
London2
New York2
Munich1

Você também pode ver que, em contraste com nossos exemplos anteriores, aqui a consulta interna depende da consulta externa. Nós retiramos o ID da galeria do galleries tabela, que está na consulta externa. Em outras palavras, não é possível executar a consulta interna como uma consulta independente - ela apenas jogará um erro.

Note também que, neste caso, você poderia usar JOIN em vez de uma subconsulta e obter o mesmo resultado:

SELECT g.city, count(p.name) AS total_paintings
FROM galleries g
JOIN paintings p
ON g.id = p.gallery_id
GROUP BY g.city;

Os JOINs normalmente realizam mais rápido do que as subconsultas. Entretanto, se você achar as subconsultas mais intuitivas para seu caso particular, não há problema em usá-las. Você pode ler mais sobre o uso de subconsultas vs. JOINs em nosso guia abrangente.

Finalmente, as subconsultas correlatas também podem ser usadas na declaração ONDE. Por exemplo, digamos que queremos obter informações sobre os agentes de vendas cuja taxa de agência foi igual ou superior à taxa média para sua galeria. Podemos fazer a seguinte consulta para obter o resultado desejado:

SELECT last_name, 
       first_name, 
       agency_fee
FROM sales_agents sa1
WHERE sa1.agency_fee >= (SELECT avg(agency_fee)
                         FROM sales_agents sa2 
                         WHERE sa2.gallery_id = sa1.gallery_id);

A consulta interna, neste caso, retorna a taxa de agência média para a galeria do respectivo agente de vendas. A consulta externa retorna as informações sobre apenas os agentes de venda que satisfazem a condição incluída na declaração WHERE (ou seja, uma taxa de agência igual ou maior que a média de sua galeria).

last_namefirst_nameagency_fee
BrownDenis2250
WhiteKate3120
SmithHelen4500

Novamente, a subconsulta neste exemplo é uma subconsulta correlata, pois não pode ser executada independentemente da consulta externa. Se você quiser saber mais, confira este tutorial fácil de seguir sobre como escrever subconsultas correlatas.

Mesmo que diferentes tipos de subconsultas SQL cubram muitas situações típicas, há alguns casos em que você pode querer usar Expressões de Tabela Comum (CTEs) em vez de subconsultas. Se você estiver interessado em aprender mais sobre os CTEs, confira este artigo que o guiará através das diferenças entre subconsultas e CTEs.

Tempo para praticar diferentes tipos de subconsultas SQL!

Você aprendeu que existem muitos tipos de subconsultas em SQL. Dependendo da tarefa em mãos, você pode aplicar subconsultas escalares, multi-linhas ou correlatas para obter o resultado que você precisa.

Já percorremos vários exemplos de subconsultas e descobrimos onde você pode utilizá-las. Entretanto, para se tornar um usuário SQL realmente poderoso, você precisa de mais prática com diferentes tipos de subconsultas. Chegou a hora dos exercícios interativos!

Nosso SQL para Iniciantes O curso tem uma seção abrangente sobre subconsultas, onde explicações detalhadas e exemplos são combinados com dezenas de exercícios. Confira! Para obter prática adicional, também recomendo completar a seção de Subconsultas na seção de Curso de Práticas em SQL.

Mais prática = mais consultas SQL profissionais! Feliz aprendizado!