28 Haziran 2015 Pazar

Temel SQL Dersi 16: HAVING Elemanı



HAVING


HAVING ifadesi bu iki yazıda anlatılanların devamı, çünkü sadece GROUP BY ifadesi ile birlikte kullanılan bir ifade. Aslında HAVING ifadesinin işlevi WHERE ifadesininkine çok benziyor. Ancak kümeleme fonksiyonları ile WHERE ifadesi birlikte kullanılamadığından HAVING ifadesine ihtiyaç duyulmuştur. Meseleyi daha iyi izah edebilmek için hemen örneklere geçelim. Öncelikle bir önceki makalede de kullandığımız aşağıdaki kisiler tablosunu inceleyelim. Sonra bu tablo üzerinden örneklerle konuyu inceleyeceğiz.
idAdSoyadYasCinsiyetŞehirÜlkeMaaş
2AhmetYılmaz201AnkaraTürkiye2000
3MehmetEfe221BoluTürkiye2000
4AyşeCan230İstanbulTürkiye3500
5FatmaAk350AnkaraTürkiye3200
6JohnSmith451New YorkUSA3500
7EllenSmith400New YorkUSA3500
8HansMüller301BerlinAlmanya4000
9FrankCesanne351ParisFransa3700
10AbbasDemir261AdanaTürkiye2000
11HaticeTopçu260HatayTürkiye2200
12GülsümDemir350AdanaTürkiye2000

Öncelikle aşağıdaki 2 sorgu örneğini inceleyelim:
SELECT ülke, AVG(maaş) FROM `kisiler` GROUP BY ülke
Bu sorgu ülkelere göre maaş ortalamasını verir ve çıktısı aşağıdaki gibidir:
ülkeAVG(maaş)
Almanya4000.0000
Fransa3700.0000
Türkiye2414.2857
USA3500.0000

 SELECT ülke, AVG(maaş) FROM `kisiler` WHERE yas > 30 GROUP BY ülke
Dikkat ederseniz bu sorgunun bir öncekinden tek farkı “WHERE yas > 30″ kısmı. Sorgu yine ülkelere göre maaş ortalamasını hesaplıyor ama bu hesaba yalnızca yaşı 30’dan büyük olan çalışanları katıyor. Sorgunun çıktısı aşağıdaki gibidir:
ülkeAVG(maaş)
Fransa3700.0000
Türkiye2600.0000
USA3500.0000

Şimdi de yaş ortalaması 30’un üzerinde olan ülkelerin maaş ortalamalarını getiren sorguyu yazmaya çalışalım. Burada 30 yaş üstü koşulu çalışanlar için değil ülkeler için (yani gruplar) geçerli. O halde yine yukarıdaki sorgularda olduğu gibi ülkelere göre gruplama yapacağız ama bu sefer koşulu gruplar için yazacağız.
 SELECT ülke, AVG(maaş) FROM `kisiler` GROUP BY ülke HAVING AVG(yas) > 30
Sorgunun çıktısı aşağıdaki gibi olacaktır:
ülkeAVG(maaş)
Fransa3700.0000
USA3500.0000
Sorgunun döndürdüğü sonuç kümesine bakarak iki ülkenin (Türkiye ve Almanya) yaş ortalamalarının 30’dan küçük olduğunu söyleyebiliriz.
Şimdi de çalışan sayısı 1’den fazla olan şehirleri ve çalışan sayılarını getiren sorguyu yazalım.
 SELECT şehir, COUNT(*) FROM `kisiler` GROUP BY şehir HAVING COUNT(*) > 1
Sorgunun çıktısı aşağıdaki gibi olacaktır.
şehirCOUNT(*)
Adana2
Ankara2
New York2

Şimdi yazacağımız sorgunun açıklaması şöyle: Maaş ortalaması 3000’den fazla olan ülkelerdeki erkek çalışanların maaş ortalaması. Burada gruplamanın ülkelere göre yapılacağı ve yalnızca erkek çalışanların hesaba katılacağı açık.
 SELECT ülke, AVG(maaş) FROM `kisiler` WHERE Cinsiyet=1 GROUP BY ülke HAVING AVG(maaş) > 3000
Sorgunun çıktısı aşağıdaki gibidir. Bu sorguda WHERE ve HAVING ifadeleri birlikte kullandığımızdan farklarını rahatça görebiliyoruz.
ülkeAVG(maaş)
Almanya4000.0000
Fransa3700.0000
USA3500.0000
Yukarıdaki sorguyu biraz değiştirelim: Erkek çalışanların sayısı 1’den fazla olan ülkelerin maaş ortalamasını getiren sorgu:
 SELECT ülke, AVG(maaş) FROM `kisiler` WHERE Cinsiyet=1 GROUP BY ülke HAVING COUNT(*) > 1
Sorgunun çıktısı aşağıdaki gibi olacaktır:
ülkeAVG(maaş)
Türkiye2000.0000
Sorguları ve “ne yaptıklarını” dikkatle incelerseniz konuyu daha iyi anlayacaksınız. Bitirmeden önce WHERE ifadesinin her zaman GROUP BY ifadesinden önce geldiğini HAVING’in ise her zaman sonra geldiğini hatırlatalım.

Hiç yorum yok:

Yorum Gönder