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
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..
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 🙂
29 Kasım 2012 at 07:56
last fonksiyonunda hata alıyorum neden dir?
14 Aralık 2012 at 02:59
Yazıda belirtildiği gibi bu fonksiyon MySQL tarafından desteklenmez
24 Aralık 2012 at 03:31
isime cok yaradı.cok basit anlatmıssınız cabucak anladım
02 Temmuz 2013 at 02:47
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.
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?
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.
09 Mart 2015 at 14:22
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.
10 Mart 2015 at 00:53
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.
23 Eylül 2015 at 04:14
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.
23 Eylül 2015 at 04:49
Şurada benzer bir örnek var: http://www.w3schools.com/sql/trysql.asp?filename=trysql_func_sum
Şu sorgu da doğru çalışıyor: SELECT SUM(Price) FROM Products Where CategoryID=1;
Belki işinize yarar.
23 Eylül 2015 at 04:56
Sanırım sorun başka, aşağıdaki sorgu çalışıyor phpmyadmin ile denedim şimdi, istediğim sonucu veriyor ama sayfaya basmıyor
SELECT SUM(fiyat) AS toplamfiyat FROM gelen_siparis Where onay=’Beklemede’
11 Ocak 2019 at 01:57
Öncelikle teşekkürler bilgi paylaşımı yaptığınız için fakat bir düzeltme yapmak istiyorum.
SELECT ad, MAX(yas) AS EnYaşlı FROM kisiler formülü en yüksek yaşı olan personelinin bilgilerini getirir. Herhangi bir iç içe select sorgusuna gerek kalmaz.