SQL

Subqueries: como e quando utilizar

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

  1. Filtrar com SUBQUERY utilizando IN e NOT IN
  2. Criar uma nova coluna com uma SUBQUERY
  3. 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!!

Sobre o Autor

0 Comentários

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *