Voltar para a lista de artigos Artigos
7 minutos de leitura

5 Exemplos de Subconsultas SQL

As subconsultas SQL são ferramentas básicas se você quiser se comunicar efetivamente com bancos de dados relacionais. Neste artigo, forneço cinco exemplos de subconsultas demonstrando como utilizar subconsultas escalares, multi-linhas e correlatas nas cláusulas WHERE, FROM/JOIN, e SELECT.

Uma subconsulta, ou consulta aninhada, é uma consulta colocada dentro de outra consulta SQL. Ao solicitar informações de um banco de dados, você pode achar necessário incluir uma subconsulta na cláusula SELECT, FROM, JOIN, ou WHERE. Entretanto, você também pode usar subconsultas ao atualizar o banco de dados (ou seja, nas declarações INSERT, UPDATE, e DELETE ).

Há vários tipos de subconsultas SQL:

  • Assubconsultas escalares retornam um único valor, ou exatamente uma linha e exatamente uma coluna.
  • As subconsultas com várias linhas também retornam:
    • Uma coluna com várias linhas (ou seja, uma lista de valores), ou
    • Múltiplas colunas com múltiplas linhas (ou seja, tabelas).
  • Subconsultas relacionadas, onde a consulta interna se baseia em informações obtidas da consulta externa.

Você pode ler mais sobre os diferentes tipos de subconsultas SQL em outros lugares; aqui, eu quero me concentrar em exemplos. Como todos sabemos, é sempre mais fácil compreender novos conceitos com casos de uso no mundo real. Então, vamos começar.

5 Exemplos de subconsultas em SQL

Digamos que administramos uma galeria de arte. Temos um banco de dados com quatro tabelas: paintings, artists, collectorse sales. Você pode ver os dados armazenados em cada tabela abaixo.

paintings
idnameartist_idlisted_price
11Miracle1300.00
12Sunshine1700.00
13Pretty woman22800.00
14Handsome man22300.00
15Barbie3250.00
16Cool painting35000.00
17Black square #1000350.00
18Mountains41300.00

artists
idfirst_namelast_name
1ThomasBlack
2KateSmith
3NataliWein
4FrancescoBenelli

collectors
idfirst_namelast_name
101BrandonCooper
102LauraFisher
103ChristinaBuffet
104SteveStevenson

sales
iddatepainting_idartist_idcollector_idsales_price
10012021-11-011321042500.00
10022021-11-101421022300.00
10032021-11-10111102300.00
10042021-11-151631034000.00
10052021-11-22153103200.00
10062021-11-2217310350.00

Agora vamos explorar estes dados usando consultas SQL com diferentes tipos de subconsultas.

Exemplo 1 - Subconsulta Scalar

Vamos começar com um exemplo simples: Queremos listar quadros que têm preços mais altos que a média. Basicamente, queremos obter nomes de quadros junto com os preços listados, mas somente para os que custam mais do que a média. Isso significa que primeiro precisamos encontrar este preço médio; é aqui que entra em jogo a subquisição escalar:

SELECT name, listed_price
FROM paintings
WHERE listed_price > (
    SELECT AVG(listed_price)
    FROM paintings
);

Nossa subconsulta está na cláusula WHERE, onde filtra o resultado definido com base no preço listado. Esta subconsulta retorna um único valor: o preço médio por pintura para nossa galeria. Cada preço listado é comparado a este valor, e somente as pinturas que têm um preço acima da média chegam ao resultado final:

namelisted_price
Pretty woman2800.00
Handsome man2300.00
Cool painting5000.00

Se isto parecer um pouco complicado, você pode querer verificar nossos dados interativos SQL para Iniciantes curso e aprimorar suas habilidades SQL essenciais.

Exemplos 2 - Subconsulta Multi-linha

Agora vamos analisar as subconsultas que retornam uma coluna com várias fileiras. Essas subconsultas são freqüentemente incluídas na cláusula WHERE para filtrar os resultados da consulta principal.

Suponhamos que queremos listar todos os colecionadores que compraram pinturas de nossa galeria. Podemos obter os resultados necessários utilizando uma subconsulta de várias linhas. Especificamente, podemos usar uma consulta interna para listar todos os IDs de colecionadores presentes na sales tabela - estes seriam IDs correspondentes aos colecionadores que fizeram pelo menos uma compra com nossa galeria. Então, na consulta externa, solicitamos o nome e sobrenome de todos os colecionadores cuja identificação está na saída da consulta interna. Aqui está o código:

SELECT first_name, last_name
FROM collectors
WHERE id IN (
    SELECT collector_id
    FROM sales
);

E aqui está a saída:

first_namelast_name
LauraFisher
ChristinaBuffet
SteveStevenson

Curiosamente, poderíamos obter o mesmo resultado sem uma subconsulta, usando um INNER JOIN (ou apenas JOIN). Este tipo de junção retorna apenas registros que podem ser encontrados em ambas as tabelas. Portanto, se unirmos o collectors e o sales tabelas, vamos obter uma lista de coletores com os registros correspondentes no sales mesa. Nota: Eu também usei a palavra-chave DISTINCT aqui para remover duplicatas da saída.

Aqui está a consulta:

SELECT DISTINCT collectors.first_name, collectors.last_name
FROM collectors
JOIN sales
  ON collectors.id = sales.collector_id;

Você pode ler mais sobre como escolher subquery vs. JOIN em outro lugar em nosso blog.

Exemplo 3 - Subconsulta com Múltiplas Linhas com Múltiplas Colunas

