Skip to content

4. SQL dilindeki ifadeler

4.1. Introduction

Çoğu SQL komutunda bir ifade kullanmak mümkündür. Örneğin, SELECT komutunu ele alalım:

syntaxe
SELECT expr1, expr2, ... from table
WHERE expression

SELECT, expression'in doğru olduğu satırları seçer ve her biri için expri'in değerlerini görüntüler.

Örnekler

SQL> select prix*1.186 from biblio
SQL> select titre from biblio where prix between 100 and 150

Bu paragrafta ifade kavramını açıklamayı amaçlıyoruz. Temel bir ifade şu şekildedir:

işlemci1 opérateur işlemci2

veya

fonksiyon(parametreler)

Örnek

ifadesinde GENRE = 'ROMAN'

  • GENRE 1. işlenendir
  • 'ROMAN' 2. işlenendir
  • = ise işleçtir

upper(genre) ifadesinde

  • 'upper' bir işlevdir
  • 'genre', bu fonksiyonun bir parametresidir.

Öncelikle operatör içeren ifadeleri ele alacağız, ardından Firebird'de kullanılabilen fonksiyonları tanıtacağız.

4.2. Operatör içeren ifadeler

Operatör içeren ifadeleri, operandlarının türüne göre sınıflandıracağız:

  • sayısal
  • karakter dizisi
  • tarih
  • boole veya mantıksal

4.2.1. Sayısal türde işlençlere sahip ifadeler

4.2.1.1. İşlemcilerin listesi

nombre1, nombre2, nombre3 sayıları ele alalım. Kullanılabilecek operatörler şunlardır:

İlişkisel operatörler

nombre1 > nombre2
: sayı1, sayı2'den büyük
nombre1 >= nombre2
: sayı1, sayı2'den büyük veya ona eşittir
nombre1 < nombre2
: sayı1, sayı2'den küçük
nombre1 <= nombre2
: sayı1, sayı2'den küçük veya ona eşit
nombre1 = nombre2 
: sayı1, sayı2'ye eşittir
nombre1 != nombre2 
: sayı1, sayı2'den farklıdır
nombre1 <> nombre2
: aynı
nombre1 BETWEEN nombre2 AND nombre3
: sayı1, aralık içinde [nombre2,nombre3]
nombre1 IN (liste de nombres)
: sayı1, sayı listesine aittir
nombre1 IS NULL
: sayı1'in değeri yok
nombre1 IS NOT NULL
: sayı1'in bir değeri var

Aritmetik işleçler

nombre1 + nombre2
: toplama
nombre1 - nombre2
: çıkarma
nombre1 * nombre2
: çarpma
nombre1 / nombre2
: bölme

4.2.1.2. İlişkisel operatörler

Bir ilişkisel ifade, doğru veya yanlış olan bir ilişkiyi ifade eder. Dolayısıyla, bu tür bir ifadenin sonucu bir boole değeri veya mantıksal değerdir.

Örnekler:

SQL> select titre,prix from biblio where prix between 100 and 150

Image

SQL> select titre,prix from biblio where prix not between 100 and 150

Image

SQL> select titre,prix from biblio where prix in (200,210)

Image

4.2.1.3. Aritmetik işleçler

Aritmetik ifadeler bize aşinadır. Bu ifadeler, sayısal veriler arasında yapılacak bir hesaplamayı ifade eder. Bu tür ifadelerle daha önce de karşılaşmıştık: BIBLIO dosyasındaki kayıtlarda saklanan fiyatın vergisiz bir fiyat olduğu varsayılmaktadır. Her bir menkul kıymeti, %18,6'lık TVA oranı için TTC fiyatıyla görüntülemek istiyoruz:

    SELECT TITRE, PRIX*1.186 FROM BIBLIO

Fiyatların %3 artması gerekiyorsa, komut şu şekilde olacaktır:

    UPDATE BIBLIO SET PRIX = PRIX*1.03

Bir ifadede çeşitli aritmetik işlemcilerin yanı sıra fonksiyonlar ve parantezler de bulunabilir. Bu öğeler farklı önceliklere göre işlenir:

