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. |
|