🧠 Explicação
Subqueries são consultas dentro de outra consulta. Servem pra buscar um valor, comparar resultados, ou montar uma lista pra filtro. São muito usadas em WHERE
, FROM
, SELECT
e HAVING
.
Elas podem ser:
-
Não correlacionadas: executadas antes da query principal.
-
Correlacionadas: dependem de dados da query externa e rodam para cada linha.
🔧 Usos mais comuns
-
Buscar valores auxiliares no
WHERE
:
SELECT nome FROM clientes
WHERE id_cidade = (
SELECT id FROM cidades WHERE nome = 'São Paulo'
);
- Filtrar com lista:
SELECT nome FROM clientes
WHERE id IN (
SELECT id_cliente FROM pedidos WHERE valor > 500
);
- Usar no
FROM
como tabela temporária:
SELECT media_por_cargo.cargo, media_por_cargo.salario_medio
FROM (
SELECT cargo, AVG(salario) AS salario_medio
FROM empregados
GROUP BY cargo
) AS media_por_cargo;
- Em
HAVING
:
SELECT cargo, COUNT(*)
FROM empregados
GROUP BY cargo
HAVING COUNT(*) > (
SELECT AVG(qtd) FROM (
SELECT COUNT(*) AS qtd FROM empregados GROUP BY cargo
) AS sub
);
🔄 Subquery Correlacionada
Depende da linha atual da query principal:
SELECT nome FROM clientes c
WHERE EXISTS (
SELECT 1 FROM pedidos p
WHERE p.id_cliente = c.id AND p.valor > 1000
);
Ela é recalculada para cada cliente, porque usa c.id
.
📌 Regras
-
Subquery
noSELECT
só retorna um valor. -
No
WHERE
, pode retornar um valor escalar ou uma lista (IN
). -
No
FROM
, precisa de alias e pode ser tratada como tabela.
💡 Dicas
-
Use
EXISTS
ouNOT EXISTS
quando quiser verificar a existência de registros rapidamente. -
Para comparações de valores únicos, prefira
=
com subquery escalar. -
Se o banco tiver problemas de desempenho, subqueries correlacionadas são boas candidatas pra otimização.
✅ Conclusão
Subqueries são o segredo pra fazer consultas mais avançadas sem complicar demais a lógica. Usando do jeito certo, você filtra, calcula e organiza dados com muito mais eficiência — direto no SQL, sem precisar mexer no código do programa.