SQL Sorgusunda Gruplama Nasıl Yapılır?

SQL’de bazı kayıtlar ortak bilgiler içerebilir ve bu kayıtları sorgulayarak gruplama yapıp sonuçları görmek isteriz.

Gruplamayı yaparken ise tek tek uğraşmadan sonuçları görüntülememiz gerekir. Bu tarz durumlarda kullanacağımız ifade “GROUP BY” olur.

GROUP BY, tabloyu ya da birlikte sorgulanan tabloları gruplara bölmek için kullanılır. Performans açısından istenilen özellikleri sunan bir işleçtir. Doğru kullanım ile sorgular daha pratik sonuçlanır ve ekstra bir çaba gerektirmez.

GROUP BY Sorgusu Nasıl Kullanılır?

Sorgunun genel kullanımı aşağıdaki gibidir.

SELECT alanlar, 
FROM tablo_adi
WHERE sartlar
GROUP BY istenen alanlar
ORDER BY alanlar

GROUP BY işlecini kullanırken, gruplama yapılacak kolonlar(alanlar) SELECT ifadesinden sonra listelenmesi doğru kullanımdır. Farklı bir sırayla yazıldığında çekilen sorguların hangi verilere ait olduğu anlaşılmaz ve sorgular mantıksız durur.

NOT: GROUP BY ifadesi “ORDER BY” gibi sonuçları sıralamak için değil gruplara göre hesaplama yapılacağı sorgularda kullanılır.

Örnek

Konuyu daha detaylı örneklerle görmek için yeni bir tablo açalım ve sorgumuzu yazmaya başlayalım. Sonra da tablo üzerinde gruplama yapalım.

tablo: siparisler

kayitNostokAdımüsteriAdıteslimatAdresimiktarsiparisTarihifiyat
1pantolonKenan KabulAdana22021-03-0270
2etekDerya Usluİstanbul12021-05-1265
3mouseEvren Dereoğluİstanbul12021-04-0590
4laptopHande UlusoyEdirne12021-11-035400
5hoparlörKaan KızmazEdirne12021-08-0755
6kazakFatma YönelenAdana32021-02-0260
78 GB RAMZehra ÜnlüMardin12021-02-08580
8takım elbiseAdnan ŞanlıoğluMardin22021-09-063450
9ceketŞükrü AydınlıAdana32021-06-032500
10mouse Fırat OrtakMardin12021-08-071200
11elbiseFahriye SoyluEdirne22021-04-0399
12TVMurat Mühürlüİstanbul12021-06-095700
sipariş tablosu

Örneğin elimizdeki veride hangi siparişten kaç adet alınmış tarzında bir analiz yapmak isteyelim. Bu analizi her bir şehir için tek tek sonuç üreterek bulabiliriz. Bu, uzun yol olur. Diğer yöntemimiz ise GROUP BY ifadesini kullanarak istediğimiz sonuçlara tek bir sorguda ulaşmak olur.

siparisler tablosu şehirlere göre gruplanırsa nasıl bir sonuçla karşılaşırız? Tabloda Adana, İstanbul, Edirne ve Mardin olmak üzere 4 farklı şehir olduğu için “teslimat adresi Adana olanlar, teslimat adresi İstanbul olanlar, teslimat adresi Edirne olanlar ve teslimat adresi Mardin olanlar” şeklinde 4 farklı grup oluşur. Yani şehir alanında Adana, İstanbul, Edirne ve Mardin değerleri bulunan sorguları gruplamış oluruz.

O halde artık sorgumuzu yazabiliriz.

   SELECT teslimatAdresi FROM siparisler GROUP BY teslimatAdresi

Sorgu çıktısı aşağıdaki gibi olur:

teslimatAdresi
1Adana
2Edirne
3İstanbul
4Mardin
Sorgu Tablosu

Her bir şehre ait siparişlerin toplam fiyatlarını gruplamak içinse;

SELECT teslimatAdresi, SUM(fiyat) 
FROM siparisler 
GROUP BY teslimatAdresi

sorgusunu kullanırız. Sorgu sonucunda tablo aşağıdaki şekli alır:

teslimatAdresiSUM(fiyat)
1Adana2630
2Edirne5554
3İstanbul5855
4Mardin5230
Sorgu Sonuç Tablosu

Hangi şehrin kaç kez geçtiğini bulmak istersek;

   SELECT teslimatAdresi, COUNT(*) 
   FROM siparisler 
   GROUP BY teslimatAdresi;

sorgusu bize yardımcı olur.

