12 Ocak 2017 Perşembe

Set Operators

Herkese merhaba,

Bugün sizlere  veritabanımızda kullandığımız set operatörlerinden bahsedeceğim.

Set operatörleri iki veya daha fazla sorguyu kümelemek için kullanılmaktadır.

Bu set operatörlerini kullanarak birleştirdiğimiz sorgulara bileşik sorgu yani compound queries denmektedir.

Sorgularımız arasındaki çeşitli işlemler için farklı set operatörleri vardır.
Bunlar;

  • UNION, UNIONALL
  • EXCEPT, INTERSECT
  • APPLY, CROSS APPLY, OUTER APPLY
UNION ve UNION ALL Set Operatörleri

Bu operatör iki veya daha fazla sorguyu tek bir tablo olarak bize geri döndürür. 

Bu operatörleri kullanırken dikkat etmemiz gereken önemli bir nokta var:

Karşılaştırma yaptığımız iki sorgu arasındaki ifadelerin türleri aynı olmalıdır.
Yani bir tablonun nvarchar türündeki bir sütunuyla diğer tablonun int türündeki bir sütunu birleştirip tek bir tablo olarak geri döndüremeyiz.

UNION operatörü karşılaştırılan ifadeleri getirirken DISTINCT komutuyla aynı işlemi yaparak tekrar eden ifadeleri bize geri döndürmezler. Eğer bu ifadeleri de görmek istiyorsak UNION ALL deyimini kullanmalıyız.

Union Syntax:

<query_specification>
UNION [ALL]
<query_specification>


 Örnek vermemiz gerekirse;
Bir şirketin içerisindeki çalışanlar veritabanımızda çalıştıkları departman tablolarında ayrı ayrı tutuluyor olsun. Bu departman tablolarını Departman1 ve Departman2 olarak isimlendirelim.

Biz bu şirket çalışanlarını bir tablo altında listelemek istediğimizde UNION operatörünü şu şekilde kullanıyoruz.

select Name as Calısanlar from Departman1 
UNION
select Name from Departman2

Bu iki sorguyu UNION operatörüyle birleştirip tek bir tabloda Calısanlar adlı sütunun altında şirket çalışanlarını listelemiş olduk.

EXCEPT, INTERSECT

Except ve Intersect operatörleri belli kurallara göre iki sorgu arasında karşılaştırma yapmak için kullanılmaktadır.

Except Operatörü: İki sorgu arasında karşılaştırma yaparken, ilk sorgudaki tabloda yer alan fakat ikinci sorgudaki tabloda yer almayan ifadeleri bize geri döndürür. Yani tablolar arasındaki farkı görmek istediğimizde Except operatörünü kullanmamız gerekmektedir.

Except Syntax:

<query_specification>
EXCEPT
<query_specification>

Intersect Syntax:

<query_specification>
INTERSECT
<query_specification>

Örnek vermek gerekirse;

Müşterilerimiz ve bu müşterilerimizin siparişlerinin tutulduğu iki ayrı tablomuz olsun. Biz bu iki tabloyu karşılaştırarak sipariş vermemiş müşterilerimizi tek bir tabloda  EXCEPT operatörünü kullanarak görüntüleyebiliriz.

select CustomerID from Sales.Customer
EXCEPT 
select CustomerID from Sales.SalesOrderHeader

Except operatörünü kullanarak iki tablo arasındaki CustomerID'leri karşılaştırdık ve Customer tablosunda olup SalesOrderHeader tablosunda olmayan CustmerID'leri listeledik. Yani sipariş vermemiş müşteriler listelendi.

Intersect Operatörü: İki sorgu arasında karşılaştırma yaparken, karşılaştırdığımız ifadelerin iki tablodada mevcut olması durumundaki verileri bize tek bir tabloda geri döndürür. Bir önceki örnek üzerinden açıklayacak olursak;

select CustomerID from Sales.Customer
INTERSECT 
select CustomerID from Sales.SalesOrderHeader

Bu operatörü kullanarak iki tabloda da var olan CustomerID 'leri listeledik. Bu durumda listelenen CustomerID 'ler aynı zamanda sipariş veren müşterileri belirtmektedir.

APPLY, CROSS APPLY, OUTER APPLY

SQL 2005 ile birlikte gelmiş olan APPLY operatörü tvf'lerle join işlemi yapar. Yani biz bu operatörle

Tablomuzdaki veriyi fonksiyon içerisine parametre olarak gönderir ve belli kurallara göre verilerimizi listeleriz. 

Belli kurallar dediğimiz deyimler CROSS  ve OUTER deyimleridir.

CROSS APPLY ile sadece fonkisyondaki değerlerle uyuşan satırlar bize geri döndürülmektedir. Bunu Join işlemi gibi düşünebiliriz. Fakat Join işlemiyle fonksiyonlar içerisine parametre gönderemezken APPLY operatörleriyle parametre gönderebilmekteyiz.
OUTER APPLY ise fonksiyondaki değerlere uyuşup uyuşmadığına bakmaksızın join edeceğimiz tablodaki değerleri bize geri döndürücekti. (Bunu bir nevi left join işlemi gibi düşünebiliriz)

Bir örnek vermek gerekirse;

Müşterilerimizin ve Siparişlerinin tutulduğu iki tablomuz olduğunu varsayalım. Biz dışarıdan girilecek müşteri id'sine göre müşterilerimizin siparişlerini listeleyen bir fonksiyon yazalım ve CROSS APPLY operatörüyle müşteri tablomuzu fonksiyonla birleştirelim.

CREATE FUNCTION  getorder
(
@custid as int, @n as int
)
RETURNS TABLE
AS 
RETURN
Select top (@n) * From Sales.SalesOrderHeader 
WHERE CustomerID=@custid
ORDER BY TotalDue Desc
GO

Select c.CustomerID,o.TotalDue from Sales.Customer as c
CROSS APPLY
getorder(c.CustomerID,5) as o ORDER BY CustomerID ASC,TotalDue DESC

Gördüğünüz gibi CROSS APPLY ile sadece fonksiyon içerisinde eşleşen CustomerID'lerin en yüksek 5 siparişini listelemiş olduk.

Eğer CROSS APPLY yerine OUTER APPLY  operatörünü kullansaydık fonksiyon içerisinde eşleşmeyen CustomerID'leri de listeleyecektik.






Konu ile ilgili Sunumum:












Hiç yorum yok:

Yorum Gönder