Özet: Bu yazıda, sütunların veya ifadelerin değerlerini temel alarak satırları alt gruplara ayırmak için MySQL GROUP BY‘ı nasıl kullanacağınızı öğreneceksiniz.
MySQL GROUP BY Deyimine Giriş
GROUP BY deyimi, bir satır dizisini sütun veya ifadelerin değerlerine göre bir özet satır kümesinde gruplandırır. GROUP BY deyimi her grup için bir satır döndürür. Başka bir deyişle, sonuç kümesindeki satır sayısını azaltır.
GROUP BY yan cümlesi SUM, AVG, MAX, MIN ve COUNT gibi toplu işlevlerle kullanırsınız ve bu işlevlere aggregate fonksiyon da denilmektedir. SELECT yan cümlesinde görünen toplama işlevi her grup hakkında bilgi sağlar.
GROUP BY deyimi, SELECT deyiminin isteğe bağlı bir maddesidir. Aşağıdaki GROUP GROUP yan tümcesi sözdizimini gösterir:
1 2 3 4 5 6 7 8 9 | SELECT c1, c2,..., cn, aggregate_function(ci) FROM table WHERE wher_sarti GROUP BY c1 , c2,...,cn; |
GROUP BY deyimi, FROM ve WHERE deyimlerinden sonra görünmelidir. GROUP BY anahtar sözcüğünün ardından, satırları gruplandırmak için ölçüt olarak kullanmak istediğiniz virgülle ayrılmış sütunların veya ifadelerin listesi bulunur.
MySQL GROUP BY örnekleri
Aşağıdaki sorguları yapmak için şekildeki tabloyu kullanacağız.
NOT: GROUP BY kullanırken, SELECT ifadesinin yanında doğrudan alan adı yazılıyorsa bu alan GROUP BY yanında da yazılması gerekir. Bu bilgiyi öğrendikten sonra hadi aşağıdaki bir dizi GROUP BY örneğine bakalım.
Örnek Sorgu 1: Öğrenci tablosundaki sınıfları gruplandırınız.
1 2 3 4 5 | SELECT sinif FROM ogrenci GROUP BY sinif |
Gördüğünüz gibi, GROUP BY deyimi, durum değerlerinin benzersiz oluşumlarını döndürür. Yukarıdaki sorguda gösterildiği gibi DISTINCT işleci gibi çalışır.
GROUP BY deyimi: MySQL ve standart SQL
Standart SQL, GROUP BY deyiminde bir takma ad(ALIAS) kullanmanıza izin vermez, ancak MySQL bunu destekler. Aşağıdaki örneklerin bir kaçında takma ad kullanılmıştır. Bu sorgularda standart SQL’de geçerli değil.
MySQL ayrıca, standart SQL’de olmadığı gibi grupları artan veya azalan sırada sıralamanıza izin verir. Bu yazıdaki örneklerden bir tanesinde mevcut ama siz diğer örneklere de uyarlayabilirsiniz.
GROUP BY deyiminde DESC‘yi, durumu azalan düzende sıralamak için kullandığımıza dikkat edin. Grupları duruma göre artan sırada sıralamak için GROUP BY deyiminde açıkça ASC’yi de belirtebiliriz.
MySQL GROUP BY Toplam (Aggregate) Fonksiyonlar ile Kullanımı
Örnek Sorgu 2: Yukarıdaki örnekte siniflara göre gruplama yaptık. Şimdi hangi sınıfta kaç öğrenci var ona bakalım.( Gruplar içinde saymak için COUNT aggregate fonksiyonu kullanılır.)
1 2 3 4 5 | SELECT sinif, COUNT(*) as 'Mevcut' FROM ogrenci GROUP BY sinif |
Örnek Sorgu 3: Şimdi biraz daha detaylı bir sorguya bakalım. Bu sefer iki tabloyu birleştirip bir sorgu yazalım. Her öğrencinin yapmış olduğu işlem adetini yazdıran sorguyu yapalım. Bu sorguda ogrenci ve islem tabloları aynı anda kullanılacaklar. Ayrıca her öğrenci dediğimiz için gruplama öğrencilere(ogrno) göre olacak.
1 2 3 4 5 6 7 8 9 10 | SELECT ogrenci.ogrno,COUNT(islem.islemno) AS 'islem_adeti' FROM ogrenci LEFT JOIN islem ON ogrenci.ogrno=islem.ogrno GROUP BY ogrenci.ogrno |
Örnek Sorgu 4: Benzer bir örneği bu sefer toplamlar için yapalım. Öncelikle basit bir toplam işlemi ile başlayalım. kitap tablosundaki tür numaraları aynı olan kitapların sayfa sayılarını getiren sorgu aşağıdaki gibi olacaktır. Örneğin tür numarası 2 olan tüm kitapların sayfa sayısı 10253 gibi olacak.
1 2 3 4 5 6 7 8 | SELECT turno,SUM(sayfasayisi) AS 'toplam_sayfa' FROM kitap GROUP BY turno |
Örnek Sorgu 5: Tür numaraları yerine tür adları olsa çok daha iyi olurdu. Bu sorguda da tür adları ile toplam sayfa sayısını getiren sorguyu yapalım.
1 2 3 4 5 6 7 8 9 10 | SELECT tur.turno, tur.turad,SUM(sayfasayisi) AS 'toplam_sayfa' FROM kitap JOIN tur ON kitap.turno=tur.turno GROUP BY tur.turno, tur.turad |
Örnek Sorgu 6: Başka bir aggregate fonksiyon olan MAX yada MIN için de şöyle bir örnek düşünebiliriz. Her sınıftaki en yaşlı öğrencileri listeleyen sorguyu yapalım. (En yaşlı öğrenci aslında doğum tarihi en eski olandır. MIN kullanacağız)
1 2 3 4 5 6 7 8 | SELECT sinif,MIN(dtarih) FROM ogrenci GROUP BY sinif |
Örnek Sorgu 7: Yine aynı örneği bu sefer doğum tarihine göre değil de yaşına göre yapacak olursak, yaşını hesaplayıp MAX kullanabiliriz. (Yaş=BUGUN YILI-DYILI şeklinde hesaplanır)
1 2 3 4 5 6 7 8 | SELECT sinif,MAX(YEAR(NOW())- YEAR(dtarih)) FROM ogrenci GROUP BY sinif |
MySQL GROUP BY İfade ile Kullanımı
GROUP BY yanında diğer ifadeleri de kullana bilirsiniz.
Örnek Sorgu 8: Öğrencileri yaşlarına göre gruplayıp kaç farklı yaş olduğunu bulan sorguyu aşağıdaki gibi yazabiliriz.(Bu sorgunun geliştirilmiş hali aşağıdaki sorguda mevcuttur)
1 2 3 4 5 6 7 8 | SELECT (YEAR(NOW())- YEAR(dtarih)) AS 'YAS' FROM ogrenci GROUP BY (YEAR(NOW())- YEAR(dtarih)) |
1 2 3 4 5 6 7 8 | SELECT (YEAR(NOW())- YEAR(dtarih)) AS 'YAS' FROM ogrenci GROUP BY YAS |
Örnek Sorgu 9: Öğrencileri yaşlarına göre gruplayıp her yaştan kaç tane öğrenci olduğunu öğrenmek için aşağıdaki sorguyu yazmak gerekir.
1 2 3 4 5 6 7 8 | SELECT (YEAR(NOW())- YEAR(dtarih)) AS 'YAS',COUNT(*) AS 'MEVCUT' FROM ogrenci GROUP BY YAS |
Bu İKİ örnekte, yıl verisini kullanarak doğum tarihlerini hesapladık. Bu hesaplamaya bir tane YAS adında ALIAS(takma ad) tanımlayıp, bu değere göre gruplama yaptık. Ayrıca ikinci örnekte Yaşlara göre gruplanan öğrencileri COUNT ile saydırarak, hangi yaştan kaç tane öğrenci olduğunu öğrendik. Daha önce de belirttiğim gibi SELECT yan tümcesinde görünen ifadenin GROUP BY yan tümcesinde olduğu gibi olması gerektiğini unutmayın.
MySQL GROUP BY HAVING yan Cümlesi ile Kullanımı
GROUP BY deyimiyle döndürülen grupları filtrelemek için HAVING deyimi kullanın.
Örnek Sorgu 10: Aşağıdaki sorguda 22 yaş ve altında olan öğrencilerin, her yaş grubunda kaç tane öğrenci olduğunu bulan sorgu yazılmıştır.
1 2 3 4 5 6 7 8 9 | SELECT (YEAR(NOW())- YEAR(dtarih)) AS 'YAS',COUNT(*) FROM ogrenci GROUP BY YAS HAVING YAS<=22 |
SQL de Having ve Where Arasındaki Fark Nedir?
Öncelikle şunu belirteyim, GROUP BY MySQL yada MSSQL her ikisinde de aynı şekilde kullanılmaktadır. Having ifadesi GROUP BY ile gruplanan ifadeleri filtrelemek için kullanılır. Yukarıdaki örnek olduğu gibi YAŞ değerine göre gruplayıp, yine aynı YAS değerinde HAVING ile filitreleme yapıldı. Aşağıdaki örnekte ise öğrenci tablosundaki sütun değerleri üzerinde filtreleme yapılmıştır.
Öğrencileri yaşlara göre gruplayıp yaşlar üzerinden filtreleme işlemini GRUOP BY yaparken, gruplama dışında kalan alanlarda filitreleme işlemini WHERE yan cümlesi yapmaktadır. WHERE ile tüm tablo üzerinde filtreleme yapılırken, HAVING ile sadece gruplar üzerinde filtreleme yapılmaktadır.
Örnek Sorgu 11: Aşağıdaki sorgu her yaş grubundan MART ayında doğan kaç öğrenci olduğunu göstermektedir.
1 2 3 4 5 6 7 8 9 10 | SELECT (YEAR(NOW())- YEAR(dtarih)) AS 'YAS',COUNT(*) FROM ogrenci WHERE MONTH(dtarih)=3 GROUP BY YAS |
Örnek Sorgu 12: Having ve WHERE yan cümleleri bir arada da kullanmak mükündür. Yukarıdaki iki örneği birleştirecek olursak şöyle bir sorumuz oluşacaktır.
22 yaş ve altındaki gruplardan mart ayında dünyaya gelen öğrencilerin kaçar tane olduğunu yazdıran sorguyu aşağıdaki gibi yaparız.
1 2 3 4 5 6 7 8 9 10 11 | SELECT (YEAR(NOW())- YEAR(dtarih)) AS 'YAS',COUNT(*) FROM ogrenci WHERE MONTH(dtarih)=3 GROUP BY YAS HAVING YAS<=22 |
Göründüğü gibi MART ayındaki öğrencileri bulmak için WHERE yan cümlesi kullanılırken, gruplanan yaşlardaki yaşı 22 altında kalan öğrencileri bulmak içinse HAVING kullanılmıştır.
Örnek Sorgu 12: GROUP BY yan cümlesi ile sıralama yapmak mümkündür. Aşağıdaki örnekte öğrencileri sınıflara göre gruplayıp, sınıf ismine göre azalan şekilde sıralanmıştır.
1 2 3 4 5 6 7 8 | SELECT sinif FROM ogrenci GROUP BY sinif DESC |
Bu derste, size sütunların veya ifadelerin değerlerini temel alarak satırları alt gruplarda gruplamak için MySQL GROUP BY deyimini nasıl kullanacağınızı gösterdik.
hocam emeğinize sağlık çok faydalı oldu daha karmaşık sql sorgularını 4 gözle bekliyorum