10. Groupby – Having komutları

1.GROUP BY KULLANIMI

Bazen veri tabanındaki kolonları gruplandırılmış bir şekilde ekrana sunmak isteyebiliriz. Bu gibi durumlarda group by devreye girer. Group by kolonları gruplandırmak için kullanılır. Bazı kullanım koşulları vardır.

Örneğin aşağıdaki tabloda ürünleri kayıt sayisina (k_no) göre gruplandırmak isteyelim. Yani 1 numaralı kayıttan 5 tane 2  numaralı kayıttan 3 tane 3 numaralı kayıttan 4 tane vardır gibi.

select k_no, COUNT(*) from urunler group by k_no

yukarıdaki yapıyı detaylıca açıklamak gerekirse ; bize iki kolon sunacak biri k_no diğeri birşeylerin toplam sayısı… daha sonra hangi tablodan çekilceği belirtiliyor “urunler” ve en sonda da group by.. group by ifadesinden sonra gruplandırılması gereken kolon yazılır. Bu gruplandıralacak kolon baştaki aggregate fonksiyona gönderme yapar. Yani count(*)  k_no yu gruplandırılmış bir vaziyette toplayarak sunacak demektir.

O zaman group by ifadesi kullanılırken olmassa olmazlarımız ;

  1. Group by “gruplanacak kolon”
  2. Groupby’ın gönderme yaptığı aggreagate fonksiyon
select k_no,SUM(fiyat) from urunler group by  k_no

Yukarıdaki örnekte ise yine k_no’suna göre gruplandırma yapmakta ama bu sefer gruplandırmanın eşleşmesi adet saymak değil o kolonların fiyatlarını toplamak yani 1 nolu kayıtlı ürünlerin fiyatları toplamı, 2 nolu ürünlerin fiyatları toplamı , 3 nolu ürünlerin fiyatları toplamı şeklide olacaktır.

Yine group by ifadesi aggreagate fonksiyona gönderme yapmaktadır. k_no’ya göre gruplandır ve her bir grubun fiyatını topla demektedir.

2. İKİ KOLON İLE GRUPLANDIRMA

Bazen gruplandırma işlemi tek kolonla sınırlı olmaz. İki kolon ile gruplandırma yapmamız gerekebilir. Örneğin  İl ve ilçe kolonlarımız olduğunu varsayalım. Gruplandırmayı şu şekilde yapmak isteyebiliriz. İstanbul ilinin silivri içesinde, beylikdüzü ilçesinde vs.. izmir ilin ilçelerinde kaçar tane kayıt olduğunu ekrana bastır. Bu durumda önce illere göre sonra da ilçelere göre gruplandırma yapmamız gerekir ki bu da oldukça basit bir işlemdir.

select sehir,adres,COUNT(*) from Kayıtlar group by sehir,adres
  • Null durumu : Eğer kayıtlarda null kayıtlar varsa onlar da ayrı olarak gruplandırılır.

3. GROUP BY ile SORGU İFADELERİ KULLANMAK

Group by ile iki şekilde sorgu kullanılabilir. Bunlar tabloyu gruplandırmadan önce ve gruplandırdıktan sonradır. Yani siz bir tablodaki değerleri daha gruplandırmadan önce filtreden geçirebilir ve sonra gruplandırabilirsiniz yahut önce gruplandırıp sonra o tablo üzerinde sorgulama işlemi yapabilirsiniz.

  1. Tablo gruplandırmadan önce sorgu işlemi yapmak için –> where
  2. Tablo gruplandırıldıktan sonra sorgu işlemi yapmak için –> having       kullanılır.

      3.1 Tablo gruplandırılmadan önce sorgu işlemi yapmak 

Burada fiyatlar önce filtrelenmiş ardından kalanlar arasında gruplandırma yapılmıştır.

    select  k_no, SUM(fiyat)  from  urunler  where  fiyat>1000  group by  k_no

      3.2  Tablo gruplandırıldıktan sonra sorgu işlemi yapmak

             Burada önce gruplandırma yapılıp bir sonuca ulaşılmış daha sonrasında ortaya çıkan tablo üzerinden filtreleme yapılmıştır. Having ile aggregate fonksiyon kullanmak zorunludur. Çünkü sorgu sonrası                     aggreagete fonksiyon kullanıı ile ortaya çıkan gruplanmış ifade değerleri aslında orjinal tabloda var olmayan değerlerdir. Bu sebepten where ile sorgulanamaz.

     select k_no,SUM(fiyat) from urunler group by k_no HAVING SUM(fiyat) > 4700

WHERE ve HAVING ARASINDAKİ FARK

Where tabloda var olan değerler üzerinden sorgu yapabilirken having gruplandırma sonucunda aggregate fonksiyon kullanımıyla ortaya çıkan aslında var olmayan veriler üzerinden sorgulama yapar. Bu sebeptendir ki having ile birlikte aggreagate fonksiyon kullanımı zorunludur.