1
fonctions
<---- öncelikli
2
()
 
3
* et /
 
4
+ et -
<---- öncelik daha düşük

İfadede aynı önceliğe sahip iki operatör varsa, ifadenin en solunda bulunan operatör ilk olarak değerlendirilir.

Örnekler

PRIX*TAUX+TAXES ifadesi şu şekilde değerlendirilecektir (PRIX*TAUX)+TAXES şeklinde değerlendirilecektir. Aslında ilk olarak çarpma operatörü kullanılacaktır. PRIX*TAUX/100 ifadesi, (PRIX*TAUX)/100 şeklinde değerlendirilecektir.

4.2.2. Karakter türü operandlara sahip ifadeler

4.2.2.1. İşlemcilerin listesi

Kullanılabilen operatörler şunlardır:

Diyelim ki chaine1, chaine2, chaine3, karakter dizileri örneği

chaine1 > chaine2
: string1, string2'den daha büyük
chaine1 >= chaine2
: zincir1, zincir2'den büyük veya ona eşittir
chaine1 < chaine2
: dize1, dize2'den daha küçük
chaine1 <= chaine2
: dize1, dize2'den küçük veya ona eşit
chaine1 = chaine2 
: dize1, dize2'ye eşittir
chaine1 != chaine2
: dize1, dize2'den farklıdır
chaine1 <> chaine2
: aynı
chaine1 BETWEEN chaine2 AND chaine3
: dize1 aralıkta yer alıyor [chaine2,chaine3]
chaine1 IN liste de chaines
: chaine1, chaine listesine aittir
chaine1 IS NULL
: zincir1'in değeri yok
chaine1 IS NOT NULL
: "dize1" bir değere sahiptir
chaine1 LIKE modèle
: dize1 şablona uyuyor

Birleştirme operatörü

dize1 || dize2 : chaine2, chaine1 ile birleştirilir

4.2.2.2. İlişki operatörleri

Dizeleri <, <= vb. operatörlerle karşılaştırmak ne anlama gelir?

Her karakter bir tamsayı ile kodlanır. İki karakter karşılaştırıldığında, aslında bunların tamsayı kodları karşılaştırılır. Kullanılan kodlama, sözlüğün doğal sırasını takip eder:

blanc<..< 0 < 1 < ...< 9 < ...< A < B <... < Z < ... < a < b < ... < z

Sayılar harflerden önce gelir ve büyük harfler küçük harflerden önce gelir.

4.2.2.3. İki dizenin karşılaştırılması

'CHAT' < 'CHIEN' ilişkisini ele alalım. Bu ilişki doğru mu, yanlış mı? Bu karşılaştırmayı yapmak için, SGBD, iki dizeyi tamsayı kodlarına göre karakter karakter karşılaştırır. İki karakterin farklı olduğu tespit edilir edilmez, bu iki karakterden daha küçük olanın bulunduğu dize, diğer dizeden daha küçük olarak kabul edilir. Örneğimizde 'CHAT', 'CHIEN' ile karşılaştırılır. Sırasıyla şu sonuçlar elde edilir:

     'CHAT    ' 'CHIEN'
----------------------------
    'C'    =    'C'
    'H'    =    'H'
     'A    '     < 'I'

Bu son karşılaştırmanın ardından, 'CHAT' dizesi, 'CHIEN' dizesinden daha küçük olarak belirlenir. Dolayısıyla, 'CHAT' < 'CHIEN' ilişkisi doğrudur.

Şimdi 'CHAT' ile 'chat' dizelerini karşılaştıralım.

     'CHAT    ' 'chat'
--------------------------
     'C    '     < 'c'

Bu karşılaştırmanın ardından, 'CHAT' < 'chat' ilişkisi doğru olarak belirlenir.

Örnekler

SQL> select titre from biblio

Image

SQL> select titre from biblio where upper(titre) between 'L' and 'M'

Image

4.2.2.4. LIKE operatörü

LIKE operatörü şu şekilde kullanılır: chaîne LIKE modèle

chaîne, modèle ile eşleşirse ilişki geçerlidir. Bu, iki joker karakter içerebilen bir karakter dizisidir:

