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:
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
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
: sayı1, sayı2'den büyük | |
: sayı1, sayı2'den büyük veya ona eşittir | |
: sayı1, sayı2'den küçük | |
: sayı1, sayı2'den küçük veya ona eşit | |
: sayı1, sayı2'ye eşittir | |
: sayı1, sayı2'den farklıdır | |
: aynı | |
: sayı1, aralık içinde [nombre2,nombre3] | |
: sayı1, sayı listesine aittir | |
: sayı1'in değeri yok | |
: sayı1'in bir değeri var |
Aritmetik işleçler
: toplama | |
: çıkarma | |
: çarpma | |
: 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:
![]()

![]()
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:
Fiyatların %3 artması gerekiyorsa, komut şu şekilde olacaktır:
Bir ifadede çeşitli aritmetik işlemcilerin yanı sıra fonksiyonlar ve parantezler de bulunabilir. Bu öğeler farklı önceliklere göre işlenir:
1 | <---- öncelikli | |
2 | ||
3 | ||
4 | <---- ö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
: string1, string2'den daha büyük | |
: zincir1, zincir2'den büyük veya ona eşittir | |
: dize1, dize2'den daha küçük | |
: dize1, dize2'den küçük veya ona eşit | |
: dize1, dize2'ye eşittir | |
: dize1, dize2'den farklıdır | |
: aynı | |
: dize1 aralıkta yer alıyor [chaine2,chaine3] | |
: chaine1, chaine listesine aittir | |
: zincir1'in değeri yok | |
: "dize1" bir değere sahiptir | |
: 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:
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:
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.
Bu karşılaştırmanın ardından, 'CHAT' < 'chat' ilişkisi doğru olarak belirlenir.
Örnekler


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

![]()
![]()
4.2.2.5. Birleştirme operatörü
![]()
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'den önceyse doğrudur | |
date1, date2'den önce veya ona eşitse doğrudur | |
date1, date2'den sonra ise doğrudur | |
date1, date2'den sonra veya ona eşitse doğrudur | |
date1 ve date2 aynıysa doğrudur | |
date1 ve date2 farklıysa doğrudur. | |
aynı şekilde | |
date1, date2 ile date3 arasında ise doğrudur | |
date1 tarih listesinde yer alıyorsa doğrudur | |
date1'in bir değeri yoksa doğrudur | |
date1'in bir değeri varsa doğrudur | |
date1 şablona uyuyorsa doğrudur | |
Aritmetik operatörler
: date1 ile date2 arasındaki gün sayısı | |
: date1-date2=nombre koşulunu sağlayan date2 | |
: tarih2-tarih1=sayı olacak şekilde tarih2 |
Örnekler

![]()
![]()
Kütüphanedeki kitapların yaşı nedir?

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 ve booléen2'in her ikisi de doğruysa doğrudur. |
| , booléen1 veya booléen2'in doğru olması durumunda doğrudur. |
| değeri, booléen1 değerinin tersidir. |
Örnekler

İki fiyat arasındaki kitaplar aranıyor:
![]()
Ters arama:

İş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

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

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:

IBExpert ile şu şekilde ilerliyoruz:
- [Tools/ Script Executive] seçeneği ile elde edilen [Script Excecutive] aracını kullanıyoruz:

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

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

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:

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:

ve şu şekilde tanımlayalım (Tablolar üzerine sağ tıklayın / Yeni Tablo):
Bu tabloya tek bir satır ekleyelim:


Şimdi SQL (F12) düzenleyicisine geçelim ve şu SQL komutunu verelim:
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:
![]()
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
| sayının mutlak değeri abs(-15)=15 |
| nombre'e eşit veya ondan büyük en küçük tamsayı ceil(15,7) = 16 |
| nombre'e eşit veya ondan küçük en büyük tamsayı floor(14,3)=14 |
| 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 |
| 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 |
| -1, eğer nombre < 0 ise nombre=0 ise 0 nombre > 0 ise +1 sign(-6) = -1 |
| 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 |