Neste capítulo
- Subconsultas (Subqueries): O que são e como utilizá-las.
- Operadores com Subconsultas:
IN,NOT IN,EXISTS, eNOT EXISTS.- Operadores de Conjunto:
UNION,UNION ALL,INTERSECT, eEXCEPT.- Expressões Condicionais: A cláusula
CASE.
Até agora, aprendemos a extrair dados de uma ou mais tabelas de forma direta, utilizando SELECT, FROM, WHERE e JOIN. No entanto, em cenários do mundo real, muitas vezes precisamos de consultas mais poderosas e flexíveis para responder a perguntas complexas.
Este capítulo nos aprofundará nas técnicas avançadas do SQL, permitindo-nos construir consultas dinâmicas e inteligentes. As subconsultas e os operadores de conjunto são ferramentas essenciais para combinar lógica, filtrar dados com base em resultados de outras consultas e realizar análises mais sofisticadas, levando suas habilidades de SQL para o próximo nível.
Uma subconsulta, ou subquery, é uma consulta aninhada dentro de outra consulta. Ela é executada primeiro, e o resultado da subconsulta é então usado pela consulta principal. Elas podem ser usadas em diversas partes de uma declaração SQL, como nas cláusulas SELECT, FROM, WHERE e HAVING.
As subconsultas são classificadas com base no tipo de resultado que retornam:
Subconsulta Escalar: Retorna exatamente um valor (uma única linha e uma única coluna).
Exemplo: Encontrar o produto mais caro.
SELECT nome_produto, preco
FROM produtos
WHERE preco = (SELECT MAX(preco) FROM produtos);
Subconsulta de Linha: Retorna uma única linha, mas com múltiplas colunas.
Exemplo: Encontrar um pedido que tenha o valor total e o ID do cliente correspondentes a outro pedido específico.
SELECT id_pedido, data_pedido
FROM pedidos
WHERE (valor_total, id_cliente) = (SELECT valor_total, id_cliente FROM pedidos WHERE id_pedido = 1);
Subconsulta de Tabela: Retorna um conjunto de resultados (múltiplas linhas e/ou múltiplas colunas). É frequentemente usada na cláusula FROM ou com operadores como IN.
Exemplo: Listar clientes que fizeram pedidos com valor total acima da média de todos os pedidos.
SELECT nome
FROM clientes
WHERE id_cliente IN (
SELECT id_cliente FROM pedidos WHERE valor_total > (SELECT AVG(valor_total) FROM pedidos)
);
Alguns operadores são projetados especificamente para trabalhar com os resultados de subconsultas, otimizando o desempenho e a clareza.
IN e NOT IN