%
ve bu, herhangi bir karakter dizisini ifade eder
_
herhangi bir 1 karakteri ifade eder

Örnekler

SQL> select titre from biblio

Image

SQL> select titre from biblio where titre like 'M%';

Image

SQL> select titre from biblio where titre like 'L_ %';

Image

4.2.2.5. Birleştirme operatörü

SQL > select '[' || titre || ']' from biblio where upper(titre) LIKE 'L_ %'

Image

4.2.3. Tarih türünde operand içeren ifadeler

date1, date2, date3 tarihleri olsun. Kullanılabilecek operatörler şunlardır:

İlişkisel operatörler

date1 < date2
date1, date2'den önceyse doğrudur
date1 <= date2
date1, date2'den önce veya ona eşitse doğrudur
date1 > date2
date1, date2'den sonra ise doğrudur
date1 >= date2
date1, date2'den sonra veya ona eşitse doğrudur
date1 = date2
date1 ve date2 aynıysa doğrudur
date1 <> date2
date1 ve date2 farklıysa doğrudur.
date1 != date2
aynı şekilde
date1 BETWEEN date2 AND date3
date1, date2 ile date3 arasında ise doğrudur
date1 IN (liste de dates)
date1 tarih listesinde yer alıyorsa doğrudur
date1 IS NULL
date1'in bir değeri yoksa doğrudur
date1 IS NOT NULL
date1'in bir değeri varsa doğrudur
date1 LIKE modèle
date1 şablona uyuyorsa doğrudur
ALL,ANY,EXISTS
 

Aritmetik operatörler

date1 - date2
: date1 ile date2 arasındaki gün sayısı
date1 - nombre
: date1-date2=nombre koşulunu sağlayan date2
date1 + nombre
: tarih2-tarih1=sayı olacak şekilde tarih2

Örnekler

SQL> select achat from biblio

Image

SQL>select achat from biblio
   where achat between '01.01.1988' and '31.12.1988';

Image

SQL> select titre, achat from biblio
where cast(achat as char(10)) like '1988'

Image

Kütüphanedeki kitapların yaşı nedir?

SQL> select titre, cast('now' as date)-achat "age(jours)" from biblio

Image

4.2.4. Boole operandlı ifadeler

Bir boole değeri veya mantıksal değerin iki olası değeri olduğunu hatırlayalım: doğru veya yanlış. Mantıksal operand genellikle bir ilişkisel ifadenin sonucudur.

booléen1 ve booléen2 iki boole değeri olsun. Öncelik sırasına göre üç olası operatör vardır:


booléen1 AND booléen2
, booléen1 ve booléen2'in her ikisi de doğruysa doğrudur.

booléen1 OR booléen2
, booléen1 veya booléen2'in doğru olması durumunda doğrudur.

NOT booléen1
değeri, booléen1 değerinin tersidir.

Örnekler

SQL> select titre,genre,prix from biblio order by prix desc

Image

İki fiyat arasındaki kitaplar aranıyor:

SQL> select titre,genre,prix from biblio
     where prix>=130 and prix <=170

Image

Ters arama:

SQL> select titre,genre,prix from biblio
     where prix<130 or prix >170
     order by prix asc

Image

İşlemcilerin önceliğine dikkat edin!

SQL> select titre,genre,prix from biblio
  where genre='ROMAN' and prix>200 or prix<100
  order by prix asc

Image

Operatörlerin önceliğini kontrol etmek için parantez kullanılır:

SQL> select titre,genre,prix from biblio
  where genre='ROMAN' and (prix>200 or prix<100)
  order by prix asc

Image

4.3. Firebird'ün önceden tanımlanmış işlevleri

Firebird'de önceden tanımlanmış işlevler bulunur. Bu işlevler, SQL komutlarında hemen kullanılamaz. Öncelikle <firebird>\UDF\ib_udf.sql komut dosyasını çalıştırmanız gerekir; burada <firebird>, Firebird'ün kurulum dizinini belirtir:

Image

IBExpert ile şu şekilde ilerliyoruz:

  • [Tools/ Script Executive] seçeneği ile elde edilen [Script Excecutive] aracını kullanıyoruz:

