🧠 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 no SELECT 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 ou NOT 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.