CodeGym /Cursos /SQL SELF /O que são subqueries e pra que servem?

O que são subqueries e pra que servem?

SQL SELF
Nível 13, Lição 0
Disponível

Agora você já tá pronto pra próxima etapa — trabalhar com subqueries em SQL. Hoje vamos ver o que é isso, pra que serve, quais tipos existem e por que elas são tão úteis na vida real.

Subqueries (ou consultas aninhadas) são aquelas queries SQL que você usa dentro de outras queries SQL. Tipo uma boneca russa ou uma cebola: tem uma query principal, e dentro dela tá escondida outra, menorzinha. A subquery roda primeiro, e o resultado dela é usado pela query de fora (às vezes chamada de "principal").

Bora ver um exemplo:

Exemplo 1: Como funciona

A gente tem uma tabela students com esses dados:

id nome idade grupo_id
1 Alice 20 1
2 Bob 22 2
3 Clark 21 1
4 Dina 23 3
5 Emilia 22 2

E também uma tabela groups, onde ficam os nomes dos grupos:

id nome
1 Turma de Matemática
2 Turma de Física
3 Turma de Literatura

Se a gente quiser saber os nomes dos grupos onde estudam os estudantes, dá pra usar uma subquery:

SELECT nome
FROM groups 
WHERE id IN (
    SELECT grupo_id 
    FROM students 
    WHERE idade > 21
);

O que tá rolando aqui?

A subquery:

SELECT grupo_id 
FROM students 
WHERE idade > 21

Essa query pega o grupo_id de todos os estudantes com mais de 21 anos. O resultado: uma lista de ids de grupos, tipo [2, 3].

A query principal:

SELECT nome 
FROM groups 
WHERE id IN ([resultados da subquery])

Essa query usa o resultado da subquery e retorna os nomes dos grupos com id igual a 2 ou 3.

Resultado:

Turma de Física
Turma de Literatura

Ainda não entendeu nada? Normal. Mas relaxa, já já a gente explica tudo.

Vamos começar com uma ideia simples — o resultado de um SELECT é tipo uma tabela virtual. Sério, ela tem colunas, tem linhas. Por que não seria uma tabela?

E se o resultado da query é uma tabela, dá pra usar ela onde você usaria tabelas de verdade: num JOIN, por exemplo, ou em construções mais avançadas.

Ela não tem nome, e isso é um problema. Mas as colunas-expressões também não têm nome, e a gente resolve isso dando um alias — um apelido. Dá pra fazer o mesmo com tabelas virtuais.

Mais sobre isso nas próximas aulas — sem spoiler por enquanto :P

Por que subqueries são úteis

  1. Elas simplificam tarefas complicadas. Às vezes uma tabela só não tem toda a informação que você quer pegar. Subqueries deixam você dividir a consulta em duas etapas: primeiro você acha um resultado intermediário, depois usa ele pra pegar o dado final.

  2. Trabalhar com resultados intermediários. Subqueries são ótimas quando você precisa fazer uns cálculos antes de processar os dados. Tipo achar o valor mínimo ou somar alguma coisa.

  3. Deixam o código mais legível. Subqueries deixam o código mais organizado, principalmente se você tá mexendo com tabelas grandes e lógica complicada.

Tipos principais de subqueries

Você pode usar subqueries em várias partes de uma query SQL. Dependendo de onde você coloca, elas se dividem em alguns tipos.

  1. Subqueries no SELECT. A subquery fica na lista de colunas e serve pra calcular valores. Isso é útil, por exemplo, pra adicionar uma coluna nova no resultado.

Exemplo — vamos adicionar uma coluna com a idade máxima entre os estudantes:

SELECT nome, idade,
       (SELECT MAX(idade) FROM students) AS idade_maxima 
FROM students;

Resultado:

nome idade idade_maxima
Alice 20 23
Bob 22 23
Clark 21 23
Dina 23 23
Emilia 22 23
  1. Subqueries no FROM. A subquery é usada como uma tabela temporária. Isso é útil quando você precisa primeiro agregar ou transformar os dados.

Exemplo — calcular a idade média dos estudantes em cada grupo:

SELECT tmp.grupo_id, tmp.idade_media
FROM (
    SELECT grupo_id, AVG(idade) AS idade_media
    FROM students
    GROUP BY grupo_id
) AS tmp -- Dando o apelido tmp pra tabela temporária 
WHERE tmp.idade_media > 21;

Resultado:

grupo_id idade_media
2 22.0
3 23.0
  1. Subqueries no WHERE e HAVING. Subqueries podem ser usadas como condição pra filtrar linhas. Isso é muito usado pra checar
  2. se existem registros ou pra comparar valores.

Exemplo — estudantes que têm idade acima da média:

SELECT nome, idade
FROM students
WHERE idade > (
    SELECT AVG(idade) 
    FROM students
);

Resultado:

nome idade
Bob 22
Dina 23
Emilia 22

Vantagens de usar subqueries

Mais flexibilidade: subqueries deixam você trabalhar com estruturas de dados mais complexas.

Dividir tarefas em etapas: você pode separar a lógica em subqueries, deixando o código mais fácil de entender.

Acesso a dados intermediários: dá pra processar dados "no caminho", sem precisar criar tabelas temporárias no banco.

2
Tarefa
SQL SELF, nível 13, lição 0
Bloqueado
LEFT JOIN para exibir todos os funcionários e seus projetos
LEFT JOIN para exibir todos os funcionários e seus projetos
2
Tarefa
SQL SELF, nível 13, lição 0
Bloqueado
Unindo pedidos com datas e clientes usando LEFT JOIN
Unindo pedidos com datas e clientes usando LEFT JOIN
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION