- Beş temel toplama fonksiyonunu kullanmak
COUNT(*),COUNT(sütun)veCOUNT(DISTINCT sütun)arasındaki farkı açıklamak- Toplama fonksiyonlarını
WHEREile birlikte kullanmak veNULLdeğerlerin etkisini bilmek
Öğretmenin her öğrencinin puanına değil, sınıfın ortalamasına ihtiyacı vardır. Mağaza sahibi her siparişe tek tek bakmak yerine toplam satışı bilmek ister. Bu tür soruların cevabı bir satır listesi değil, tek bir sayıdır. SQL'de bu sayıları toplama (aggregate) fonksiyonları hesaplar.
Toplama fonksiyonu nedir?
Çok sayıda satırın değerlerini alıp onlardan tek bir sonuç hesaplayan fonksiyon. Sıradan bir fonksiyon (örneğin ROUND) her satırda ayrı çalışır; toplama fonksiyonu ise tüm satırlar üzerinde birden çalışır.
| Fonksiyon | Ne döndürür |
|---|---|
| COUNT(*) | satır sayısını |
| COUNT(x) | x'in NULL olmayan değerlerinin sayısını |
| SUM(x) | değerlerin toplamını |
| AVG(x) | ortalamayı |
| MIN(x) | en küçük değeri |
| MAX(x) | en büyük değeri |
COUNT: sayma
COUNT fonksiyonunun üç biçimi vardır. COUNT(*) tüm satırları sayar. COUNT(email) yalnızca email sütununda değeri olan satırları sayar; iki öğrencinin e-postası NULL olduğu için sonuç 10'dur. COUNT(DISTINCT city) ise farklı şehirlerin sayısını verir.
SELECT COUNT(*) AS students,
COUNT(email) AS with_email,
COUNT(DISTINCT city) AS cities
FROM students;▸ Beklenen çıktı
students | with_email | cities 12 | 10 | 7
SUM, AVG, MIN ve MAX
Bir sorguda birkaç toplama fonksiyonu birlikte yazılabilir. Ortalama çoğu zaman uzun bir ondalıklı sayıdır (burada 293,558); bu yüzden onu ROUND ile yuvarlarız. Sonuç her zaman tek bir satırdır, çünkü tüm tablo tek bir grup olarak özetlenir.
SELECT SUM(stock) AS total_items,
ROUND(AVG(price), 2) AS avg_price,
MIN(price) AS cheapest,
MAX(price) AS most_expensive
FROM products;▸ Beklenen çıktı
total_items | avg_price | cheapest | most_expensive 1086 | 293.56 | 3.2 | 1450
MIN ve MAX yalnızca sayılarla değil, metin ve tarihlerle de çalışır. YYYY-MM-DD biçimindeki tarihler için MIN en erken, MAX en geç tarihi verir.
SELECT MIN(order_date) AS first_order,
MAX(order_date) AS last_order
FROM orders;▸ Beklenen çıktı
first_order | last_order 2025-01-15 | 2025-07-07
Toplama fonksiyonlarıyla hesaplama
Bir toplama fonksiyonunun sonucu sıradan bir sayıdır; bu yüzden onunla hesap yapılabilir. MAX(age) - MIN(age) en büyük ve en küçük yaş arasındaki farkı verir. E-postası olan öğrencilerin yüzdesini bulmak için COUNT(email) değerini COUNT(*) değerine bölüp 100 ile çarparız. Dikkat: 100 * 10 / 12 tam sayı bölmesidir ve 83 verir; kesin sonuç için 100.0 yazarız.
SELECT MAX(age) - MIN(age) AS age_range,
100 * COUNT(email) / COUNT(*) AS int_pct,
ROUND(100.0 * COUNT(email) / COUNT(*), 1) AS pct_with_email
FROM students;▸ Beklenen çıktı
age_range | int_pct | pct_with_email 3 | 83 | 83.3
int_pct, tam sayı bölmesi yüzünden ondalık kısmını kaybetti.Toplama fonksiyonları ve WHERE
WHERE, toplama fonksiyonundan önce çalışır: önce satırlar filtrelenir, sonra hesaplama yalnızca kalan satırlar üzerinde yapılır. Aşağıda yalnızca 1 numaralı dersin (Algebra) kayıtlarını alıyoruz: 4 öğrenci, ortalama puan 87,3.
SELECT COUNT(*) AS enrollments,
ROUND(AVG(score), 1) AS avg_score,
MIN(score) AS min_score,
MAX(score) AS max_score
FROM enrollments
WHERE course_id = 1;▸ Beklenen çıktı
enrollments | avg_score | min_score | max_score 4 | 87.3 | 75 | 97
Depodaki tüm malların toplam değeri nedir?
Çözümü gösterÇözümü gizle
price * stock ifadesidir.Toplama fonksiyonunun içine ifade yazılabilir:
SUM(price * stock).VTYS önce her satır için çarpımı hesaplar, sonra bunları toplar: 40260,6.
SELECT SUM(price * stock) AS warehouse_value
FROM products;▸ Beklenen çıktı
warehouse_value 40260.6
SELECT AVG(age) AS avg_age
FROM students;▸ Beklenen çıktı
avg_age 15.5
1 numaralı dersin (Algebra) özetini çıkar: kayıt sayısı (students), virgülden sonra 1 basamağa yuvarlanmış ortalama puan (avg_score) ve en yüksek puan (best).
SELECT COUNT(*) AS students
-- add avg_score and best
FROM enrollments
WHERE course_id = 1;▸ Beklenen çıktı
students | avg_score | best 4 | 87.3 | 97
Electronics kategorisi için ürün sayısını (products), depodaki toplam adedi (total_stock) ve en düşük fiyatı (cheapest) bul.
SELECT
-- three aggregates here
FROM products
WHERE category = 'Electronics';▸ Beklenen çıktı
products | total_stock | cheapest 4 | 63 | 120.5
Önemli noktalar
- Toplama fonksiyonu çok sayıda satırdan tek bir sonuç hesaplar:
COUNT,SUM,AVG,MIN,MAX. COUNT(*)tüm satırları,COUNT(x)NULLolmayanları,COUNT(DISTINCT x)farklı değerleri sayar.WHEREtoplama fonksiyonundan önce çalışır; hesaplama yalnızca filtrelenmiş satırlarla yapılır.- Toplama fonksiyonları (
COUNT(*)hariç)NULLdeğerleri atlar. - Toplama fonksiyonunu
GROUP BYolmadan sıradan bir sütunla karıştırma; çoğu VTYS bunu hata sayar.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.
students tablosunda COUNT(*) 12, COUNT(email) ise 10 veriyor. Neden?