Gruplama Sorguları
Bu tip sorgular kolon düzeyinde çalışan sorgulardır.
1- Tablodaki kayıt sayısı bulunabilir.
Kayıt sayısı bilmek hangi işimizi görür? Ne işimize yarar? Örneğin müşteri tablosunu
düşünelim, tablonun her kaydında farklı müşteri vardır. Kayıt sayısını
bulursak müşteri sayısını bulmuş oluruz.
Örneğin, öğrenci tablosunun her kaydında farklı öğrenci vardır. Dolayısıyla
kayıt sayısı, öğrenci sayısına eşittir.
2- Kolondaki rakamlar toplanabilir.
Örneğin, müşterilerin borçları toplamı, depodaki ürünlerin toplamı vs. bulunabilir.
3- Kolondaki en büyük ve en küçük rakamları bulabiliriz.
Örneğin, öğrenci not tablosunda en büyük ve en küçük notları bulabiliriz.
4- Kolondaki rakamların ortalamasını bulabiliriz.
Öğrenci not tablosunda notların ortalamasını bulabiliriz.
5- Kolondaki rakamların standart sapmasını bulabiliriz.
Öğrenci not tablosunda notların standart sapmasını bulabiliriz.
Yukarıdaki işlemleri yapan fonksiyonlara AGGREGATE fonksiyonları adı verilir.
AGGREGATE Fonksiyonları
COUNT() |
: Kayıt sayısını verir |
SUM () |
: Kolon toplamını verir |
MAX() |
: Kolondaki en büyük rakam değerini verir |
MIN() |
: Kolondaki en küçük rakam değerini verir. |
AVG() |
: Kolon ortalama değerini verir |
STDEV() |
: Kolondaki rakamların standart sapmasını verir. |
Açıklama: COUNT() fonksiyonu hariç, diğer fonksiyonlar NULL değerleri dikkate almazlar.
En genel ifade
SELECT ..1.. FROM ..2.. WHERE ..3.. GROUP BY ..4..
HAVING ..5... ORDER BY ..6..
1 nolu yere, Aggregate fonksiyonu yazılabilir.
SELECT count(*) ...
SELECT sum(notu) ...
Select avg(notu) ...
Başka neler yazılabilir? GROUP BY deyimi içindekiler yazılabilir.
2 nolu yere, tablo adı yazılır
3 nolu yere (WHERE), buradaki süzme işlemi gruplama öncesi çalışır.
Örnek : 1 nolu bolumde kaç tane not var bulalım.
SELECT count(*) FROM notlar WHERE bolumno=1
4 nolu yere (GROUP BY), gruplama yapacağımız kolon isimleri veya denklemler yazılır. Eğer GROUP BY sorguda bulunmaz ise tüm tablo bir gruptur.
5 nolu yere (HAVING), Gruplama yapılmış, sonuç elde edilmiş, bir liste oluşmuş. Bu durumda süzme işlemi yapacaksak HAVING deyimi kullanılır. Having deyimi içindeki koşulda group by deyimi içindeki ifadeler bulunabilir veya aggregate fonksiyonları kullanılabilir.
Not :GROUP BY deyimi kullanılmadıysa HAVING kullanılamaz.
6 nolu yere, (ORDER BY), sıralama için ORDER BY deyimi içindeki ifadeler veya aggregate fonksiyonları bulunabilir.
Eğer group by deyimi yoksa, order by kullanılamaz.
Gruplama Sorgusu Örnekleri
Aşağıdaki tablo üzerinden örnek sorulara cevap verelim.
Soru:Fatura tablosunu FaturaNo’suna göre gruplayınız ve her bir faturadaki miktar toplamını bulunuz.
Bu problemi aşama aşama çözelim.
1. aşama olarak tablodaki tüm kayıtların miktar toplamını bulalım.
SELECT sum(miktar) FROM Fatura
Yukarıdaki kod Fatura tablosundaki miktar toplamını verdi.
2. aşama olarak FaturaNo’suna gruplayalım
SELECT sum(miktar) FROM Fatura GROUP BY FaturaNo
Yukarıdaki çıktıdaki rakamlar hangi fatuya ait belli değil. Bu rakamların yanına FaturaNo’sunu koyalım.
SELECT FaturaNo, sum(miktar) FROM Fatura GROUP BY FaturaNo
Yukarıdaki sorgunun çıktısında miktar toplamı kolonun bir adı yok. Bu kolona ToplamMiktar adını verelim.
SELECT FaturaNo, sum(miktar) as ToplamMiktar
FROM Fatura GROUP BY FaturaNo
Birkaç adet hatalı kod yazalım.
SELECT FaturaNo, sum(miktar) as ToplamMiktar FROM Fatura
Hata nedeni; sorguda bulunan FaturaNo aggregate fonksiyonu değil veya GROUP BY cümlesi içinde yer almıyor.
Yani, GROUP BY FaturaNo şeklinde bir ifadeyi sorgu içermeliydi. Gruplama yapmadığımız ve yaptığımız toplama işlemi tüm kolonu kapsaması nedeniyle, bu bilgi FaturaNo ile ilişkilendirilemez.
SELECT FaturaNo, sum(miktar) as ToplamMiktar
FROM Fatura GROUP BY urunKodu
Hata nedeni; biz UrunKoduna göre grupladık ancak FaturaNo yazdırmaya çalışıyoruz.
Burada her urunKodu için miktar kolonunun ayrı ayrı toplamı bulunur. Bu bilgi urunkodu ile ilişkili ancak faturaNo ile ilişkisizdir.