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