Home - www.devmedia.com.br


Subqueries – Parte I

O que é uma subquery ?

Subquery é um comando SELECT que foi "embutido" noutro comando SELECT, UPDATE, DELETE ou dentro de outra subquery.

A finalidade da subquery é retornar um conjunto de linhas para a query principal

Utilização

Tipicamente utilizamos subqueries na filtragem de pesquisas (=cláusula WHERE) nas cláusulas IN() e EXISTS(), mas subqueries também podem aparecer também na cláusula FROM ou como substituto de expressões. Exemplos:

  • Utilizando uma subquery em conjunto com a cláusula IN().

select *
from [order details]
where orderid IN (select orderid from orders where CustomerID='VINET')

---------------------------------------------------------------------
OrderID     ProductID   UnitPrice             Quantity Discount
----------- ----------- --------------------- -------- --------------
10248       11          14.0000               12       0.0
10248       42          9.8000                10       0.0
10248       72          34.8000               5        0.0
10274       71          17.2000               20       0.0
10274       72          27.8000               7        0.0
10295       56          30.4000               4        0.0
10737       13          6.0000                4        0.0
10737       41          9.6500                12       0.0
10739       36          19.0000               6        0.0
10739       52          7.0000                18       0.0

  • Utilizando uma subquery em conjunto com a cláusula EXISTS().

select *
from [order details] od
where EXISTS (select orderid from orders where orderid = od.orderid and CustomerId='VINET')

-------------------------------------------------------------------
OrderID     ProductID   UnitPrice             Quantity Discount
------- ----------- --------------------- -------- ------------------------ 10248       11          14.0000               12       0.0
10248       42          9.8000                10       0.0
10248       72          34.8000               5        0.0
10274       71          17.2000               20       0.0
10274       72          27.8000               7        0.0
10295       56          30.4000               4        0.0
10737       13          6.0000                4        0.0
10737       41          9.6500                12       0.0
10739       36          19.0000               6        0.0
10739       52          7.0000                18       0.0

  • Utilizando uma subquery como "alvo" da cláusula FROM

select top 5 o.orderid,o.customerid,od.total_quantity
from
(
   select orderid,total_quantity=sum(quantity)
   from [order details]
   group by orderid
) od
inner join orders o
on o.orderid=od.orderid

--------------------------------------------------------------------------orderid     customerid total_quantity
----------- ---------- --------------
10248       VINET      27
10249       TOMSP      49
10348       WANDK      40
10349       SPLIR      24
10350       LAMAI      33

  • Utilizando uma subquery para substituir uma expressão

select top 5
       orderid, productid, unitprice,
       avg_price=(select avg(unitprice) from [order details])
from [order details]
------------------------------------------------------------------
orderid     productid   unitprice             avg_price 
----- ----------- --------------------- ---------------------
10248       11          14.0000               26.2185
10248       42          9.8000                26.2185
10248       72          34.8000               26.2185
10249       14          18.6000               26.2185
10249       51          42.4000               26.2185

Conclusão

A utilização de subqueries é uma boa opção para resolver queries complexas, mas essa matéria não termina por aqui: continuaremos com esse assunto explorando Subqueries Correlatas, um tipo especial de subquery bastante utilizado.  Até lá!

 

 

Paulo Ribeiro (psribeiro@hotmail.com) é Microsoft MCDBA e membro da equipe editorial da SQL Magazine. Atua como DBA sênior em SQL Server na Livraria e Papelaria Saraiva S/A.

  Monitorando deadlocks com Trace Flags    
  Monitorando deadlocks com o Profiler    
  Variáveis tipo TABLE    
  Tabelas Temporárias    
  Subqueries Parte II: Queries correlatas    
  Subqueries – Parte I    
  Gerenciando Bloqueios–Parte II    
  Gerenciando Bloqueios–Parte I    
  Porque qualificar o owner na chamada de stored-procedures    
  Explorando os Tipos de Join – Parte II    
  Explorando os Tipos de Join – Parte I    
  Versões existentes do SQL Server 2000    
  Tuning - Plano de Execução no SQL Server - Parte 4    
  Tuning - Plano de Execução no SQL Server - Parte 3    
  Tuning - Plano de Execução no SQL Server - Parte 2    
  Tuning - Plano de Execução no SQL Server - Parte 1    
  Tuning - Estatísticas de I/O    
  Desfragmentando Índices no SQL Server    
  Procedures Não Documentadas
no SQL Server 2000 Parte 2
   
  Procedures Não Documentadas
no SQL Server 2000.
   
  SQL Server 2005 - YUKON    
  SQL Server 2000: o Contra-Ataque.    
  Boas-Vindas    
     

 

Todos os direitos reservados: DevMedia Group
SQL Magazine - 2004