Subqueries: como e quando utilizar

Hoje vamos falar de Subqueries, mas o que é uma subquery?
Uma subconsulta (ou mais conhecida, subquery) é uma instrução SELECT que está condicionada dentro de outra instrução SQL. Como resultado desta operação, podemos fazer uso de subconsultas para criarmos consultas que seriam difíceis ou impossíveis de serem feitas utilizando outras maneiras.
Desde que saibamos codificar nossas instruções SELECT, saberemos como codificar uma subconsulta, já que ela é apenas uma instrução SQL no interior de outra instrução SQL.
O que precisamos saber nesse momento para utilizarmos as subqueries é onde e quando devemos utilizá-las. Vamos então aprender sobre algumas das especificidades de utilizarmos subconsultas ao longo deste artigo.
É tudo bem simples, basicamente é usar um SELECT dentro de outro para consultas, porém posso fazer uma SUBQUERY dentro de um INSERT, DELETE ou UPDATE
Beleza vamos ver um exemplo aqui:
SELECT DISTINCT NomeFornecedor,
(SELECT
MAX(DataFatura)
FROM
Faturas
WHERE
Faturas.Id_fornecedor = Fornecedores.Id_fornecedor) AS UltimaFatura
FROM Fornecedores
ORDER BY UltimaFatura DESC;
Na maioria dos casos podemos substituir uma subconsulta por um JOIN para facilitar mais as coisas. Essa mesma consulta poderia com JOIN de acordo com o código abaixo:
SELECT NomeFornecedor, MAX(DataFatura) AS UltimaFatura
FROM
Fornecedores
LEFT JOIN
Faturas
ON
Faturas.Id_fornecedor = Fornecedores.Id_fornecedor
GROUP BY NomeFornecedor
Vou mostrar 3 formas de como utilizar a SUBQUERY
- Filtrar com SUBQUERY utilizando IN e NOT IN
- Criar uma nova coluna com uma SUBQUERY
- Utilizando SUBQUERY como fonte de dados
Filtrar com SUBQUERY utilizando IN e NOT IN
Um exemplo da utilização de subqueries é fazendo filtros no resultado de outras consultas. Para esse modelo podemos utilizar as cláusulas IN, EXISTS ou operadores de comparação, como =, >=, <=, dentre outros.
A consulta abaixo busca todos os projetos que possuam algum comentário, ou seja, uma consulta principal na tabela projetos, e filtrar o resultado com base no resultado da subconsulta na tabela de comentários.
SELECT
P.*
FROM
projetos P
WHERE
P.id IN
(
SELECT
C.id_projeto
FROM
comentario C
WHERE
C.id_projeto = P.id)
Podemos ainda trocar o operador IN por NOT IN, retirar a cláusula WHERE. Existem diversas alternativas possíveis para trazer resultados filtrados.
Criar uma nova coluna com uma SUBQUERY
Uma das formas possíveis de se realizar uma subquery é fazendo com que o resultado de outra consulta seja uma coluna dentro da sua consulta principal.
A consulta principal traz o ID, o NOME e o PREÇO de todos os regristrso da tabela PRODUTO. Já a subconsulta é inserida com uma coluna do SELECT principal, e apresenta o campo MEDIA_GLOBAL trazendo a média dos preços de todos os registro da tabela produto.
SELECT
P.id,
P.nome,
P.preco,
(
SELECT
AVG(preco)
FROM
produto P2
) AS MEDIA_GLOBAL
FROM
produto P
Utilizando SUBQUERY como fonte de dados
Podemos utilizar várias tabelas em uma subconsulta, e até mesmo usar o resultado de uma subconsulta como base para a consulta principal. O código abaixo representa esse tipo de situação
SELECT
T.*
FROM
(
SELECT
V.*,
(
SELECT
AVG(P.preco)
FROM
produto P
) AS MEDIA_GLOBAL
FROM
venda_produto V
) AS T
WHERE
T.valor > T.MEDIA_GLOBAL
Explicando um pouco melhor o código acima podemos verificar que o código da subconsulta está na posição que estaria a tabela, portanto o resultado, chamado de T, servirá de TABELA para a consulta principal que retorna todos o valores de T condicionados pela cláusula WHERE T.valor > T.MEDIA_GLOBAL.
Podemos ver então que existem diversas formas de usar SUBQUERIES para melhorar a estrutura e a perfomance de suas consultas. Por hoje é só, até mais!!
0 Comentários