Image

  • araç hazır olduğunda, <firebird>\UDF\ib_udf.sql komut dosyasını yükleriz:

Image

  • ardından komut dosyasını çalıştırıyoruz:

Image

Bu işlem tamamlandıktan sonra, Firebird’ün önceden tanımlanmış işlevleri, komut dosyası çalıştırıldığında bağlı olunan veritabanında kullanılabilir hale gelir. Bunu görmek için, veritabanı gezgini’ne gidip işlevlerin içe aktarıldığı veritabanındaki [UDF] düğümüne tıklamanız yeterlidir:

Image

Yukarıda, veritabanında kullanılabilir fonksiyonlar gösterilmektedir. Bunları test etmek için tek satırlı bir tablo oluşturmak kullanışlıdır. Buna TEST adını verelim:

Image

ve şu şekilde tanımlayalım (Tablolar üzerine sağ tıklayın / Yeni Tablo):

Bu tabloya tek bir satır ekleyelim:

Image

Image

Şimdi SQL (F12) düzenleyicisine geçelim ve şu SQL komutunu verelim:

SQL> select cos(0) from test

Bu komut, önceden tanımlanmış cos (kosinüs) işlevini kullanır. Yukarıdaki komut, cos(0) komutunu TEST tablosunun her satırı için değerlendirir; dolayısıyla aslında tek bir satır için değerlendirilir. Bu nedenle, sadece cos(0) değeri görüntülenir:

Image

UDF (Kullanıcı Tanımlı İşlev) işlevleri, kullanıcının oluşturabileceği işlevlerdir ve bu sayede web üzerinde UDF işlev kütüphaneleri bulunabilir. Burada, Firebird'ün indirilebilir sürümü (2005) ile birlikte sunulan işlevlerden sadece bazılarını açıklıyoruz. Bu fonksiyonları, parametrelerinin baskın türüne veya işlevlerine göre sınıflandırıyoruz:

  • sayısal türde parametreleri olan fonksiyonlar
  • dize türü parametreli fonksiyonlar

4.3.1. Sayısal türde parametreli fonksiyonlar


abs(nombre)
sayının mutlak değeri
abs(-15)=15

ceil(nombre)
nombre'e eşit veya ondan büyük en küçük tamsayı
ceil(15,7) = 16

floor(nombre)
nombre'e eşit veya ondan küçük en büyük tamsayı
floor(14,3)=14

div(nombre1,nombre2)
nombre1'in nombre2'e bölünmesinden elde edilen tam sayı bölümü (bölüm tam sayıdır)
div(7,3)=2

mod(nombre1,nombre2)
nombre1'in nombre2'e bölünmesinden elde edilen tam sayı bölme kalıntısı (bölüm tam sayıdır)
mod(7,3)=1

sign(nombre)
-1, eğer nombre < 0 ise
nombre=0 ise 0
nombre > 0 ise +1
sign(-6) = -1

sqrt(nombre)
nombre'in karekökü, nombre ≥ 0 ise
-1, eğer nombre < 0 ise
sqrt(16)=4

4.3.2. Dize türünde parametreli fonksiyonlar

ascii_char(sayı)
ASCII kodlu karakter nombre
ascii_char(65)='A'
lower(dize)
chaine'i küçük harfe dönüştürür
lower('INFO')='info'
ltrim(dize)
Left Trim - chaine metninin başındaki boşluklar silinir:
ltrim(' kedi yavrusu')='kedi yavrusu'
replace(dize1,dize2,dize3)
chaine1 içindeki chaine2'i chaine3 ile değiştirir.
replace('kedi ve köpek','k','**')='**edi ve **öpek'
rtrim(dize1,dize2)
Right Trim - ltrim ile aynı, ancak sağdan keser
rtrim('kedi ')='kedi'
substr(dize, p, q)
chaine dizisinin, p konumunda başlayan ve q. konumunda biten alt dizisi
substr('chaton',3,5)='ato'
ascii_val(karakter)
ASCII'in caractère'ten kod değeri
ascii_val('A')=65
strlen(dize)
chaine'in karakter sayısı
strlen('chaton')=6