Subqueries, ou subconsultas, são consultas aninhadas dentro de outra consulta SQL. Elas podem ser usadas em várias partes de uma consulta principal, dependendo do objetivo desejado. Vamos explorar como subconsultas podem ser usadas nas cláusulas SELECT, WHERE e FROM.
Subqueries na cláusula SELECT são usadas para calcular valores derivados ou realizar agregações que serão retornadas como parte do conjunto de resultados. Elas permitem que você retorne dados adicionais que não estão diretamente disponíveis na tabela principal.
Exemplo: Suponha que você tem uma tabela Empregados
com id_empregado
, nome
, e salario
, e uma tabela Departamentos
com id_departamento
e nome_departamento
. Se você quiser listar os empregados junto com o nome do departamento ao qual pertencem, pode fazer assim:
SELECT
e.nome,
e.salario,
(SELECT nome_departamento
FROM Departamentos d
WHERE d.id_departamento = e.id_departamento) AS departamento
FROM Empregados e;
Explicação:
(SELECT nome_departamento FROM Departamentos d WHERE d.id_departamento = e.id_departamento)
é usada na cláusula SELECT para buscar o nome do departamento correspondente para cada empregado.Subqueries na cláusula WHERE são utilizadas para filtrar registros com base em condições que dependem dos resultados de outra consulta. Elas são provavelmente o uso mais comum de subconsultas.
Exemplo: Suponha que você quer encontrar todos os empregados cujo salário é superior à média salarial de todos os empregados.
SELECT nome, salario
FROM Empregados
WHERE salario > (
SELECT AVG(salario)
FROM Empregados
);
Explicação:
(SELECT AVG(salario) FROM Empregados)
calcula a média salarial de todos os empregados.Subqueries na cláusula FROM são usadas para tratar o resultado da subconsulta como uma tabela temporária. Isso permite que você faça consultas mais complexas, onde os resultados intermediários precisam ser processados antes de se unirem à consulta principal.
Exemplo: Suponha que você tenha uma tabela Pedidos
com id_pedido
, id_cliente
, e valor_total
, e deseja encontrar a média dos valores dos pedidos para cada cliente.
SELECT id_cliente, AVG(valor_total) AS media_valor_pedidos
FROM (
SELECT id_cliente, valor_total
FROM Pedidos
) AS sub_pedidos
GROUP BY id_cliente;
Explicação:
(SELECT id_cliente, valor_total FROM Pedidos)
dentro da cláusula FROM seleciona dados de pedidos.