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;Açıklama:
- Kitapları
author(yazar) sütununa göre gruplar. - Her bir yazar için kitap sayısını sayar.
- Sonuç,
bookstablosundaki 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ı
authorsü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ı
authorsü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ı
authorsü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
authorhem depricesü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ı
authorsütununa göre gruplar. - Her yazar için kitap sayısını sayar.
HAVINGifadesi, 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ı
authorsütununa göre gruplar. - Her bir yazar için
pagessütununu toplar. - Sonuçları
total_pagessü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 > 10ile kitapları filtreler.- Kalan kitapları
authorsü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:
authorsvebookstabloları arasında birLEFT JOINgerç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:
CASEifadesi kullanarakprice_range(fiyat aralığı) kategorilerini oluşturur.- Kitapları
price_rangekategorilerine 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
bookstablosundaki 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 BYkullanın. COUNT,SUM,AVG,MAXveMINgibi toplu fonksiyonlar, gruplandırılmış veriler üzerinde hesaplamalar yapar.HAVINGifadesi, toplu değerlere dayalı olarak grupları filtreler.- Gruplanmış sonuçları sıralamak için
GROUP BYileORDER BYifadesini birleştirin. - İfadelerle gruplama yapabilir ve özel gruplamalar için
CASEifadelerini 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');