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.

  • 📊 Temel Amaç: GROUP BY, aynı değere sahip satırları gruplandırır ve gruplandırılmış her öğe için tek bir satır döndürür.
  • 🧩 Tek Sütunlu Grupping: Grouping Cinsiyete göre üye tablosu, dokuz satırı ikiye indirgiyor; biri Kadın, diğeri Erkek için.
  • 🔗 Çoklu Sütun Grubuping: Grouping İki sütunlu sistemde, değerlerden herhangi biri farklı olduğunda satır benzersiz olarak kabul edilir, bu nedenle yalnızca birebir aynı olan değerler birleştirilir.
  • 🧮 Toplu Eşleştirme: SAYIM, TOPLAM, AVGMIN ve MAX fonksiyonları her grup için bir değer hesaplar ve bu da özet raporu oluşturur.
  • 🚦 HAVING ve WHERE arasındaki fark: WHERE filtreleri gruplamadan önceki satırları filtreler.pingHAVING daha sonra grupları filtreler ve yalnızca HAVING toplu sonuçları kabul eder.
  • ⚠️ Sıkı Mod Uyarısı: ONLY_FULL_GROUP_BY altında, seçilen her sütun gruplandırılmalı veya bir toplama fonksiyonu içine alınmalıdır.

SQL GROUP BY ve HAVING Maddesi

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.

SSS

Evet. GROUP BY tek başına her benzersiz değer için bir satır döndürür ve bu da SELECT DISTINCT ile aynı şekilde tekrarları ortadan kaldırır. Toplama fonksiyonları yalnızca her grup için hesaplanmış bir rakam gerektiğinde gereklidir.

Seçilen sütun ne GROUP BY ifadesinde yer alıyorsa ne de bir toplama fonksiyonu içinde bulunuyorsa hata oluşur. MySQL Grup için o sütundaki hangi değeri göstereceğine karar veremediği için sorguyu reddediyor.

COUNT(*) ifadesi gruptaki her satırı sayar. COUNT(sütun) ifadesi ise yalnızca o sütunun boş olmadığı satırları sayar. NULLDolayısıyla, sütunda eksik değerler bulunduğunda iki rakam birbirinden farklı olur.

Evet. Yapay zekâ destekli asistanlar, aşağıdaki gibi araçların içinde yer alabilir: MySQL Tezgâh "Cinsiyete göre üye sayısı" gibi bir isteği gruplandırılmış bir sorguya çevirin. Grupları kontrol edin.ping Sütunları kendiniz düzenleyin, çünkü yanlış bir grupping Görünüşte mantıklı ancak yanlış toplamlar üretir.

Genellikle evet. Yapay zekâ destekli sorgu yardımcıları, şu gibi klasik nedenleri işaret eder: JOIN Gruplamadan önce satırları çarpanpingYa da filtre, WHERE yerine HAVING'e yerleştirilebilir. Nihai karar yine de veriyi bilen kişiye aittir.

Bu yazıyı şu şekilde özetleyin: