Ana içeriğe atla

SQL'de GROUP BY ve HAVING Nasıl Kullanılır

Veri kümenizdeki satırları toplulaştırmak için en popüler iki SQL komutunu keşfetmeye yönelik sezgisel bir rehber
Güncel 16 Nis 2026  · 6 dk. oku

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

SQL SELECT kullanımına örnek

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

SQL SELECT DESC ORDER örnekleri

İş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, AS anahtar sözcüğünden sonra yeni adı yazarak mümkündür. COUNT hakkı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ı LIMIT ile 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.

SQL örnek tablo

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

Bir SQL tablosunda ortalamaları ve toplamları toplulaştırma

  • 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çin SUM() 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 BY isteğ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:

WHERE ile toplulaştırma fonksiyonları kullanıldığında SQL hata mesajı

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

HAVING ifadesiyle SQL tablosu

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.

Başarılı HAVING toplulaştırmasına sahip SQL tablosu

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

Sütun adı mevcut olmadığında HAVING kullanırken SQL hatası

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

HAVING ile başarılı SQL sorgusu

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. 

Konular

SQL Kursları

Kurs

Data Manipulation in SQL

4 sa
317K
Master the complex SQL queries necessary to answer a wide variety of data science questions and prepare robust data sets for analysis in PostgreSQL.
Ayrıntıları GörRight Arrow
Kursa Başla
Devamını GörRight Arrow