SQL FONKSİYONLARI SQL lisanında hesaplama ve sayma işlemlerinde kullanılmak üzere bir çok fonksiyon vardır. Yapı SQL içinde tanımlı bir fonksiyonu kullanmak için genel yapı Fonksiyon_adı(Fonksiyonun argümanları) table şeklindedir. Genel olarak iki fonksiyon türü vardır. Skaler fonksiyonlar Küme fonksiyonları Kümeleşme fonksiyonları Küme fonksiyonları bir kümeye bir sayı karşılık getiren fonksiyonlardır. Bu fonksiyonların kullanıldığı deyimlerinin listesinde fonksiyonun kendisi dışında başka kolonlar da olacaksa bu durumda bu kolonların GROUP BY deyiminde görünmesi gerekir. SQL Server daki önemli küme fonksiyonları Fonksiyon Fonksiyonun işlevi AVG(Kolon) Kolonun ortalamasını hesap eder COUNT(Kolon) Bir kolonun NULL olmayan değerlerini içeren satırların sayısı COUNT(*) Seçilen satırların sayısı COUNT(DISTINCT kolon) Bir kolonun farklı olan değerlerinin sayısı MAX(kolon) Bir kolonun değerlerinin maksimumu MIN(kolon) Bir kolonun değerlerinin minimumu STDEV(kolon) Bir kolonun değerlerinin standart sapması SUM(kolon) Bir kolonun değerlerinin toplamı VAR(kolon) Bir kolonun değerlerinin standart varyansı Örnekler: IL ve tablosunu kullanarak örnekler verelim. WHERE COUNT(*) AS SAY IL (ILAD LIKE 'A%')
SAY 11 Bu sonucu yorumlamak için öncelikle aşağıdaki SQL ifadesi düşünelim: * IL WHERE (ILAD LIKE 'A%') Bu deyim sonuçta bir küme verir. Bu kümede kaç eleman vardır? sorusunun cevabını almak için ayni SQL deyimini WHERE COUNT(*) AS SAY IL (ILAD LIKE 'A%') olarak yazıyoruz. Bu ilişki yukarıdaki fonksiyonların neden küme fonksiyonları olarak adlandırıldığını açıklıyor. Çünkü COUNT fonksiyonu aslında * ile başlayan deyimin sonuç kümesine bir değer atıyor. O halde IL tablosunda A harfi ile başlayan 11 il olduğunu anlıyoruz. COUNT(*) AS SAY WHERE (ILKOD = 1) SAY 14 Bu sonucu yorumlamak için öncelikle * WHERE (ILKOD = 1) SQL deyiminin sonuç kümesinin ILKOD = 1 olan tüm ilçeler olacağına dikkat edelim. O halde 14 bu kümede bulunan eleman sayıdır. Bir başka deyişle ILKOD u 1 olan ilin, yani Adana nın 14 ilçesi vardır.
SQL GROUP BY ve HAVING Acaba tek bir SQL deyimi ile, her ilin kaç ilçesi olduğunu bulabilir miyiz? Her bir ILKOD = x için COUNT(*) AS SAY WHERE (ILKOD = x) Yazdığımızda ILKOD u x olan ilçelerin sayısını bulacağımızı biliyoruz. O halde A x kümesi ILKOD u x olan ilçeleri gösterdiğine göre {A 1, A 2,, A n } kümesi üzerinde tanımlı olan bir COUNT yazmak gerekir. Böylece COUNT(A x ) bize ILKOD u x olan ilçelerin sayısını verir. SQL de bu işlem aşağıdaki gibi yapılır. COUNT(*) AS SAY, ILKOD GROUP BY ILKOD ORDER BY ILKOD Bu ifadeyi şöyle yorumlamamalıyız. Önce tablosunu ILKOD a göre grupla, bir başka deyişle {A 1, A 2,, A n } kümesini oluştur. Sonra her bir grubun eleman sayısını ILKOD a göre tasnif ederek göster. Nihayet sonuçları ILKOD a göre sırala Bu SQL aşağıda ilk birkaç satırı verilmiş sonuç kümesini verir. SAY ILKOD 14 1 9 2 19 3 8 4 7 5..
Aynı sonuçlar daha çok bilgi içerecek şekilde aşağıdaki SQL ile elde edilebilir. COUNT(*) AS SAY,.ILKOD, IL.ILAD INNER JOIN IL ON.ILKOD = IL.ILKOD GROUP BY.ILKOD, IL.ILAD ORDER BY.ILKOD SAY ILKOD ILAD 14 1 Adana 9 2 Adıyaman 19 3 Afyon 8 4 Ağrı 7 5 Amasya Aşağıdaki örnekleri karşılaştıralım. COUNT(DISTINCT AD) AS SAY SAY 925 COUNT(AD) AS SAY
SAY 945 Bu sonuçlardan ; toplam 945 ilçe olduğu halde adları birbirinden farklı 925 ilçe olduğunu anlaşılıyor. Acaba adları birden fazla satırda geçen ilçeleri bulabilir miyiz? Bunun için HAVING deyimine gerek olacaktır. Aslında HAVING deyimi, küme fonksiyonları içinde geçen argümanlar için WHERE deyiminin yerini tutar. COUNT(AD) AS SAY, AD GROUP BY AD HAVING (COUNT(AD) > 1) SAY AD 2 Altınyayla 2 Aydıncık 2 Ayvacık 2 Bayat 2 Bozkurt 2 Edremit 2 Gölbaşı 2 Gönen.. Fakat bu sonuç yeteri kadar bilgi vermiyor. Birden fazla ilde aynı adı taşıyan ilçeleri, il adlarıyla birlikte vermek istersek nasıl bir SQL yazabiliriz?
Neden aşağıdaki SQL bu sonuçu görmeye yeterli olmuyor? COUNT(.AD) AS SAY,.AD, IL.ILAD INNER JOIN IL ON.ILKOD = IL.ILKOD GROUP BY.AD, IL.ILAD HAVING (COUNT(.AD) > 1) Yukarıda açıklana sonuç kümesini aşağıdaki SQL ile elde edebiliriz IL.ILAD,.AD INNER JOIN IL ON.ILKOD = IL.ILKOD WHERE (.AD IN ( AD GROUP BY AD HAVING (COUNT(.AD) > 1))) ORDER BY.AD, IL.ILAD ILAD Burdur Sivas İçel Yozgat Çanakkale Samsun Afyon Çorum AD Altınyayla Altınyayla Aydıncık Aydıncık Ayvacık Ayvacık Bayat Bayat
Denizli Kastamonu Balıkesir Van.. Bozkurt Bozkurt Edremit Edremit. Aşağıdaki üç SQL deyimin sonuçlarını ayrı, ayrı yorumlayabilir misiniz? WHERE SIRANO, AD, SOYAD Kişiler (AD IN ( ORDER BY AD, SOYAD AD GROUP BY AD HAVING Kişiler COUNT(*) > 1 AND AD = Kişiler.AD)) WHERE IL.ILKOD, IL.ILAD IL LEFT OUTER JOIN ON IL.ILKOD =.ILKOD (.KOD IS NULL) COUNT(AD) AS SAY, AD Kişiler WHERE (AD IN ( AD Kişiler GROUP BY AD HAVING COUNT(*) > 1 AND AD = Kişiler.AD)) GROUP BY AD
Skaler Fonksiyonlar Skaler fonksiyonların argümanları belirli bir tipte bir alan veya bir ifadedir. Bu fonksiyonların değerleri önceden tanımlanan tipte bir değerdir. Karakter dizilerine uygulanan bir takım faydalı skaler fonksiyonlar. Her bir örnekte c bir karakter dizisidir. Fonksiyon Fonksiyonun işlevi UPPER (c) Karakter dizisini büyük harfe çevirir LOWER (c) Karakter dizisini küçük harfe çevirir SUBSTRING(c,basla,Karakter_sayısı) Karakter dizisinin basla yıncı karakterinden Karakter_sayısı kadar harf alınmasıyla elde edilen dizi LEN(c) Karakter dizisindeki harf sayısı CHARINDEX(Aranan_dizi, c) Karakter dizisinde Aranan_dizi varsa Aranan_dizi nin geçtiği ilk harfin dizideki yeri, aksi halde 0. LEFT(c,Karakter_sayısı) Karakter dizisinde soldan Karakter_sayısı kadar harf alınmasıyla elde edilen dizi RIGHT(c,Karakter_sayısı) Karakter dizisinde sağdan Karakter_sayısı kadar harf alınmasıyla elde edilen dizi Kuşkusuz daha pek çok fonksiyon vardır. Örneğin GETDATE() Sistemin tarih ve zamanını verir