Mysql HAVING İfadesi
kaynak: http://www.hrzafer.com/sql-16-having-ifadesi
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.
id |
Ad |
Soyad |
Yas |
Cinsiyet |
Şehir |
Ülke |
Maaş |
2 |
Ahmet |
Yılmaz |
20 |
1 |
Ankara |
Türkiye |
2000 |
3 |
Mehmet |
Efe |
22 |
1 |
Bolu |
Türkiye |
2000 |
4 |
Ayşe |
Can |
23 |
0 |
İstanbul |
Türkiye |
3500 |
5 |
Fatma |
Ak |
35 |
0 |
Ankara |
Türkiye |
3200 |
6 |
John |
Smith |
45 |
1 |
New York |
USA |
3500 |
7 |
Ellen |
Smith |
40 |
0 |
New York |
USA |
3500 |
8 |
Hans |
Müller |
30 |
1 |
Berlin |
Almanya |
4000 |
9 |
Frank |
Cesanne |
35 |
1 |
Paris |
Fransa |
3700 |
10 |
Abbas |
Demir |
26 |
1 |
Adana |
Türkiye |
2000 |
11 |
Hatice |
Topçu |
26 |
0 |
Hatay |
Türkiye |
2200 |
12 |
Gülsüm |
Demir |
35 |
0 |
Adana |
Türkiye |
2000 |
Ö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:
ülke |
AVG(maaş) |
Almanya |
4000.0000 |
Fransa |
3700.0000 |
Türkiye |
2414.2857 |
USA |
3500.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:
ülke |
AVG(maaş) |
Fransa |
3700.0000 |
Türkiye |
2600.0000 |
USA |
3500.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:
ülke |
AVG(maaş) |
Fransa |
3700.0000 |
USA |
3500.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.
şehir |
COUNT(*) |
Adana |
2 |
Ankara |
2 |
New York |
2 |
Ş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.
ülke |
AVG(maaş) |
Almanya |
4000.0000 |
Fransa |
3700.0000 |
USA |
3500.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:
ülke |
AVG(maaş) |
Türkiye |
2000.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.
Benim tavsiyem sorguları makalenin başındaki
kisiler
tablosunu kullanarak zihninizden çalıştırmanız. Sorguların sonuç sonuç
kümelerini (çıktılarını) yazmaya çalışın ve buradakilerle karşılaştırın.
Bu şekilde sorguların çalışma mantığını daha iyi anlar ve benzer
sorguları daha rahat yazmaya başlarsınız.
Herkese kolay gelsin.
Hiç yorum yok :
Yorum Gönder