Harun Reşit Zafer

bâki kalan bu kubbede bir hoş sadâ imiş

SQL 14: Kümeleme Fonksiyonları

Schema SQL
Programlama dillerinde olduğu gibi SQL’de de bir çok yerleşik (built-in) fonksiyon mevcuttur. Bunlar temel olarak kümeleme (aggregate) fonksiyonları ve skalar (scalar – iyi bir önerisi olan?) fonksiyonlar diye ikiye ayrılır. Bu yazıda en çok kullanılan kümeleme fonksiyonlarını ele alacağız. Yine sık kullanılan skalar fonksiyonlar ise bir başka makalenin konusu olacak.

Kümeleme fonksiyonları tablodaki bir kolon (alan) üzerindeki değerler için belli matematiksel hesaplamalar yapar ve sonuç döndürürler. Örneğin AVG (average-ortalama) fonksiyonu bir kolondaki tüm değerlerin ortalamasını hesaplamamıza yardımcı olur. Makale boyunca örnek sorgular aşağıdaki kisiler tablosu üzerinde işletilecektir. Tabloya söyle bir göz atıp devam edelim.

Not: Bu arada diğer SQL derslerine buradan ulaşabilirsiniz

id Ad Soyad Yas Cinsiyet Şehir Ülke Maaş
2 Ahmet Yılmaz 20 1 Ankara Türkiye 2000
3 Mehmet Efe 22 1 Bolu Türkiye 2000
4 Ayşe Can 23 0 İstanbul Türkiye 3500
5 Fatma Ak 35 0 Ankara Türkiye 3200
6 John Smith 45 1 New York USA 3500
7 Ellen Smith 40 0 New York USA 3500
8 Hans Müller 30 1 Berlin Almanya 4000
9 Frank Cesanne 35 1 Paris Fransa 3700
10 Abbas Demir 26 1 Adana Türkiye 2000
11 Hatice Topçu 26 0 Hatay Türkiye 2200
12 Gülsüm Demir 35 0 Adana Türkiye 2000

 

AVG() Fonksiyonu

Ortalama hesaplar. Örneğin çalışanların ortalama ne kadar maaş aldığını hesaplamak istersek:

SELECT AVG(maaş) FROM kisiler

Sorgunun çıktısı aşağıdaki gibi olacaktır:

AVG(maaş)
2872.7273

Eğer çıktının biraz daha okunur olmasını arzu edersek sorgu üzerinde ufak bir değişiklik yapabiliriz:

 SELECT AVG(maaş) AS OrtalamaMaaş FROM kisiler

Sorgunun çıktısı aşağıdaki gibi olacaktır:

OrtalamaMaaş
2872.7273

Eğer yalnızca Türkiye’de çalışanların maaş ortalamasını hesaplamak istersek:

 SELECT AVG(maaş) AS OrtalamaMaaş FROM kisiler WHERE ülke='Türkiye'

Sorgunun çıktısı aşağıdaki gibi olacaktır:

OrtalamaMaaş
2414.2857

 

COUNT() Fonksiyonu

Bir alandaki değerlerin kaç adet olduğunu yani sayısını hesaplar. Örneğin kaç çalışanın olduğunu hesaplamak istersek:

 SELECT COUNT(maaş) AS Sayı FROM kisiler

Sorgunun çıktısı aşağıdaki gibi olacaktır:

Sayı
11

Sorguyu aşağıdaki gibi değiştirsek de sonuç değişmez:

 SELECT COUNT(id) AS Sayı FROM kisiler

Çünkü COUNT fonksiyonu alandaki değerlerin ne olduğu ile ilgilenmez, sadece kaç adet değer olduğu ile ilgilenir. Eğer boş (NULL) değerler var ise bunlar hesaba katılmaz. Yani yukarıdaki tabloda eğer bir çalışanın maaş bilgisi boş olsaydı, COUNT(maaş) sorgusu 10 sonucunu verirken COUNT(id) sorgusu 11 sonucunu verecekti.

 

COUNT(*) Kullanımı

Eğer kesin olarak kayıt sayısını istiyorsak her zaman ifadeyi COUNT(*) şeklinde kullanmalıyız. Bu ifade her zaman tablodaki ya da sonuç kümesindeki kayıt sayısını (satır sayısını) döndürür.

 SELECT COUNT(*) AS Sayı FROM kisiler

Sorgu kisiler tablosunda kaç kayıt olduğunu hesaplar:

Sayı
11

