Alper ÇELİK

Bilgisayar Mühendisi

Where ve Having Elementleri Arasındaki Farklar

Konuyu sıkıca kavramak adına örnekler üzerinden aşama aşama gideceğiz..
 
Resim-1'de oluşturmuş olduğum Employees tablosu üzerinden şehir ve cinsiyet bazında toplam maaşı gösteren sorguyu yazacak olursak:  
 
SELECT City, Gender, SUM(Salary) as [Total Salary]
FROM Employees
GROUP BY City, Gender
 
Şimdi bu sorguya bir unsur daha ekleyelim ve bu kezde City ve Gender bazında grupladığım kolonlar üzerinden toplam personeli de gösterelim:  
 
SELECT City, Gender, COUNT(ID) as TotalEmployees, SUM(Salary) as [Total Salary]
FROM Employees
GROUP BY City, Gender
 
Çıktının son hali şu şekilde olacaktır:
 
Bakınız Resim-2.  
 
Artık ana odak noktamıza giriş yapabiliriz.. Örnek üzerinden devam ediyoruz bunun için..
Yukarıdaki çıktı üzerinden cinsiyeti erkek olanları getirecek olursak:  
 
SELECT City, Gender, COUNT(ID) as TotalEmployees, SUM(Salary) as [Total Salary]  
FROM Employees   
WHERE Gender = 'Male'
GROUP BY City, Gender
 
Ya da şu şekilde de yapabiliriz:  
 
SELECT City, Gender, COUNT(ID) as TotalEmployees, SUM(Salary) as [Total Salary]  
FROM Employees  
--WHERE Gender = 'Male'
GROUP BY City, Gender
HAVING Gender= 'Male'  
 
Her 2 sorgu sonucu da Resim-3'deki çıktıyı üretecektir:  
 
Örnekler üzerinden deneyimlendik o halde sıra geldi 2 element arasındaki farkı belirtmeye;
 
* WHERE elementi satırlar üzerinden süzme işlemi yapar(gruplama işlemi öncesi) ancak HAVING elementi gruplanmış satırlar üzerinden(dolayısıyla gruplama işlemi sonrası) bu işlemi yapar,
* WHERE elementi select, insert ve update ifadeleri ile kullanılabilir ancak HAVING elementi sadece select ifadesi ile birlikte kullanılır.
* Aggregate fonksiyonlar (max, min, avg gibi) WHERE elementi ile birlikte kullanılamazlar (bir alt sorgu içersinde having olmadıkça tabi..) ancak HAVING elementi içersinde tüm aggregate fonksiyonlar kullanılabilir.  
* Her 2 elementinde kullanılması söz konusu ise sıralama şu şekilde olmalıdır:  
 
SELECT (5.sırada)
FROM (1.sırada)
WHERE (2.sırada)
GROUP BY (3.sırada)
HAVING (4.sırada)
ORDER BY (En son yazılır)  
 
Sonuç olarak; her iki elementde biri birinden daha etkilidir ya da etkisizdir diyemeyiz ancak şöyle bir gerçek var ki eleme yapacağınız satırları öncesinde WHERE ile süzüp sonrasında gruplanmış veriler üzerinden bir süzme yapılacaksa o şekilde HAVING ifadesini kullanmakta yarar var..
 
Faydalı bir yazı olmuştur umarım. Hoşçakalın..

Trigger Serisinin İlk Bölümüne Buradan Ulaşabilirsin

Trigger'lar özelleşmiş bir tür stored prosedürlerdir(SP).