Kurs
Toplulaştırma, verilerinizi tek bir değere özetlemenin bir diğer adıdır. Örneğin, ortalama veya minimumu hesaplamak gibi. Bazen tüm verilerinizi toplulaştırmak, işe yaramayan bir değerle sonuçlanır.
Örneğin, mağazanızdaki satın alma davranışını inceliyorsanız ve içeri giren kişiler hem yoksul öğrenciler hem de varlıklı profesyonellerden oluşuyorsa, bu gruplar için ortalama harcamayı ayrı ayrı hesaplamak daha bilgilendirici olur. Yani, harcanan tutarı farklı müşteri segmentlerine göre gruplandırarak toplulaştırmanız gerekir.
Bu eğitim, SQL GROUP BY ifadesini ve her bir gruba hangi veri satırlarının dahil edileceğini kontrol etmenize yardımcı olan HAVING ifadesini kapsar.
HAVING, WHERE ifadesiyle yakından ilişkilidir ve önce SQL'de WHERE İfadesine Giriş eğitimini okumanız faydalı olabilir. Ayrıca SQL Sorgu Örnekleri ve Eğitiminde ele alındığı gibi SELECT ve FROM ifadelerini de anlamalısınız.
Unicorn Şirketleri Veritabanını kullanacağız; bu veritabanı, DataCamp'in yapay zeka destekli veri not defteri olan DataLab'de mevcuttur. Bu şirketlere Unicorn denir çünkü değerlemeleri bir milyar doların üzerindeki girişim şirketleridir. Basitlik olması için üç tabloya odaklanacağız: companies, sales ve product_emissions. Bu eğitimdeki tüm örnek kodları kendiniz çalıştırmak için, veritabanı ve tüm kod örnekleri sizin için önceden yüklenmiş olarak ücretsiz bir DataLab çalışma kitabı oluşturabilirsiniz.
SQL GROUP BY Kullanımı
GROUP BY, verilerden içgörü elde etmek için yaygın olarak kullanılan bir SQL komutudur. Verileri grupladığınızda üç aşama vardır:
- Böl: veri kümesi, toplulaştırma için seçtiğimiz değişkenlerin değerlerine göre satır kümelerine ayrılır
- Uygula: ortalama, minimum ve maksimum gibi bir toplulaştırma fonksiyonu hesaplanır ve tek bir değer döndürülür
- Birleştir: Ortaya çıkan tüm çıktılar tek bir tabloda birleştirilir. Bu şekilde, ilgi duyulan değişkenin her bir düzeyi için tek bir değere sahip oluruz.
SQL GROUP BY Örnek 1
GROUP BY için basit bir örnekle başlayabiliriz. En fazla Unicorn şirkete sahip ilk on ülkeyi bulmak istediğimizi varsayalım.
SELECT *
FROM companies

Sonuçları, şirket sayısına göre azalan sırada olacak şekilde sıralamak da güzel olurdu
SELECT country, COUNT(*) AS n_companies
FROM companies
GROUP BY country
ORDER BY n_companies DESC
LIMIT 10

İşte sonuçlar. Sıralamada ABD, Çin ve Hindistan'ı görmek muhtemelen sizi şaşırtmayacaktır. Bu sorgunun arkasındaki kararı açıklayalım:
-
Öncelikle, her bir grup için satırları saymak üzere, ki bu örnekte ülkeye karşılık gelir,
COUNT(*)kullandığımıza dikkat edin. Ayrıca sütunu daha açıklayıcı bir adla yeniden adlandırmak için SQL takma adını da kullandık. Bu,ASanahtar sözcüğünden sonra yeni adı yazarak mümkündür.COUNThakkında daha fazla bilgiye COUNT() SQL FUNCTION eğitiminde yer verilmektedir. -
Alanlar, her satırı bir Unicorn şirkete karşılık gelen companies tablosundan seçildi.
-
Ardından, verileri ülkeye göre toplulaştırmak için
GROUP BY'dan sonra sütun adını belirtmemiz gerekir. -
ORDER BY, ülkeleri en yüksek şirket sayısından en düşüğe doğru doğru sırada görselleştirmek için gereklidir. -
Sonuçları
LIMITile 10 ile sınırlandırıyoruz; bunun ardından sonuçlarda istediğiniz satır sayısı gelir.
SQL GROUP BY Örnek 2
Şimdi satışlar tablosunu analiz edeceğiz. Her sipariş numarası için müşteri türü, ürün grubu, miktar, birim fiyat, toplam vb. bilgileri görüyoruz.

Bu kez, her ürün grubu için birim başına ortalama fiyatı, toplam sipariş sayısını ve toplam kazancı bulmakla ilgileniyoruz:
SELECT
product_line,
AVG(unit_price) AS avg_price,
SUM(quantity) AS tot_pieces,
SUM(total) AS total_gain
FROM sales
GROUP BY product_line
ORDER BY total_gain DESC

-
Satır saymak yerine, ortalama fiyatı elde etmek için
AVG()fonksiyonunu ve her ürün grubu için toplam sipariş sayısını ve toplam kazancı hesaplamak içinSUM()fonksiyonunu kullandık. -
Daha önce olduğu gibi, veri kümesini parçalara ayıran sütunu başta belirtiyoruz. Ardından toplulaştırma fonksiyonları, ürün grubunun her bir düzeyi için bir satır elde etmemizi sağlar.
-
Bu kez
ORDER BYisteğe bağlıdır. Daha yüksek toplam kazançların her zaman daha yüksek ortalama fiyatlarla veya toplam parçalarla orantılı olmadığını göstermek için dahil edilmiştir.
WHERE'in Sınırlamaları
Önceki örneği tekrar ele alalım. Şimdi sorguya bir koşul eklemek istiyoruz: yalnızca toplam sipariş sayısı 40.000'den yüksek olanları filtrelemek istiyoruz. WHERE ifadesini deneyelim:
SELECT
product_line,
AVG(unit_price) AS avg_price,
SUM(quantity) AS tot_pieces,
SUM(total) AS total_gain
FROM sales
WHERE SUM(total) > 40000
GROUP BY product_line
ORDER BY total_gain DESC
Bu sorgu aşağıdaki hatayı döndürecektir:

Bu hata, toplulaştırma fonksiyonlarının WHERE ifadesinde kullanılamadığını gösterir. Bu sorunu çözmek için yeni bir komuta ihtiyacımız var.
SQL HAVING Kullanımı
WHERE gibi, HAVING ifadesi de bir tablonun satırlarını filtreler. WHERE tüm tabloyu filtrelemeye çalışırken, HAVING, GROUP BY ile tanımlanan her bir grubun içindeki satırları filtreler
SQL HAVING Örnek 1
İşte önceki örnek; bu kez WHERE kelimesinin yerine HAVING koyduk.
SELECT
product_line,
AVG(unit_price) AS avg_price,
SUM(quantity) AS tot_pieces,
SUM(total) AS total_gain
FROM sales
GROUP BY product_line
HAVING SUM(total) > 40000
ORDER BY total_gain DESC

Bu kez üç satır üretecektir. Diğer ürün grupları koşulu karşılamadı; böylece altı sonuçtan üçe düştük.
Sorgudan başka ne fark ediyorsunuz? HAVING'e sütun takma adını değil, orijinal alanın toplulaştırmasını geçirdik. Nedenini mi merak ediyorsunuz? Bir sonraki örnekte bu gizemi çözeceksiniz.
SQL HAVING Örnek 2
Son örnek olarak, şirketlerin sağladığı ürünlerin emisyonlarını içeren product_emissions adlı tabloyu kullanacağız.

Bu kez, “Technology Hardware & Equipment” sektör grubuna ait her şirket için ortalama ürün karbon ayak izini (pcf) göstermeyi istiyoruz. Ayrıca, ürün sayısı ile karbon ayak izi arasında bir ilişki olup olmadığını anlamak için her şirketin ürün sayısını görmek faydalı olacaktır. Yine ortalama karbon ayak izi 100'ün üzerinde olan şirketleri çıkarmak için HAVING kullanıyoruz.
SELECT pe.company, count(product_name) AS n_products, avg(carbon_footprint_pcf) AS avg_carbon_footprint_pcf
FROM product_emissions AS pe
WHERE industry_group = 'Technology Hardware & Equipment'
GROUP BY pe.company, industry_group
having avg_carbon_footprint_pcf>100
ORDER BY n_products

Takma adı kullanmayı denedikten sonra bir hata oluştu. HAVING ifadesi için yeni sütunun adı mevcut değildir; bu nedenle sorguyu filtreleyemez. İsteği düzeltelim:
SELECT pe.company, count(product_name) AS n_products, avg(carbon_footprint_pcf) AS avg_carbon_footprint_pcf
FROM product_emissions AS pe
WHERE industry_group = 'Technology Hardware & Equipment'
GROUP BY pe.company, industry_group
having avg(carbon_footprint_pcf)>100
ORDER BY n_products

Bu kez koşul çalıştı ve tablodan sonuçları görselleştirebiliyoruz. HAVING koşulunun SELECT'ten önce uygulandığı için sütun takma adlarının HAVING'de kullanılamayacağını yeni öğrendik. Bu nedenle alanları yeni adlarından tanıyamaz.
SQL Çalıştırma Sırası
Sorguyu yazarken komutların sıralaması şöyledir:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
Ancak kendinize sormanız gereken bir soru var. SQL komutları hangi sırayla yürütülür? İnsanlar olarak, bilgisayarın SQL'i yukarıdan aşağıya okuduğunu ve yorumladığını varsayma eğilimindeyiz. Ama gerçek, göründüğünden farklıdır. Doğru yürütme sırası şöyledir:
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT
Yani sorgu işlemcisi SELECT ile başlamaz; önce hangi tabloların dahil edileceğini seçer ve SELECT, HAVING'den sonra yürütülür. Bu, HAVING'in neden ALIAS kullanımına izin vermediğini, buna karşın ORDER BY'ın bu konuda sorun yaşamadığını açıklar. Buna ek olarak, bu yürütme sırası, HAVING'in toplulaştırılmış veriler üzerinde koşullar uygulamak için GROUP BY ile birlikte kullanılmasının, WHERE'in ise kullanılamamasının nedenini de açıklar.
Daha fazla bilgi edinmek istiyorsanız, ayrıntılı bir açıklama sunan SQL Çalıştırma Sırası: Sorgular Nasıl Çalışır? eğitimimizi okumanızı öneririm.
Bir Sonraki Aşamaya Taşıyın
Bu eğitimi okuduktan sonra, GROUP BY ile HAVING arasındaki fark hakkında net bir fikre sahip olmalısınız. Bu kavramları pekiştirmek için DataLab'de pratik yapabilirsiniz.
SQL öğrenme yolunda bir sonraki seviyeye geçmek istiyorsanız, Intermediate SQL kursumuzu alabilirsiniz. SQL temellerinizi hâlâ güçlendirmeniz gerekiyorsa, dilin temellerini öğrenmek için Introduction to SQL kursuna geri dönebilirsiniz.