Eğer Amerika’da çalışanların sayısını hesaplamak istersek:

 SELECT COUNT(*) AS Sayı FROM kisiler WHERE ülke='USA'

Sorgunun çıktısı aşağıdaki gibi olacaktır:

Sayı
2

 

COUNT (DISTINCT kolon_adı) Kullanımı

DISTINCT ifadesini bu makalede anlatmıştım. Eğer bilmiyorsanız önce o kısa makaleyi okumanızı öneririm.

Eğer bir kolondaki farklı değerlerin sayısını öğrenmek istiyorsak COUNT ifadesini COUNT (DISTINCT kolon_adı) şeklinde kullanırız. Örneğin kaç farklı ülkeden çalışan olduğunu hesaplamak istersek:

 SELECT COUNT(DISTINCT ülke) AS ÜlkeSayısı FROM kisiler

Tabloda ülke alanında 4 farklı değer (Türkiye, USA, Fransa, Almanya) olduğundan çıktı aşağıdaki gibi olacaktır.

ÜlkeSayısı
4

 

FIRST() Fonksiyonu

Bir alandaki ilk değeri döndürür. Örneğin tablodaki ilk ismi öğrenmek istiyorsak.

 SELECT FIRST(Ad) AS ilkİsim FROM kisiler

Çıktı aşağıdaki gibi olacaktır:

ilkİsim
Ahmet

Ancak bu MySQL First fonksiyonunu desteklemez. Aynı işi yapan sorgu MySQL’de aşağıdaki gibidir.

 SELECT ad AS ilkİsim FROM kisiler LIMIT 1

Bu arada Limit konusu bu makalede anlatıldı. Bilmiyorsanız bir göz atmanızda fayda var.

 

LAST() Fonksiyonu

Tahmin edebileceğiniz gibi en sondaki değeri döndürür. Ve yine tahmin edebileceğiniz gibi MySQL tarafından desteklenmez. Tablodaki son soyisim değerini döndüren sorgunun standart SQL ve MySQL versiyonları aşağıdaki gibidir:

SELECT LAST(Soyad) AS SonSoyad FROM kisiler
 
SELECT soyad AS SonSoyad FROM kisiler ORDER BY id DESC LIMIT 1

Her iki sorgunun çıktısı aşağıdaki gibidir.

SonSoyad
Demir

 

MAX() ve MIN() Fonksiyonları

Bir alandaki en büyük ve en küçük değerleri döndürürler. En yaşlı ve en genç çalışanları belirlemek istersek:

 SELECT MAX(yas) AS EnYaşlı FROM kisiler

Çıktı aşağıdaki gibi olacaktır:

EnYaşlı
45

 

 SELECT MIN(yas) AS EnGenç FROM kisiler

Çıktı aşağıdaki gibi olacaktır:

EnGenç
20

Dikkat: Eğer en yaşlı çalışanı ismi ile birlikte sorgulamak isteseydik aşağıdaki gibi bir sorgunun işimizi görebileğini düşünebilirsiniz. Ancak bu sorgu hatalıdır.

 SELECT ad, MAX(yas) AS EnYaşlı FROM kisiler

Sorgu ad alanına tablodaki ilk ismi getirirken MAX(yas) alanına maksimum yaşı getirir:

ad EnYaşlı
Ahmet 45

Ancak Ahmet isimli çalışanın yaşı 45 değildir. Fonksiyonun sadece maksimum değer ile ilgilendiğini unutmayalım. En yaşlı çalışanı ismi ile birlikte bulabilmek için iç-içe (iki seviyeli) sorgu yazmamız gerekiyor ki bu da ileriki bir makalenin konusu olacak inş.

 

SUM() Fonksiyonu

Sayısal değerler içeren bir kolondaki değerlerin toplamını döndürür. Örneğin aylık ödenen toplam maaşı öğrenmek istersek:

 SELECT SUM(maaş) AS ToplamMaaş FROM kisiler

Çıktı aşağıdaki gibidir:

ToplamMaaş
31600

Son olarak kümeleme fonksiyonlarının GROUP BY ifadesi ile birlikte sıkça kullanıldığını hatırlatalım. Bunun yanında iç-içe sorgularda da sıkça kümeleme fonksiyonu kullanılır. Sonraki makalelerde her iki konuyu da örneklerle inceleyeceğiz.

Herkese Kolay Gelsin

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPrint this pageEmail this to someone

