Voltar para a lista de artigos Artigos
7 minutos de leitura

O Que é uma Consulta Aninhada em SQL?

Você alguma vez desejou poder construir uma consulta com várias instruções SELECT? Então temos boas notícias! Isso - e muito mais - pode ser feito com as consultas aninhadas em SQL.

Se você vem aprendendo SQL (ou escrevendo algumas consultas) há algum tempo, provavelmente já se deparou com casos em que parecia ser preciso incluir outra instrução SELECT dentro da sua instrução principal. Se você já se perguntou se é possível usar SELECTs aninhados em SQL, saiba que sim, é possível! Neste artigo, vou explicar o que é uma consulta aninhada (também conhecida como SELECT aninhado) e como utilizá-la de forma eficiente.

Se você quiser praticar mais em SQL, confira a nossa Trilha de Práticas em SQL. Ela oferece vários cursos SQL interativos e práticos com exercícios sobre instruções SELECT aninhadas e outros recursos SQL desafiadores.

O que é um SELECT aninhado?

Um SELECT aninhado é uma consulta dentro de uma consulta, ou seja, quando você tem uma declaração SELECT dentro do SELECT principal. Para ficar mais fácil de entender, vamos ver a aplicação disso em um exemplo.

Neste artigo, trabalharemos com dados de uma escola fictícia. O banco de dados inclui três tabelas: alunos, professores e turmas. Confira as tabelas abaixo:

alunos

idnomeid_turmanota_final
1Jonas Bastos33.45
2Daniel Blanco13.15
3Katherine Estrela13.85
4Helen Bronco23.10
5Estevão Maia22.40

professores

idnomedisciplinaid_turmasalario_mensal
1Elisabeth GarciaHistória32500
2Roberto SolesLiteratura[NULL]2000
3João MonteInglês12350
4Sara PrestoMatemática23000

turmas

idnotaid_professornumero_de_alunos
110321
211425
312128

Digamos que você queira encontrar todos os alunos que têm nota_final acima da média. Entretanto, você não sabe o valor médio da nota_final. Naturalmente, você pode usar uma consulta para descobrir:

SELECT AVG(nota_final)
FROM alunos;

Você receberá um número (3,19) que poderá usar para resolver a tarefa inicial - mostrar todas as informações dos alunos com uma nota_final acima desta média:

SELECT *
FROM alunos
WHERE nota_final > 3.19;

Mas será que é possível resolver esta tarefa em uma única etapa? Com uma consulta aninhada, sim! Nossa consulta ficaria assim:

SELECT *
FROM alunos
WHERE nota_final > (
	SELECT AVG(nota_final)
	FROM alunos);

Nossa subconsulta retorna um único valor (ou seja, uma tabela com uma única coluna e uma única linha). Isto é importante para que o operador de comparação funcione. Com a média da nota_final retornada pela consulta interna, a consulta externa pode selecionar os alunos que satisfazem nossa condição de filtro (ou seja, uma nota_final acima da média).

E aqui está o resultado:

idnomeid_turmanota_final
1Jonas Bastos33.45
3Katherine Estrela13.85

O termo adequado para esta declaração SELECT aninhada é uma subconsulta. Há muitos cenários onde as subconsultas SQL são úteis.

Mais exemplos de consultas SQL aninhadas

Antes de mais nada, você pode colocar um SELECT aninhado dentro da cláusula WHERE com os operadores de comparação ou os operadores IN, NOT IN, ANY ou ALL. O segundo grupo de operadores é usado quando sua subconsulta retorna uma lista de valores (em vez de um único valor, como no exemplo anterior):

  • O operador IN verifica se um determinado valor está na tabela retornada pela subconsulta.
  • O operador NOT IN filtra as linhas correspondentes aos valores que não estão na tabela retornada pela subconsulta.
  • O operador ANY é utilizado com operadores de comparação para avaliar se algum dos valores retornados pela subconsulta satisfaz a condição.
  • O operador ALL também é usado com operadores de comparação para avaliar se todos os valores devolvidos pela subconsulta satisfazem a condição.

Vamos ver como funciona o operador IN. Neste exemplo, você calculará o número médio de alunos nas turmas em que o professor ensina História ou Inglês:

SELECT AVG(numero_de_alunos)
FROM turmas
WHERE id_professor IN (
	SELECT id
	FROM professores
	WHERE disciplina = 'Inglês' OR disciplina = 'História');

Aqui você usa uma subconsulta para selecionar somente os ids dos professores que correspondem aos professores de Inglês ou de História. Note que nossa subconsulta retorna uma lista de valores, ou seja, uma tabela com uma coluna (id) e várias linhas que satisfazem a condição da consulta interna.

Em seguida, na consulta externa, você calcula o número médio de alunos somente para as turmas que satisfazem a condição acima. Para cada id_professor, o operador IN verifica se esse ID está presente na tabela retornada pela consulta interna; isso garante que somente as turmas correspondentes a esses professores sejam consideradas no cálculo.

Para mais exemplos usando os operadores IN, NOT IN, ANY ou ALL, confira nosso guia Subconsultas SQL.

Várias subconsultas em uma declaração

Pronto para exemplos mais desafiadores? É possível ter vários SELECTs aninhados em uma única declaração.

Digamos que você queira mostrar todas as informações sobre os alunos da turma com o maior número de alunos. Para responder a esta pergunta, você precisará encontrar a turma com o número máximo de alunos e, em seguida, filtrá-la. Por fim, você precisará exibir as informações sobre os alunos daquela turma.

Para responder a esta pergunta, você pode usar uma subconsulta dentro de outra subconsulta:

SELECT *
FROM alunos
WHERE id_turma = (
	SELECT id
	FROM turmas
	WHERE numero_de_alunos = (
		SELECT MAX(numero_de_alunos)
		FROM turmas));

Muito útil, não é?

Usando subconsultas fora de WHERE

Além disso, as subconsultas não estão limitadas ao uso na cláusula WHERE. Por exemplo, você também pode usar uma consulta aninhada na cláusula FROM. No exemplo a seguir, nossa subconsulta retornará não um único valor, mas sim uma tabela.

Vamos descobrir qual área de estudo corresponde ao maior salário médio de professor. Primeiro você precisará calcular o salário médio por disciplina e, depois, usar esta tabela para encontrar o salário médio máximo:

SELECT disciplina, MAX(salario_por_disciplina.salario_medio) AS salario_maximo
FROM (
	SELECT disciplina, AVG(salario_mensal) AS salario_medio
	FROM professores
	GROUP BY disciplina) salario_por_disciplina;

Note que a consulta interna retornará uma tabela com várias linhas e colunas. Para ser mais específico, a tabela terá duas colunas, disciplina e salario_medio, para mostrar o salário médio dos professores com base em sua disciplina principal. O número de linhas corresponderá ao número de disciplinas únicas ensinadas na escola (ou seja, conforme especificado na tabela professores). Você também precisa especificar um apelido para esta tabela - salario_por_disciplina.

Em seguida, a consulta externa calcula o salário médio máximo com base no salario_por_disciplina e devolve este valor, juntamente com o nome do disciplina correspondente:

disciplinasalario_maximo
Matemática3000

Como você pode ver, os professores de matemática da escola têm o maior salário médio mensal ($3000).

Para algumas tarefas, você pode precisar da consulta interna para utilizar as informações da consulta externa. Quando duas consultas estão relacionadas desta forma, chamamos de subconsultas correlacionadas. Este é um tópico mais avançado que é muito bem explicado em nosso guia para iniciantes sobre subconsultas correlacionadas e neste tutorial prático sobre como escrever subconsultas correlacionadas.

Dicas adicionais sobre o uso de SELECTs aninhados

As subconsultas SQL são uma ferramenta poderosa. Elas nos permitem executar tarefas de forma mais eficiente, tendo apenas uma consulta ao invés de várias.

Ao utilizar as consultas aninhadas, tenha estas considerações em mente:

  • As subconsultas podem retornar valores individuais ou tabelas (com uma ou várias linhas e colunas).
  • Você pode incluir uma subconsulta:
    • Na cláusula WHERE, para filtrar dados.
    • Na cláusula FROM, para especificar uma nova tabela.
    • Na cláusula SELECT, para especificar uma determinada coluna.
    • Na cláusula HAVING, como um seletor de grupo.
  • As subconsultas devem sempre ser incluídas entre parênteses ().
  • Diferentes sistemas de gerenciamento de banco de dados possuem limitações no número de níveis de subconsultas (por exemplo, até 32 níveis no SQL Server). Entretanto, na prática, raramente você terá mais de dois ou três níveis de consultas aninhadas.
  • As subconsultas são muitas vezes computacionalmente ineficientes. Portanto, recomendo evitar consultas aninhadas quando outras opções estiverem disponíveis (por exemplo, JOINs).

Hora de praticar as subconsultas SQL!

Agora que já aprendeu bastante sobre as consultas aninhadas em SQL, você provavelmente está ansioso para começar a praticá-las! Felizmente, temos MUITOS exercícios interativos para que você pratique diferentes subconsultas SQL.

Antes de mais nada, nosso curso SQL para Iniciantes tem uma seção completa sobre subconsultas. Não deixe de conferir!

Se você quer se tornar um usuário realmente confiante no uso de consultas aninhadas em SQL, também recomendo fazer a nossa Trilha de Práticas em SQL. Ela contém cursos SQL interativos com exercícios práticos para praticar subconsultas e outras construções desafiadoras em SQL.

Com o conhecimento sobre subconsultas você se tornará um usuário muito mais avançado no SQL. Bons estudos!