GROUP BY: Veriyi Gruplandırma

PostgreSQL GROUP BY: Verileri Gruplama

PostgreSQL eğitim serimize tekrar hoş geldiniz! Bu derste, satır grupları üzerinde hesaplamalar yapmak ve verileri gruplamak için oldukça önemli olan GROUP BY ifadesine odaklanacağız. GROUP BY ifadesini etkili bir şekilde nasıl kullanacağınızı anlamak, verilerinizden anlamlı özetler çıkarmanızı sağlar.

GROUP BY İfadesine Giriş

PostgreSQL'de GROUP BY ifadesi, belirtilen sütunlarda aynı değerlere sahip satırları özet satırlara gruplamak için kullanılır ve COUNT, SUM, AVG, MAX, MIN gibi toplu işlevlerle birlikte kullanılır. Verilerinizi analiz etmek ve raporlamak için güçlü bir araçtır.

Temel Sözdizimi

SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1;
  • SELECT: Alınacak sütunları ve toplama fonksiyonlarını belirler.
  • FROM: Sorgulanacak tabloyu belirtir.
  • GROUP BY: Sonuçların hangi sütun(lar) üzerinden gruplanacağını belirtir.

PostgreSQL'de GROUP BY Kullanımı

Kütüphane ve filmler veritabanımızı kullanarak GROUP BY ifadesini pratik örneklerle inceleyelim.

1. Gruplardaki Satırları Sayma

Örnek: Her yazarın kitap sayısını say

SELECT author, COUNT(*) AS book_count
FROM books
GROUP BY author;

Şema Başlatma Görünümü

Açıklama:

  • Kitapları author (yazar) sütununa göre gruplar.
  • Her bir yazar için kitap sayısını sayar.
  • Sonuç, books tablosundaki her yazar ve onların kaç kitabı olduğunu gösterir.

2. Toplamları Hesaplama

Örnek: Her yazar için toplam sayfa sayısını hesaplayın

SELECT author, SUM(pages) AS total_pages
FROM books
GROUP BY author;

Açıklama:

  • Kitapları author sütununa göre gruplar.
  • Her bir yazarın kitaplarındaki pages (sayfa) toplamını hesaplar.
  • Sonuç, her bir yazar ve kitaplarının toplam sayfa sayısını gösterir.

3. Ortalamaları Hesaplama

Örnek: Her yazar için kitapların ortalama fiyatını bulun

SELECT author, AVG(price) AS average_price
FROM books
GROUP BY author;

Açıklama:

  • Kitapları author sütununa göre gruplar.
  • Her bir yazarın kitaplarındaki price (fiyat) ortalamasını hesaplar.
  • Sonuç, her bir yazar ve kitaplarının ortalama fiyatını gösterir.

4. Maksimum ve Minimum Değerleri Bulma

Örnek: Her yazar için en yüksek ve en düşük fiyatlı kitapları bulun

SELECT author, MAX(price) AS max_price, MIN(price) AS min_price
FROM books
GROUP BY author;

Açıklama:

  • Kitapları author sütununa göre gruplar.
  • Her yazarın kitapları için maksimum (MAX) ve minimum (MIN) price (fiyat) değerlerini bulur.
  • Sonuç, her bir yazar, en yüksek fiyatlı kitabı ve en düşük fiyatlı kitabı gösterir.

5. Birden Fazla Sütunla Gruplama

Örnek: Her yazar ve fiyat için kitap sayısını sayın

Her yazarın belirli bir fiyat noktasında kaç kitabı olduğunu görmek istediğimizi varsayalım.

SELECT author, price, COUNT(*) AS book_count
FROM books
GROUP BY author, price;

Açıklama:

  • Kitapları hem author hem de price sütunlarına göre gruplar.
  • Her bir yazarın belirli bir fiyattaki kitap sayısını sayar.
  • Sonuç, yazar ve fiyat kombinasyonlarını ve her birinin kaç kitabı olduğunu gösterir.

6. HAVING İfadesi ile GROUP BY Kullanımı

HAVING ifadesi, toplu fonksiyonlara dayalı olarak grupları filtrelemenizi sağlar.

Örnek: Birden fazla kitabı olan yazarları bulun

SELECT author, COUNT(*) AS book_count
FROM books
GROUP BY author
HAVING COUNT(*) > 1;

Açıklama:

  • Kitapları author sütununa göre gruplar.
  • Her yazar için kitap sayısını sayar.
  • HAVING ifadesi, yalnızca birden fazla kitabı olan yazarları filtreleyerek getirir.

7. GROUP BY ve ORDER BY Birlikte Kullanımı

Gruplanmış sonuçları ORDER BY ile sıralayabilirsiniz.

Örnek: Yazarları ve toplam sayfa sayılarını, sayfa sayısına göre azalan sırada listeleyin

SELECT author, SUM(pages) AS total_pages
FROM books
GROUP BY author
ORDER BY total_pages DESC;

Açıklama:

  • Kitapları author sütununa göre gruplar.
  • Her bir yazar için pages sütununu toplar.
  • Sonuçları total_pages sütunu bazında azalan sırada sıralar.

8. Verileri Gruplama ve Filtreleme

Örnek: 10 dolardan pahalı kitaplar için yazar bazında ortalama fiyatı hesaplayın

SELECT author, AVG(price) AS average_price
FROM books
WHERE price > 10
GROUP BY author;

Açıklama:

  • price > 10 ile kitapları filtreler.
  • Kalan kitapları author sütununa göre gruplar.
  • Her bir yazarın kitapları için ortalama price (fiyat) değerini hesaplar.

9. JOIN ile GROUP BY Kullanımı

Birden fazla tabloyu JOIN'ler kullanarak gruplandırabilirsiniz.

Örnek: Yazarlar tablosunda bulunan yazarlar için kitap sayısını sayın

SELECT a.name AS author_name, COUNT(b.title) AS book_count
FROM authors a
LEFT JOIN books b ON a.name = b.author
GROUP BY a.name;

Açıklama:

  • authors ve books tabloları arasında bir LEFT JOIN gerçekleştirir.
  • Sonuçları a.name (yazarın adı) sütununa göre gruplar.
  • Her bir yazar için kitap sayısını sayar, sıfır kitabı olan yazarları da dahil eder.

10. İfadelerle Gruplama

GROUP BY ifadesinde ifadeler kullanabilirsiniz.

Örnek: Kitapları fiyat aralıklarına göre gruplama

Kitapları fiyat aralıklarına göre gruplandıralım: 10 dolar altı, 10 ila 12 dolar arası, 12 dolar üstü.

SELECT
    CASE
        WHEN price < 10 THEN 'Under $10'
        WHEN price BETWEEN 10 AND 12 THEN '$10 - $12'
        ELSE 'Over $12'
    END AS price_range,
    COUNT(*) AS book_count
FROM books
GROUP BY price_range;

Açıklama:

  • CASE ifadesi kullanarak price_range (fiyat aralığı) kategorilerini oluşturur.
  • Kitapları price_range kategorilerine göre gruplar.
  • Her fiyat aralığındaki kitapların sayısını sayar.

11. DISTINCT ve GROUP BY Kullanımı

Her ne kadar GROUP BY çoğu durumda DISTINCT ifadesinin yerine kullanılabilse de, her iki ifadeyi birlikte kullanmak da mümkündür.

Örnek: Books tablosundaki benzersiz yazarları listeleyin

SELECT DISTINCT author
FROM books;

Veya GROUP BY kullanarak:

SELECT author
FROM books
GROUP BY author;

Açıklama:

  • Her iki sorgu da books tablosundaki benzersiz yazarların listesini döndürür.

12. Tarih Fonksiyonları ile Gruplama

Eğer yayın tarihi bilgimiz olsaydı, tarih parçalarına göre bir gruplama yapabilirdik. Ancak, şemamızda publication_date sütunu olmadığından bu örneği atlıyoruz.

Sonuç

PostgreSQL'deki GROUP BY ifadesi, verileri toplamak ve özetlemek için güçlü bir araçtır. GROUP BY ve toplu fonksiyonları nasıl ustaca kullanacağınızı öğrenerek verilerinizden anlamlı içgörüler elde edebilirsiniz.

Başlıca Çıkarımlar:

  • Bir veya birden fazla sütunda aynı değeri paylaşan satırları gruplamak için GROUP BY kullanın.
  • COUNT, SUM, AVG, MAX ve MIN gibi toplu fonksiyonlar, gruplandırılmış veriler üzerinde hesaplamalar yapar.
  • HAVING ifadesi, toplu değerlere dayalı olarak grupları filtreler.
  • Gruplanmış sonuçları sıralamak için GROUP BY ile ORDER BY ifadesini birleştirin.
  • İfadelerle gruplama yapabilir ve özel gruplamalar için CASE ifadelerini kullanabilirsiniz.

Şema Başlatma

Verilen örnekleri çalıştırmak için PostgreSQL veritabanınızı aşağıdaki şema ile ayarladığınızdan emin olun:

-- Create the books table
CREATE TABLE books (
    title VARCHAR(255),
    author VARCHAR(255),
    price NUMERIC(10, 2),
    pages INTEGER
);
 
-- Insert sample data into the books table
INSERT INTO books (title, author, price, pages) VALUES
('The Great Gatsby', 'F. Scott Fitzgerald', 10.99, 180),
('This Side of Paradise', 'F. Scott Fitzgerald', 7.99, 305),
('To Kill a Mockingbird', 'Harper Lee', 7.99, 281),
('Go Set a Watchman', 'Harper Lee', 8.99, 278),
('1984', 'George Orwell', 8.99, 328),
('Animal Farm', 'George Orwell', 5.99, 112),
('Pride and Prejudice', 'Jane Austen', 6.99, 279),
('Sense and Sensibility', 'Jane Austen', 5.99, 226),
('The Catcher in the Rye', 'J.D. Salinger', 9.99, 214),
('Moby-Dick', 'Herman Melville', 11.99, 635),
('War and Peace', 'Leo Tolstoy', 12.99, 1225);
 
-- Create the authors table
CREATE TABLE authors (
    name VARCHAR(255)
);
 
-- Insert sample data into the authors table
INSERT INTO authors (name) VALUES
('F. Scott Fitzgerald'),
('Harper Lee'),
('George Orwell'),
('Jane Austen'),
('J.D. Salinger'),
('Herman Melville'),
('Leo Tolstoy'),
('Mark Twain');  -- Added an author without books for JOIN examples
 
-- Create the movies table
CREATE TABLE movies (
    title VARCHAR(255)
);
 
-- Insert sample data into the movies table
INSERT INTO movies (title) VALUES
('The Shawshank Redemption'),
('The Godfather'),
('The Dark Knight'),
('Pulp Fiction'),
('The Lord of the Rings');