MySQL GROUP BY ve HAVING Cümlesi Örneklerle
⚡ Akıllı Özet
SQL GROUP BY ve HAVING yan tümceleri, ayrıntılı satırları özet raporlara dönüştürür. GROUP BY, aynı değerlere sahip satırları grup başına tek bir satıra indirgerken, HAVING ise COUNT gibi toplama fonksiyonları uygulandıktan sonra bu grupları filtreler.

SQL GROUP BY ifadesi nedir?
GROUP BY deyimi, aşağıdakileri yapmak için kullanılan bir SQL komutudur: aynı değerlere sahip satırları gruplandırmaBu ifade, SELECT sorgusunun içine yazılır ve genellikle veritabanından özet raporlar üretmek için toplama fonksiyonlarıyla birlikte kullanılır.
İşte yaptığı şey bu: verileri özetler Veritabanında saklanır. GROUP BY yan tümcesini içeren sorgulara gruplandırılmış sorgular denir ve bu sorgular gruplandırılmış her öğe için tek bir satır döndürür.
SQL GROUP BY Söz Dizimi
Şimdi bu maddenin amacının netleştiğine göre, temel bir gruplandırılmış sorgunun sözdizimine bakalım.
SELECT statements... GROUP BY column_name1[, column_name2, ...] [HAVING condition];
İŞTE
- "SELECT sorguları…" standarttır SQL SEÇ komut sorgusu.
- "GROUP BY sütun_adı1"Bu, grubu oluşturan maddedir."ping column_name1'e göre.
- "[, sütun_adı2, …]" " isteğe bağlıdır ve grup oluşturulduğunda diğer sütun adlarını temsil eder.ping Birden fazla sütun üzerinde yapılır.
- "[Sahip olma koşulu]"" isteğe bağlıdır ve GROUP BY yan tümcesinden etkilenen satırları sınırlandırmak için kullanılır. Şuna benzer: WHERE yan tümcesiAncak bu, topraktan sonra uygulanır.ping.
Grouping Tek Sütun Kullanımı
SQL GROUP BY ifadesinin etkisini görmenin en hızlı yolu, gruplandırılmamış bir sorguyu gruplandırılmış bir sorguyla karşılaştırmaktır. Üyeler tablosundaki her cinsiyet kaydını döndüren basit bir sorguyla başlayın.
SELECT `gender` FROM `members`;
| cinsiyet |
|---|
| Kadın |
| Kadın |
| Erkek |
| Kadın |
| Erkek |
| Erkek |
| Erkek |
| Erkek |
| Erkek |
Dokuz satır döndürülüyor ve her değer tekrarlanıyor. Bunun yerine cinsiyet için benzersiz değerleri istediğimizi varsayalım. Aşağıdaki sorgu, GROUP BY yan tümcesini ekler.
SELECT `gender` FROM `members` GROUP BY `gender`;
Yukarıdaki betiğin çalıştırılması MySQL Tezgâh myflixdb'ye karşı yaptığımız karşılaştırma bize şu sonuçları veriyor.
| cinsiyet |
|---|
| Kadın |
| Erkek |
Tabloda yalnızca iki cinsiyet türü bulunduğu için sadece iki satırın döndürüldüğünü unutmayın. GROUP BY ifadesi tüm "Erkek" üyeleri bir araya getirerek onlar için tek bir satır döndürdü ve aynı işlemi "Kadın" üyeler için de yaptı.
Grouping Birden Çok Sütun Kullanma
Grouping Tek bir sütuna odaklanmak, gerçek bir rapor için genellikle çok kaba olur. GROUP BY, virgülle ayrılmış bir sütun listesi kabul eder ve değerlerinin kombinasyonu her grubu tanımlar.
Diyelim ki, film kategori kimliklerinin (category_id) ve filmlerin gösterime girdiği yılların bir listesini istiyoruz. Öncelikle bu basit sorgunun çıktısını inceleyelim.
SELECT `category_id`, `year_released` FROM `movies`;
| kimlik kategorisi | yıl_released |
|---|---|
| 1 | 2011 |
| 2 | 2008 |
| NULL | 2008 |
| NULL | 2010 |
| 8 | 2007 |
| 6 | 2007 |
| 6 | 2007 |
| 8 | 2005 |
| NULL | 2012 |
| 7 | 1920 |
| 8 | NULL |
| 8 | 1920 |
Vurgulanan satırlar, sonucun yinelenen kayıtlar içerdiğini göstermektedir. Aynı sorguyu GROUP BY ile çalıştırmak, bu kayıtları kaldırır.
SELECT `category_id`, `year_released` FROM `movies` GROUP BY `category_id`, `year_released`;
Yukarıdaki betiğin çalıştırılması MySQL Workbenc'in myflixdb'ye karşı yaptığı karşılaştırma aşağıdaki sonuçları vermektedir.
| kimlik kategorisi | yıl_released |
|---|---|
| NULL | 2008 |
| NULL | 2010 |
| NULL | 2012 |
| 1 | 2011 |
| 2 | 2008 |
| 6 | 2007 |
| 7 | 1920 |
| 8 | 1920 |
| 8 | 2005 |
| 8 | 2007 |
GROUP BY yan tümcesi, kategori kimliğini (category_id) ve yayın yılını (year_released) birlikte kullanarak tanımlama yapar. benzersiz 2007 yılında 6. kategoriye ait iki adet aynı satır tek bir satır haline geldi.
Temel kural: Kategori kimliği aynı ancak yayın yılı farklıysa, satır benzersiz olarak kabul edilir. Birden fazla satırda kategori kimliği ve yayın yılı aynıysa, satırlar yinelenenlerdir ve yalnızca biri gösterilir.
Grouping ve Toplu Fonksiyonlar
Yinelenen kayıtları kaldırmak faydalıdır, ancak gruplandırmanın gerçek gücü burada yatmaktadır.ping ile eşleştirildiğinde görünür. toplama işlevleriToplama fonksiyonu her grup için bir değer hesaplar: COUNT satırları sayar, SUM değerleri toplar ve AVGMIN ve MAX, yayılımı tanımlar.
Veritabanındaki toplam erkek ve kadın üye sayısını öğrenmek istediğimizi varsayalım. Aşağıdaki kod bunu yapar.
SELECT `gender`, COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Yukarıdaki betiğin çalıştırılması MySQL Workbench'in myflixdb'ye karşı yaptığı test bize aşağıdaki sonuçları veriyor.
| cinsiyet | COUNT(`üyelik_numarası`) |
|---|---|
| Kadın | 3 |
| Erkek | 6 |
Satırlar, her benzersiz cinsiyet değerine göre gruplandırılır ve her grubun içindeki satır sayısı COUNT toplama fonksiyonu ile sayılır. Dokuz üye kaydı iki özet satırda birleştirilir.
HAVING Yan Tümcesini Kullanarak Sorgu Sonuçlarını Kısıtlama
GroupingHer tablo satırı için her zaman belirli koşullar istenmeyebilir. Bazen raporun belirli bir kritere göre sınırlandırılması gerekir ve bu da HAVING yan tümcesinin görevidir.
Diyelim ki, film kategorisi kimliği 8 olan tüm filmlerin yayın yıllarını öğrenmek istiyoruz. Aşağıdaki kod bu sonucu elde eder.
SELECT * FROM `movies` GROUP BY `category_id`, `year_released` HAVING `category_id` = 8;
Yukarıdaki betiğin çalıştırılması MySQL Workbenc'in myflixdb'ye karşı yaptığı karşılaştırma aşağıdaki sonuçları vermektedir.
| film_id | başlık | yönetmen | yıl_released | kimlik kategorisi |
|---|---|---|---|---|
| 9 | Honey mooners | John Schultz | 2005 | 8 |
| 5 | Babamın Küçük Kızları | NULL | 2007 | 8 |
HAVING koşulu sayesinde yalnızca kategori kimliği 8 olan filmler saklanmıştır.
Uyarı: MySQL 5.7 ve sonraki sürümler varsayılan olarak ONLY_FULL_GROUP_BY modunu etkinleştirir ve bu modda, movie_id, title ve director sütunları gruplandırılmadığı veya toplanmadığı için GROUP BY yan tümcesiyle yapılan SELECT * sorgusu reddedilir. Üretim ortamında, gruplandırılmış sütunları açıkça adlandırın, örneğin SELECT category_id, year_released FROM movies GROUP BY category_id, year_released HAVING category_id = 8;
WHERE vs HAVING vs GROUP BY vs ORDER BY
Yeni başlayanlar bu dört maddeyi sıklıkla birbirine karıştırırlar çünkü bunların hepsi sonuç kümesini şekillendirir. Aradaki fark şudur: ne zaman MySQL Bunları uygulama şekli şöyledir: WHERE, satırlar gruplandırılmadan önce çalışır, HAVING sonra çalışır ve ORDER BY en son çalışır.
| fıkra | Ne yapar | Çalıştığında | Toplama fonksiyonlarını kabul eder. |
|---|---|---|---|
| NEREDE | Gruplandırmadan önce tek tek satırları filtreler.ping. | GRUPLANDIRMADAN ÖNCE | Yok hayır |
| GROUP BY | Aynı değere sahip satırları, grup başına tek bir satırda birleştirir. | NEREDEN sonra | Uygulanamaz |
| HAVING | GROUP BY komutuyla oluşturulan grupları filtreler. | GRUPLANDIRMA işleminden sonra | Evet, örneğin HAVING COUNT(*) > 2 |
| TARAFINDAN SİPARİŞ | Önceki maddelerden sonra kalan satırları sıralar. | Soyad | Evet, toplu takma adlar sıralanabilir. |
Pratik sonuç, performansla ilgili bir sorundur. WHERE ile filtreleme, grup öncesindeki satırları kaldırır.ping Çalışma başladığında, toplu bir sonuca bağlı olmayan bir koşul HAVING yerine WHERE ifadesinde yer almalıdır.
