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
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.
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.
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.
- 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 |
- 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 |
- Subqueries no
WHEREeHAVING. Subqueries podem ser usadas como condição pra filtrar linhas. Isso é muito usado pra checar - 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.
GO TO FULL VERSION