Select, Group By, Having

Merhabalar,

Bu yazı, bir Önceki SQL nedir, ne değildir ? adlı yazının devamı şeklinde olacak ve ‘Group By’ ve ‘Having’ ile SELECT sonuçu olarak dÖnen liste üzerinde yapılan işlemlere değineceğiz.

Geçen yazımızdan hatırlayacağınız gibi, SELECT cümlesi geriye bir liste dÖnen bir ve üç ana parçaya ayırabileceğimiz bir komut idi. Bu ana parçalardan kısaca bahsedecek olursak;
– 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.)

Peki SELECT cümlesinde gerçekleşen olayları biraz daha derinden inceleyelim, bu şekilde GROUP BY ve diğer işlemlerin anlaşılmasını kolaylaştırmaya çalışalım.

SELECT Price
  FROM Customer
 WHERE Price < 100
   AND Price > 50

Bu SQL cümlesinden geriye bir liste gelir, buraya kadar herşey çok normal ve oldukça basit. Ama biz biraz daha analitik bir liste istersek ki iş dünyasında bu çeşit listelere oldukça fazla başvuruluyor.

  SELECT Count(*), Price
    FROM Customer
   WHERE Price < 100
     AND Price > 50
GROUP BY Price

Yukarıdaki cümlede durum biraz karışık ama inanın gÖründüğü kadar değil, şÖyleki; Bu SELECT cümlesi bir üstte belirtiğimiz SELECT cümlesi ile aynı listeyi oluşturur ama son yazılan SELECT cümlesine ‘Count(*)’ ve ‘GRUOP BY’ gibi SELECT’den dÖnen listeyi değiştiren alt cümleleri eklenmiştir. Biz standart listeleme işleminden dÖnen (yani Price bilgisi 100 ile 50 arasında olan Customer listesine) listeye 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.

Veri tabanı uygulamaları, işte bu mantık doğrultusunda Öncelikle düşük seviyeli listeleri oluşturur ve bu düşük seviyeli listeler üzerine yapılan işlemlerle sonuç listesini meydana getirirler. Bu bilgiler ışığında GROUP BY alt cümlesinin tanımı şu şekilde olabilir;
– 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.

Bu tanım biraz daha aklınıza yattı değil mi.. ?

Peki şimdi bir de COUNT(*), MIN, MAX, AVERAGE gibi fonksiyonların nasıl çalıştıklarını anlatmaya çalışalım;
– 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.

Peki biz şu şekilde bir SQL cümlesi yazacak olursak;

  SELECT Count(*), Price, Name
    FROM Customer
   WHERE Price < 100
     AND Price > 50
GROUP BY Price

Veri tabanı bize hata verecektir. Hemen aklınızdan ‘Kardeşimmmm bu ne hatası bÖyleee…. eee Customer üzerinde Name var.. neden gÖrmez bunu bu salak..’ vb. düşünceler geçebilir. Aman geçmesin çünkü veri tabanı manyağı haklı. Peki neden haklı onu inceleyelim;

Ş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
Id Name
1 Test60-1
2 Test60-2
70
Id Name
1 Test70-1
2 Test70-2
80
Id Name
1 Test80-1
90
Id Name
1 Test90-1

İş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.

Kolay gelsin.

Share