SELECT ile dönen liste 3 parçaya ayrılabilir.
– Süzme işlemi (WHERE alt cümlesi ile yapılabilen)
– Sıralama işlemi (ORDER BY alt cümlesi ile yapılabilen)
– Geri dönen liste üzerinde yapılan işlemler (GROUP BY, HAVING, MAX, SUM, COUNT, MIN….vs.)
Bir SELECT cümlesi yazalım
SELECT Price FROM Customer WHERE Price < 100 AND Price > 50
Bu cmleyi Price’a göre gruplandiralim:
SELECT Count(*), Price FROM Customer WHERE Price < 100 AND Price > 50 GROUP BY Price
Sonuçta Price bilgisi 100 ile 50 arasında olan Customer listesine düşük seviyeli liste diyelim. Bu düşük seviyeli listenin üzerine GRUOP BY ve COUNT işlemleri uygulandıktan sonra ortaya çıkan yeni listeye ise sonuç listesi adını verelim.
Bu bilgiler ışığında GROUP BY alt cümlesinin tanımı:
– Cümleden sonra parametre olarak belirtilen alanın veya alanların değerine göre düşük seviyeli listeyi parçalara ayırır, belirtilen alanın veya alanların kaç farklı değeri var ise o kadar düşük seviyeli liste oluşturur.
COUNT(*), MIN, MAX, AVERAGE gibi fonksiyonların nasıl çalıştıklarını anlamak için:
– Tüm bu fonksiyonlar, düşük seviyeli listenin tamamı üzerine çalışır. Eğer düşük seviyeli liste GRUOP BY ile bölünmüş ise, her bir parça için ayrı ayrı çalışırlar.
Yani son SQL cümlesinde yer alan Count(*) işlemi her Price değeri için bölünmüş olan düşük seviyeli listenin herbir parçası için çalışır. Ve ortaya sonuç listesi olarak, her parçanın içerisinde yer alan kayıt sayısı ve her parçanın ayıraçı konumundaki Price bilgisi çıkar. Örnek;
Count(*) - Price 5 60 7 70 ... vb.
Örnek uygulama:;
SELECT Count(*), Price, Name FROM Customer WHERE Price < 100 AND Price > 50 GROUP BY Price
Yukarıki sorgu neden hata vermektedir:
Şimdi öncelikle düşük seviyeli listenin ne olduğunu bulalım;
– Price bilgisi 100 ile 50 arasında olan Customer bilgileri.. Id, Price, Name…vs.. vs.. Bu listeye ‘A’ listesi diyelim.
‘GRUOP BY’ işlemi olduğuna göre, elimizdeki düşük seviyeli ‘A’ listesi Price bilgisinin değerlerine göre bölümlere ayrılmıştır. Örnek olarak Price bilgisi 5 farklı değere sahip olsun elimizdeki ‘A’ listesi ‘A1, A2, A3, A4, A5′ şeklinde küçük listelere ayrılır.
Daha sonra COUNT(*) işlemi ile bu her bir küçük listenin adet bilgisi ile Price ve Name bilgisi sonuç listesine verilmiştir. Peki burada ki gariplik ne, neden hata veriyor. Sorun şu A listesinden A1′e geçiş sırasında her bir Price’a karşılık ‘n’ adet Name bilgisi oluşmuştur bu nedenle sonuç listesi oluşturulurken, Count bilgisi hesaplanmış, Price bilgisi tek olduğu için alınmış fakat hangi Name bilgisinin kullanılacağına karar verilememiştir.
Düşük Seviyeli Liste’nin son hali..
Id | Price | Name |
1 | 60 | Test60-1 |
2 | 60 | Test60-2 |
3 | 70 | Test70-1 |
4 | 70 | Test70-2 |
5 | 80 | Test80-1 |
6 | 90 | Test90-1 |
‘Group By’ uygulandıktan sonraki düşük seviyeli listenin hali;
Price | Alt Kümeler | ||||||
60 |
|
||||||
70 |
|
||||||
80 |
|
||||||
90 |
|
İşte bu da son ipucu; SQL programlama dilinde herhangi bir liste oluşturabilmek için bir kademe altta yer alan listenin elemanları direkt olarak kullanılabilir ya da fonksiyonlar yardımı ile alt listelere ulaşılıp, toplam, en küçük, en büyük, ortalama.. vb. değerler elde edilebilir.
Bu yazı “http://esiyo.net/select-gruop-by-having/110” adresinden alınmış/özetlenmiştir.
Bir cevap yazın