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
kayitNo | stokAdı | müsteriAdı | teslimatAdresi | miktar | siparisTarihi | fiyat |
1 | pantolon | Kenan Kabul | Adana | 2 | 2021-03-02 | 70 |
2 | etek | Derya Uslu | İstanbul | 1 | 2021-05-12 | 65 |
3 | mouse | Evren Dereoğlu | İstanbul | 1 | 2021-04-05 | 90 |
4 | laptop | Hande Ulusoy | Edirne | 1 | 2021-11-03 | 5400 |
5 | hoparlör | Kaan Kızmaz | Edirne | 1 | 2021-08-07 | 55 |
6 | kazak | Fatma Yönelen | Adana | 3 | 2021-02-02 | 60 |
7 | 8 GB RAM | Zehra Ünlü | Mardin | 1 | 2021-02-08 | 580 |
8 | takım elbise | Adnan Şanlıoğlu | Mardin | 2 | 2021-09-06 | 3450 |
9 | ceket | Şükrü Aydınlı | Adana | 3 | 2021-06-03 | 2500 |
10 | mouse | Fırat Ortak | Mardin | 1 | 2021-08-07 | 1200 |
11 | elbise | Fahriye Soylu | Edirne | 2 | 2021-04-03 | 99 |
12 | TV | Murat Mühürlü | İstanbul | 1 | 2021-06-09 | 5700 |
Ö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 | |
1 | Adana |
2 | Edirne |
3 | İstanbul |
4 | Mardin |
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:
teslimatAdresi | SUM(fiyat) | |
1 | Adana | 2630 |
2 | Edirne | 5554 |
3 | İstanbul | 5855 |
4 | Mardin | 5230 |
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;
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;
İş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