# PostgreSQL’de GROUP BY Sonrası Filtreleme Nasıl Yapılır?
PostgreSQL veritabanınızda karmaşık sorgulamalar yaparken, GROUP BY deyimiyle verileri gruplandırdıktan sonra bu grupları filtrelemek isteyebilirsiniz. Örneğin, her müşterinin yaptığı toplam alışveriş miktarını hesapladıktan sonra, sadece belirli bir tutardan fazla alışveriş yapan müşterileri görmek isteyebilirsiniz. Bu makalede, PostgreSQL’de GROUP BY işleminden sonra verileri filtrelemenin farklı yollarını, gerçek dünya örnekleriyle ve adım adım kılavuzlarla inceleyeceğiz. Farklı seviyelerdeki kullanıcılar için hazırlanmış adım adım bir öğrenme yol haritası sunacağız. Veri analizi ve performans optimizasyonu konularına da değineceğiz.
Temel Kavramlar: GROUP BY ve HAVING
GROUP BY deyimi, verileri belirli sütunlara göre gruplandırmak için kullanılır. Her grup için, SELECT deyiminde belirtilen toplama fonksiyonları (örneğin, SUM, AVG, COUNT, MAX, MIN) uygulanır. Ancak, GROUP BY‘dan sonraki filtreleme için WHERE deyimini kullanamayız. WHERE deyimi, *gruplandırma öncesinde* satırları filtreler. GROUP BY‘dan sonraki filtreleme için ise HAVING deyimini kullanırız.
1. Yeni Başlayanlar İçin: Adım Adım Açıklama ve Basit Kod Örneği
Örneğin, bir e-ticaret sitesinin ürün satışlarını içeren bir tablo düşünelim:
| ÜrünID | ÜrünAdı | Fiyat | SatışAdedi |
|—|—|—|—|
| 1 | Kitap | 25 | 10 |
| 2 | Kalem | 5 | 20 |
| 1 | Kitap | 25 | 15 |
| 3 | Defter | 10 | 5 |
| 2 | Kalem | 5 | 12 |
Her ürünün toplam satış gelirini hesaplamak ve toplam geliri 200 TL’den fazla olan ürünleri filtrelemek isteyelim.
Adım 1: GROUP BY ile ürünlere göre gruplandırma:
SELECT ÜrünID, ÜrünAdı, SUM(Fiyat * SatışAdedi) AS ToplamGelir
FROM Satislar
GROUP BY ÜrünID, ÜrünAdı;
Bu sorgu, her ürün için toplam geliri hesaplar.
Adım 2: HAVING ile filtreleme:
SELECT ÜrünID, ÜrünAdı, SUM(Fiyat * SatışAdedi) AS ToplamGelir
FROM Satislar
GROUP BY ÜrünID, ÜrünAdı
HAVING SUM(Fiyat * SatışAdedi) > 200;
Bu sorgu, toplam geliri 200 TL’den fazla olan ürünleri filtreleyerek sadece bu ürünlerin toplam gelirlerini gösterir.
2. Orta Seviye: Gerçek Hayat Örneği ve Optimizasyon İpuçları
Bir online oyun şirketinin kullanıcı verilerini ele alalım. Her kullanıcının oynadığı oyun sayısını ve toplam oyun süresini hesaplamak ve toplam oyun süresi 100 saatten fazla olan kullanıcıları bulmak istiyoruz.
SELECT KullaniciID, COUNT(OyunID) AS OynananOyunSayisi, SUM(OyunSuresi) AS ToplamOyunSuresi
FROM OyunOyuncular
GROUP BY KullaniciID
HAVING SUM(OyunSuresi) > 100;
Optimizasyon İpuçları:
* İndeksler: OyunSuresi ve KullaniciID sütunlarına indeks eklemek sorgu performansını önemli ölçüde artırabilir. fatihsoysal.com sitesindeki PostgreSQL optimizasyon makalelerine göz atabilirsiniz.
* WHERE kullanımı: Eğer GROUP BY öncesinde filtreleme yapabiliyorsanız (WHERE ile), bunu yaparak GROUP BY işlemine gelen veri miktarını azaltın ve performansı artırın. Örneğin, sadece belirli bir tarih aralığındaki oyunları filtrelemek istiyorsanız, WHERE deyimini kullanabilirsiniz.
3. İleri Seviye: Performans Analizi ve Edge Case’ler
Çok büyük veri kümeleriyle çalışırken, GROUP BY ve HAVING kombinasyonunun performansı düşebilir. Bu durumda, aşağıdaki teknikleri kullanabilirsiniz:
* CTE (Common Table Expression): Karmaşık sorguları daha okunaklı ve optimize edilebilir hale getirir.
* Window Fonksiyonları: GROUP BY‘a alternatif olarak, özellikle karmaşık hesaplamalar gerektiğinde kullanılabilir.
* Materyalize Görünümler: Sık kullanılan sorguların sonuçlarını önbelleğe alarak performansı artırır.
Edge Case’ler:
* NULL değerler: SUM, AVG gibi toplama fonksiyonları NULL değerleri dikkate almaz. COALESCE fonksiyonu ile NULL değerlerini 0 veya başka bir değerle değiştirebilirsiniz.
* Çoklu gruplandırma: Birden fazla sütuna göre gruplandırma yaparken, HAVING deyimi ile filtreleme yaparken dikkatli olun. Filtreleme koşulunun her grup için doğru şekilde uygulandığından emin olun.
4. PostgreSQL’de HAVING Kullanımının Ayrıntılı Analizi
HAVING deyimi, GROUP BY deyimiyle oluşturulan grupları filtrelemek için kullanılır. WHERE deyiminden farklı olarak, HAVING deyimi gruplama *sonrasında* uygulanır ve toplama fonksiyonlarını içeren koşullar kullanılmasına izin verir. Bu, her grubun özelliklerine dayalı filtreleme yapmamızı sağlar. Örneğin, sadece ortalama satış fiyatı 50 TL’den fazla olan ürün gruplarını görüntülemek için HAVING AVG(Fiyat) > 50 koşulunu kullanabiliriz.
5. Gerçek Dünya Senaryolarında HAVING Kullanımı: Vaka Analizleri
Vaka 1: E-ticaret Sipariş Analizi: Bir e-ticaret şirketinin günlük sipariş verilerini ele alalım. Her günün toplam sipariş sayısını ve toplam sipariş değerini hesaplamak ve toplam sipariş değeri 10.000 TL’den fazla olan günleri bulmak istiyoruz. Bu durumda, GROUP BY gün tarihine göre yapılır ve HAVING ile toplam sipariş değeri filtrelenir.
Vaka 2: Sosyal Medya Etkileşim Analizi: Bir sosyal medya platformunda her kullanıcının gönderi sayısını ve toplam beğeni sayısını hesaplamak ve toplam beğeni sayısı 1000’den fazla olan kullanıcıları bulmak istiyoruz. GROUP BY kullanıcı kimliğine göre yapılır ve HAVING ile toplam beğeni sayısı filtrelenir.
Vaka 3: Web Sitesi Ziyaretçi Analizi: Bir web sitesinin günlük ziyaretçi sayısını ve ortalama ziyaret süresini hesaplamak ve ortalama ziyaret süresi 5 dakikadan fazla olan günleri bulmak istiyoruz. GROUP BY gün tarihine göre yapılır ve HAVING ile ortalama ziyaret süresi filtrelenir.
6. Performans Optimizasyonu için İpuçları ve Stratejiler
GROUP BY ve HAVING ile büyük veri kümelerinde çalışırken performans sorunlarıyla karşılaşabilirsiniz. Bunun önüne geçmek için aşağıdaki optimizasyon ipuçlarını kullanabilirsiniz:
* İndeksler: GROUP BY ve HAVING deyimlerinde kullanılan sütunlara uygun indeksler oluşturmak, sorgu performansını önemli ölçüde artırabilir.
* WHERE kullanımı: Mümkünse, WHERE deyimini kullanarak GROUP BY işlemine gelen veri miktarını azaltın.
* Fonksiyonel İndeksler: Toplama fonksiyonlarının sonuçlarına indeks oluşturmak da performansı iyileştirebilir.
* Parçalama (Partitioning): Büyük tabloları mantıksal parçalara bölerek sorgu performansını artırabilirsiniz.
7. Sıkça Sorulan Sorular (SSS)
* WHERE ve HAVING arasındaki fark nedir? WHERE gruplandırma *öncesinde* satırları filtrelerken, HAVING gruplandırma *sonrasında* grupları filtreler.
* HAVING deyimi olmadan GROUP BY kullanabilir miyim? Evet, HAVING deyimi isteğe bağlıdır.
* HAVING deyiminde hangi fonksiyonları kullanabilirim? SUM, AVG, COUNT, MAX, MIN gibi toplama fonksiyonlarını ve diğer birçok fonksiyonu kullanabilirsiniz.
* GROUP BY ve HAVING deyimlerini birlikte nasıl optimize edebilirim? İndeksler oluşturmak, WHERE deyimini kullanarak ön filtreleme yapmak ve gerektiğinde materyalize görünümler kullanmak performansı artırır.
* Çok büyük veri kümeleri için alternatif çözümler nelerdir? Büyük veri kümeleri için dağıtık veritabanları veya analitik platformlar kullanmayı düşünebilirsiniz.
Sonuç
PostgreSQL’de GROUP BY işleminden sonra filtreleme yapmak için HAVING deyimini kullanmak oldukça önemlidir. Bu makalede, farklı seviyelerdeki kullanıcılar için adım adım bir kılavuz sunarak, gerçek dünya örnekleriyle ve performans optimizasyon ipuçlarıyla konuyu detaylı bir şekilde ele aldık. Unutmayın, veritabanı performansı, verimli sorgu yazımı ve doğru indeksleme stratejileriyle doğrudan ilgilidir. Daha fazla bilgi ve ileri seviye PostgreSQL teknikleri için [fatihsoysal.com](https://fatihsoysal.com) adresini ziyaret edebilirsiniz.
Yazar: Fatih Soysal