4 şehrin en yüksek fiyatlarını gruplamak için ise aşağıdaki sorgu kullanılır:

  SELECT teslimatAdresi, 
  MAX(fiyat) AS 'En Yüksek Fiyat' 
  FROM siparisler 
  GROUP BY teslimatAdresi;
Sonuç Görseli

NULL Değerleri Gruplama

Veri seti içindeki kayıtlar her zaman dolu olmaz, bazı alanlarda NULL değere sahip değerler olabilir. Bu tarz durumlarda NULL değerler kendi içinde gruplandırılarak sorgular tamamlanır.

SELECT teslimatAdresi , COUNT(*) [sayısı] 
FROM siparisler GROUP BY teslimatAdresi

Sorgusu ile boş değerler kendi arasında gruplanmış olur. Tablodan birkaç teslimat adresini silip NULL değere çekersek sonuç şu şekilde karşımıza çıkar;

Sorgu Sonuç Görseli

İşleçlerin Kullanım Sırası

  • GROUP BY ifadesi ile kullanılan işleçlerle sorguları koşullandırabilir, filtre uygulayabilir ve sıralama yapabiliriz.

Grup koşulları ekleyebilmek için HAVING ifadesi işimize yarar. HAVING ile bir koşula uyan gruplar oluşturabiliriz. Böyle bir durumda kullanım sırası şu şekilde olur: Önce GROUP BY kullanılır ve sorgular gruplandırılır. Sonra HAVING kullanılarak koşula uygun grupların listesi alınır.

Kullanımı şu şekildedir:

SELECT teslimatAdresi, COUNT(*)

FROM siparisler

GROUP BY teslimatAdresi

HAVING count(teslimatAdresi)>=3;

siparisler tablosunda her bir şehir 3 kere tabloda bulunduğu için bu sorgunun sonucu her şehir için 3 olarak döner ve 4 şehir de sonuç tablosunda yer alır.

  • GROUP BY ifadesinin yanında WHERE işlecini kullanarak kayıtlara filtre uygulayabiliriz. Bu durumda kriterleri kendimiz belirleyerek gruplamanın belli kriterler dahilinde olmasını sağlamış oluruz.

Sorguyu kullanabilmek için önce WHERE, sonra GROUP BY ifadesi kullanılmalıdır. Çünkü bu sayede veriler önce filtrelenir sonra da gruplanır.

  • Ayrıca verileri bir de sıralamak istiyorsak ORDER BY ifadesi işimize yarar.

Sıralama işlemi, diğer işleçlerden sonra yapılır. Yani ORDER BY ifadesini en sonda kullanmamız gerekir.

Küçük bir örnekle son söylediklerimi toparlamak isterim:

SELECT teslimatAdresi, COUNT(*)

FROM siparisler

WHERE miktar>2

GROUP BY teslimatAdresi

HAVING count(teslimatAdresi)>=2;

Öncelikle miktarı 2’den büyük olan siparişlerin filtrelenmesi WHERE ile sağlandı. Sonra filtrelenen kayıtlar üzerinde sorgu GROUP BY ile devam etti. Sorgular teslimat adreslerine göre gruplandırıldı. Ve HAVING ile teslimat adresi 2’nin üzerindeki kayıtların alınması sağlandı.

Neden Kayıtlar Elenerek Sorgulama Yapılır?

Elinizde binlerce satırlardan oluşan bir personel veri seti olduğunu düşünün. Personel TC kimlik numarası, ismi, işe giriş tarihi, aldığı maaş, kullanmış olduğu izinler gibi alanlardan oluşan sütunları olduğunu da göz önüne alalım.

Böyle bir veri setinde eleme yapmadan direkt “işe giriş tarihlerine göre gruplama yaptıktan sonra Ocak 2020’den önce işe girmiş personelleri seçmek” mi daha kolay olur yoksa “işe giriş tarihi Ocak 2020’den önceki personelleri filtreledikten sonra onlar üzerinde işlemlere devam etmek” mi ?

Tabi ki 2. durum daha kullanışlı olur. Çünkü bu sayede gruplamadan önce eldeki veriler daha az kalmış olur. Daha az veri içinden yeni bir gruplama yapmak işleri karıştırmadan devam edebilmeyi sağlar. Başka bir deyişle, sorguda kullanılmayacak veriler önceden elden çıkarılmış olur ve işlevi olacak veriler göz önünde durur.

Bir sonraki yazılarda görüşmek dileğiyle. Hoşça kalın..

Yorum bırakın