Quando uma subconsulta retorna uma tabela com múltiplas linhas e múltiplas colunas, essa subconsulta é normalmente encontrada na cláusula FROM ou JOIN. Isto permite que você obtenha uma tabela com dados que não estavam prontamente disponíveis no banco de dados (por exemplo, dados agrupados) e então junte esta tabela com outra de seu banco de dados, se necessário.

Digamos que queremos ver o total de vendas para cada artista que vendeu pelo menos um quadro em nossa galeria. Podemos começar com uma subconsulta que se baseia no sales tabela e calcula o valor total de vendas para cada ID de artista. Então, na consulta externa, combinamos estas informações com os nomes e sobrenomes dos artistas para obter a saída desejada:

SELECT
  artists.first_name, 
  artists.last_name, 
  artist_sales.sales
FROM artists
JOIN (
    SELECT artist_id, SUM(sales_price) AS sales
    FROM sales
    GROUP BY artist_id
  ) AS artist_sales
  ON artists.id = artist_sales.artist_id;

Atribuímos um alias significativo à saída de nossa subconsulta (artist_sales). Desta forma, podemos facilmente nos referir a ele na consulta externa, ao selecionar a coluna desta tabela, e ao definir a condição de junção na cláusula ON. Nota: Os bancos de dados lançarão um erro se você não fornecer um alias para a saída de sua subconsulta.

Aqui está o resultado da consulta:

first_namelast_namesales
ThomasBlack300
KateSmith4800
NataliWein4250

Assim, dentro de uma breve consulta SQL, conseguimos calcular o total de vendas de cada artista com base nos dados brutos de uma tabela (sales), e então junte esta saída com os dados de outra tabela (artists).

As subconsultas podem ser bastante poderosas quando precisamos combinar informações de várias tabelas. Vamos ver o que mais podemos fazer com as subconsultas.

Exemplo 4 - Subconsulta relacionada a uma subconsulta

O exemplo a seguir demonstrará como as subconsultas:

  • Podem ser utilizadas na cláusula SELECT, e
  • Pode ser correlacionado (ou seja, a consulta principal ou externa se baseia em informações obtidas da consulta interna).

Para cada colecionador, queremos calcular o número de pinturas adquiridas através de nossa galeria. Para responder a esta pergunta, podemos utilizar uma subconsulta que conta o número de pinturas adquiridas por cada colecionador. Aqui está a consulta completa:

SELECT
  first_name, 
  last_name,
  (
    SELECT count(*) AS paintings
    FROM sales
    WHERE collectors.id = sales.collector_id
  )
FROM collectors;

Observe como a consulta interna neste exemplo funciona de fato para cada linha da tabela collectors:

  • A subconsulta é colocada na cláusula SELECT porque queremos ter uma coluna adicional com o número de pinturas compradas pelo colecionador correspondente.
  • Para cada registro do collectors tabela, a subconsulta interna calcula o número total de pinturas adquiridas por um colecionador com a identificação correspondente.

Aqui está a saída:

first_namelast_namepaintings
BrandonCooper0
LauraFisher2
ChristinaBuffet3
SteveStevenson1

Como você vê, a saída da subconsulta (ou seja, o número de pinturas) é diferente para cada registro e depende da saída da consulta externa (ou seja, do coletor correspondente). Portanto, estamos tratando aqui de uma subconsulta correlata.

Verifique este guia se você quiser aprender como escrever subconsultas correlatas em SQL. Por enquanto, vamos ter mais um exemplo de subconsulta correlacionada.

Exemplo 5 - Subconsulta correlacionada

Desta vez, queremos mostrar os primeiros nomes e sobrenomes dos artistas que tiveram zero vendas com nossa galeria. Vamos tentar realizar esta tarefa usando uma subconsulta correlata na cláusula WHERE:

SELECT first_name, last_name
FROM artists
WHERE NOT EXISTS (
  SELECT *
  FROM sales
  WHERE sales.artist_id = artists.id
);

Aqui está o que está acontecendo nesta consulta:

  • A consulta externa lista informações básicas sobre os artistas, verificando primeiro se há registros correspondentes na tabela de sales
  • A consulta interna procura por registros que correspondem à identificação do artista que está sendo verificada atualmente pela consulta externa.
  • Se não houver registros correspondentes, o primeiro nome e o sobrenome do artista correspondente são adicionados à saída:
first_namelast_name
FrancescoBenelli

Em nosso exemplo, temos apenas um artista sem nenhuma venda ainda. Esperemos que ele pouse um em breve.

Chegou a hora de praticar as subconsultas SQL!

Neste artigo, eu cobri vários exemplos de subconsultas SQL para lhe dar uma compreensão geral de como subconsultas podem ser alavancadas em SQL. Entretanto, muitas vezes as expressões comuns de tabela (CTEs) podem fazer melhor do que as subconsultas.

Se você quiser praticar as subconsultas SQL e outros tópicos SQL fundacionais, tente nosso SQL para Iniciantes curso interativo. Inclui 129 desafios de codificação na consulta de múltiplas tabelas, agregação e agrupamento de dados, união de tabelas, redação de subconsultas, e muito mais.

Quer se tornar um mestre SQL? Confira nossa trilha de aprendizado SQL de A a Z. Ela vai além do básico e inclui 7 cursos interativos que abrangem funções SQL padrão, linguagem de manipulação de dados SQL (DML), relatórios SQL básicos, funções de janela, expressões de tabela comuns (CTEs) e extensões GROUP BY.

Obrigado pela leitura, e feliz aprendizado!