13 Yorum

  1. gonca gül berktaş

    28 Ocak 2012 at 03:38

    Merhabalar. Dersler anlaşılır ama left ve right outher joini nasıl ayır edeceğim ya da full outher join, inner join..

    Ayrıca anlattığınız konular ayrı ayrı başlık altında baktığımızda basit ve anlaşılır yapılır! ama içiçe verdikler zaman soruları, hangisinin öncelik sırası var karıştırıyorum. Yardımcı olursanız sevinirim. şimdide teşkkürler..

    • admin

      28 Ocak 2012 at 04:07

      Aslında seriye daha karmaşık sorgular ile devam etmeye niyetim vardı en başından beri. Gerekli vakit ve motivasyonu bulduğumda devam edeceğim inşaallah :)

  2. last fonksiyonunda hata alıyorum neden dir?

  3. isime cok yaradı.cok basit anlatmıssınız cabucak anladım

  4. Merhaba;
    Bence asıl sorun aggregate işlemin kümeleme olarak isimlendirilmesiyle başlamış.

    Aggregate : Toplu işlem
    Scalar . Tekil işlem

    Sanırım bu isimlendirmeler daha doğru olurdu.
    Aggregate : O sütundaki bütün üyeler kullanılarak toplu olarak hesap yapıyor.
    Scalar : O sütundaki sadece tek bir veri kullanılarak yaplıyor.

    Anlatım güzel, tebrikler.

  5. Polat Fevzi Dündar

    11 Haziran 2014 at 19:02

    kişiler tırnak içine almışsınız. diğer derslerde from’dan sonra tablo adı tırnak içine alınmıyordu?

    • admin

      11 Haziran 2014 at 23:14

      Sorguları PhpMyAdmin ile test ettim. PhpMyAdmin tablo isimlerini otomatik olarak tırnak’a (‘) benzer bir karakter (`) içine alıyordu. Nedenini bilmiyorum. Bu yazıya da öyle geçmiş. Düzeltildi.

  6. Merhaba,
    SQL ögrenmeye yeni başladım, komutların çalıştırılma sıraları ile ilgili sıkıntılarım var.

    “SELECT soyad AS SonSoyad FROM kisiler ORDER BY id DESC LIMIT 1”
    bu satırda en son çalıştırılan komut “LIMIT 1” oluyor değil mi ? Aksi takdirde istedigimiz çıktıyı vermez.

    Ama eğer boyleyse, o zaman LIMIT in anlatıldıgı dersteki fonktsiyonun ters düşer. LIMIT 1 fonksiyonu 1 çıktı bulduktan sonra başka çalıştırma demekti, ve bu tasarruf saglıyordu.

    Umarım anlatabilmişimdir… Cevabınızı bekliyorum, teşekkür ederim.

    • Bu sorguda önce id alanına göre sıralama yapılır, daha sonra “limit 1” dediğimiz için ilk sıradaki kayıt döndürülür. Bu sorguda her hangi bir kriter (Where) olmadığından ve sıralama olduğundan tüm kayıtlar işleme tabi tutulmak zorunda. Bu nedenle burada “limit 1” bir performans artışı sağlamaz ancak yine de ilk n satırı/kayıtı istiyorsak “limit n” ifadesini sorguya eklememiz gerekir.

  7. Merhaba,
    Basit bir e-ticaret sitesi yapmaya çalışıyorum. Yönetim panelinde kullanmak üzere şu kodu çalıştırmak istedim ama olmadı, kodun amacı müşteri siparişi verdiğinde “beklemede” oluyor ve beklemede 6 adet sipariş varsa toplam değeri bulmak istiyorum yani her biri 100 TL olan sipariş varsa 6 adeti 600 TL olarak yazmasını istiyorum.

    SELECT SUM(fiyat) AS toplamfiyat FROM gelen_siparis Where onay=’Beklemede’

    SELECT SUM(fiyat) AS toplamfiyat FROM gelen_siparis Where onay=’Onaylandi’

    SELECT SUM(fiyat) AS toplamfiyat FROM gelen_siparis Where onay=’İptal’

    bu şekilde 10 adet sorgu yapmam gerekli ama yapamadım “Beklemede” olanı için aldığım hata ” Resource id #17″ şeklinde.

    Teşekkür eder iyi çalışmalar dilerim.

Bir Cevap Yazın

E-posta adresiniz yayınlanmayacak

*

© 2016 Harun Reşit Zafer

Temayı tasarlayanAnders NorenYukarı ↑