4. ابرازها در زبان SQL
4.1. Introduction
در اکثر دستورات SQL میتوان از یک عبارت استفاده کرد. برای مثال، دستور SELECT را در نظر بگیرید:
SELECT expr1, expr2, ... from table WHERE expression |
SELECT سطرهایی را که در آنها expression برقرار است انتخاب میکند و مقادیر expri را برای هر یک از آنها نمایش میدهد.
مثالها
در این بخش، هدف ما توضیح مفهوم عبارت است. یک عبارت پایه به شکل زیر است:
operand1 opérateur operand2
یا
function(پارامترها)
مثال
در عبارت ، GENRE = 'ROMAN'
- GENRE اپرند ۱ است
- 'ROMAN' اپرند ۲ است
- مساوی (=) عملگر است
در عبارت upper(genre)
- `upper` یک تابع است
- 'type' یک پارامتر این تابع است.
ابتدا به عبارتهایی که شامل عملگرها هستند میپردازیم، سپس توابع موجود در فایربرد را معرفی میکنیم.
4.2. بیانهای دارای عملگر
ما عبارتهای دارای عملگر را بر اساس نوع عملوندهایشان طبقهبندی خواهیم کرد:
- عددی
- رشتهای
- تاریخ
- منطقی یا بولین
4.2.1. بیانهایی با عملوندهای عددی
4.2.1.1. فهرست عملگرها
فرض کنید nombre1، nombre2 و nombre3 اعداد باشند. عملگرهای زیر قابل استفاده هستند:
عملگرهای رابطهای
: number1 بزرگتر از number2 است | |
: number1 بزرگتر یا مساوی number2 | |
: number1 کمتر از number2 است | |
: number1 کمتر یا مساوی number2 است | |
: number1 برابر با number2 است | |
: number1 با number2 برابر نیست | |
: مشابه مورد بالا | |
: number1 در محدوده [nombre2,nombre3] است | |
: number1 به لیست اعداد تعلق دارد | |
: number1 هیچ ارزشی ندارد | |
: number1 دارای مقدار است |
عملگرهای عددی
: جمع | |
: تفریق | |
: ضرب | |
: تقسیم |
4.2.1.2. عملگرهای رابطهای
یک عبارت رابطهای رابطهای را بیان میکند که یا درست یا نادرست است. بنابراین نتیجه چنین عبارتی یک مقدار بولین یا منطقی است.
مثالها:
![]()

![]()
4.2.1.3. عملگرهای عددی
ما با عبارتهای حسابداری آشنا هستیم. آنها نمایانگر محاسبهای هستند که باید روی دادههای عددی انجام شود. ما قبلاً با چنین عبارتهایی مواجه شدهایم: فرض میکنیم قیمتی که در سوابق فایل BIBLIO ذخیره شده، قیمت پیش از مالیات است. میخواهیم هر اوراق بهادار را به همراه قیمتش TTC با نرخ TVA معادل ۱۸٫۶ درصد نمایش دهیم:
اگر قیمتها ۳٪ افزایش یابند، دستور به صورت زیر خواهد بود:
یک عبارت ممکن است شامل چندین عملگر عددی، و همچنین توابع و پرانتزها باشد. این عناصر بر اساس اولویتهای مختلف پردازش میشوند:
1 | <---- اولویت بالاتر | |
۲ | ||
۳ | ||
4 | <---- اولویت پایینتر |
وقتی دو عملوند با اولویت یکسان در یک عبارت ظاهر شوند، عملوندی که در سمت چپتر قرار دارد، اول ارزیابی میشود.
مثالها
بیان PRIX*TAUX+TAXES به صورت زیر ارزیابی خواهد شد (PRIX*TAUX)+TAXES. این به این دلیل است که عملگر ضرب در اول اعمال میشود. بیان PRIX*TAUX/100 به صورت (PRIX*TAUX)/100 ارزیابی خواهد شد.
4.2.2. بیانهایی با عملوندهای کاراکتری
4.2.2.1. فهرست عملگرها
میتوان از عملگرهای زیر استفاده کرد:
فرض کنید string1، string2 و string3 نمونههایی از رشتهها باشند.
: string1 از string2 بلندتر است | |
: string1 بزرگتر یا مساوی string2 است | |
: string1 کمتر از string2 است | |
: string1 کمتر یا مساوی string2 است | |
: string1 برابر با string2 است | |
: string1 با string2 برابر نیست | |
: مشابه مورد بالا | |
: string1 در محدوده [chaine2,chaine3] | |
: string1 به لیست رشتهها تعلق دارد | |
: string1 هیچ ارزشی ندارد | |
: string1 دارای مقدار است | |
: string1 با الگو مطابقت دارد |
عملگر الحاق
string1 || string2 : chaine2 الحاقشده با chaine1
4.2.2.2. عملگرهای رابطهای
مقایسه رشتهها با استفاده از عملگرهایی مانند <، <= و غیره به چه معناست؟
هر کاراکتر به صورت یک عدد صحیح رمزگذاری میشود. هنگام مقایسه دو کاراکتر، کدهای عددی آنها با هم مقایسه میشوند. رمزگذاری مورد استفاده از ترتیب لغتنامهای طبیعی پیروی میکند:
اعداد قبل از حروف و حروف بزرگ قبل از حروف کوچک قرار میگیرند.
4.2.2.3. مقایسه دو رشته
رابطه «CHAT» < «CHIEN» را در نظر بگیرید. آیا این رابطه درست است یا نادرست؟ برای انجام این مقایسه، SGBD دو رشته را کاراکتر به کاراکتر بر اساس کدهای عددی آنها مقایسه میکند. به محض اینکه دو کاراکتر متفاوت یافت شوند، رشتهای که کوچکتر است کوتاهتر از رشته دیگر در نظر گرفته میشود. در مثال ما، «CHAT» با «CHIEN» مقایسه میشود. نتایج متوالی زیر را به دست میآوریم:
پس از این مقایسه نهایی، مشخص میشود که رشته 'CHAT' کوتاهتر از رشته 'CHIEN' است. بنابراین رابطه 'CHAT' < 'CHIEN' برقرار است.
اکنون «CHAT» و «cat» را مقایسه کنیم.
پس از این مقایسه، رابطه «CHAT» < «cat» درست اعلام میشود.
مثالها


4.2.2.4. اپراتور LIKE
عملگر LIKE به صورت زیر استفاده میشود: chaîne LIKE modèle
این رابطه زمانی برقرار است که chaîne با modèle مطابقت داشته باشد. مورد دوم یک رشتهٔ کاراکتری است که ممکن است شامل دو کاراکتر جنگلی باشد:
که نشاندهنده هر دنبالهای از کاراکترها است | |
که نشاندهنده هر کاراکتر واحدی است |
مثالها

![]()
![]()
4.2.2.5. عملگر الحاق
![]()
4.2.3. بیانهایی با عملوندهای از نوع تاریخ
فرض کنید date1، date2 و date3 تاریخ باشند. عملگرهای زیر قابل استفاده هستند:
عملگرهای رابطه ای
اگر date1 زودتر از date2 باشد، درست است | |
در صورتی که date1 قبل یا مساوی date2 باشد، درست است | |
صحیح است اگر تاریخ۱ بعد از تاریخ۲ باشد | |
در صورتی که تاریخ۱ برابر یا بعد از تاریخ۲ باشد، درست است. | |
در صورتی که date1 و date2 یکسان باشند، درست است | |
در صورتی که تاریخ۱ و تاریخ۲ متفاوت باشند، درست است. | |
به همین ترتیب | |
صحیح است اگر تاریخ۱ بین تاریخ۲ و تاریخ۳ باشد | |
در صورتی که date1 در لیست تاریخها باشد، درست است | |
در صورتی که date1 هیچ ارزشی نداشته باشد، درست است | |
در صورتی که date1 مقدار داشته باشد، درست است | |
صحیح است اگر تاریخ۱ با الگو مطابقت داشته باشد | |
عملگرهای عددی
: تعداد روزها بین date1 و date2 | |
: تاریخ۲ به گونهای که تاریخ۱ – تاریخ۲ = عدد | |
: تاریخ2 به گونهای که تاریخ2 – تاریخ1 = عدد |
مثالها

![]()
![]()
کتابهای کتابخانه چند ساله هستند؟

4.2.4. بیانهایی با عملوندهای بولی
به یاد داشته باشید که یک مقدار بولین یا منطقی دو مقدار ممکن دارد: true یا false. عملوند منطقی اغلب نتیجه یک عبارت رابطهای است.
فرض کنید booléen1 و booléen2 دو مقدار بولی باشند. سه عملگر ممکن وجود دارد که به ترتیب اولویت عبارتند از:
| اگر هر دو booléen1 و booléen2 درست باشند، درست است. |
| در صورتی که هر یک از booléen1 یا booléen2 درست باشد، درست است. |
| مقداری دارد که معکوس مقدار booléen1 است. |
مثالها

ما در جستجوی کتابهایی در محدوده قیمتی هستیم:
![]()
جستجوی معکوس:

از اولویت عملگرها آگاه باشید!
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and prix>200 or prix<100
order by prix asc

ما از پرانتز برای کنترل اولویت عملگرها استفاده میکنیم:
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and (prix>200 or prix<100)
order by prix asc

4.3. تابعهای از پیش تعریفشدهی Firebird
فایربرد دارای توابع از پیش تعریفشده است. این توابع را نمیتوان مستقیماً در دستورات SQL استفاده کرد. ابتدا باید اسکریپت SQL <firebird>\UDF\ib_udf.sql را اجرا کنید، که در آن <firebird> به مسیر نصب Firebird اشاره دارد:

با IBExpert، به شرح زیر عمل میکنیم:
- ما از ابزار [Script Excecutive] که از طریق گزینه [Tools/ Script Executive] به دست آمده است، استفاده میکنیم:

- پس از آماده شدن ابزار، اسکریپت <firebird>\UDF\ib_udf.sql را بارگذاری میکنیم:

- سپس اسکریپت را اجرا میکنیم:

پس از انجام این کار، توابع از پیش تعریفشدهی Firebird برای پایگاه دادهای که هنگام اجرای اسکریپت به آن متصل بودید، در دسترس قرار میگیرند. برای مشاهده این موضوع، کافی است به اکسپلورر پایگاه داده بروید و روی گره [UDF] مربوط به پایگاه دادهای که توابع در آن وارد شدهاند کلیک کنید:

تابعهای موجود برای پایگاه داده در بالا نشان داده شدهاند. برای آزمایش آنها، داشتن یک جدول با یک سطر واحد مفید است. بیایید آن را TEST بنامیم:

و بیایید آن را به شرح زیر تعریف کنیم (کلیک راست روی جداول / جدول جدید):
بیایید یک سطر به این جدول اضافه کنیم:


اکنون بیایید به ویرایشگر SQL (F12) برویم و دستور زیر را صادر کنیم:
که از تابع از پیش تعریفشده cos (کسینوس) استفاده میکند. دستور بالا برای هر سطر جدول TEST، مقدار cos(0) را ارزیابی میکند، که در این مورد شامل یک سطر واحد است. در نتیجه، به سادگی مقدار cos(0) را نمایش میدهد:
![]()
تابعهای UDF (تابعهای تعریفشده توسط کاربر) تابعهایی هستند که کاربران میتوانند ایجاد کنند، و بنابراین کتابخانههایی از تابعهای UDF را میتوان در وب یافت. در اینجا، ما تنها برخی از آنهایی را که با نسخه قابل دانلود Firebird (2005) در دسترس هستند، توصیف میکنیم. ما آنها را بر اساس نوع غالب پارامترهایشان یا بر اساس نقششان طبقهبندی میکنیم:
- توابع با پارامترهای عددی
- توابع با پارامترهای از نوع رشتهای
4.3.1. توابع با پارامترهای عددی
| مقدار مطلق یک عدد abs(-15) = 15 |
| کوچکترین عدد صحیح بزرگتر یا مساوی nombre ceil(15.7) = 16 |
| بزرگترین عدد صحیح کوچکتر یا مساوی با nombre floor(14.3) = 14 |
| بقیه تقسیم صحیح (که نتیجه یک عدد صحیح است) nombre1 بر nombre2 قسمبر (7, 3) = 2 |
| بقیه تقسیم صحیحی (که در آن کسر یک عدد صحیح است) از nombre1 بر nombre2 بقیه تقسیم درونی (مخرج یک عدد صحیح است) از nombre1 بر nombre2 |
| -1 اگر nombre < 0 0 اگر nombre = 0 +۱ اگر nombre > ۰ sign(-6) = -1 |
| مکعب ریشه nombre اگر nombre ≥ 0 -1 اگر nombre < 0 √(16)=4 |
4.3.2. توابع با پارامترهای رشتهای
ascii_char(number) | کاراکتر با کد ASCII nombre ascii_char(65) = 'A' |
lower(string) | chaine را به حروف کوچک تبدیل میکند lower('INFO') = 'info' |
ltrim(string) | حذف حروف اضافی سمت چپ – فاصلههای قبل از متن در chaine حذف میشوند: ltrim(' kitten')='kitten' |
جایگزینی(string1, string2, string3) | chaine2 را در chaine1 با chaine3 جایگزین میکند. replace('cat and dog','cat','**')='**at and **og' |
rtrim(string1, string2) | حاشیهزدایی راست – مشابه ltrim اما در سمت راست rtrim('cat ')='cat' |
substr(string, p, q) | یک زیر رشته از chaine که از موقعیت p شروع شده و در موقعیت q. پایان مییابد substr('chaton', 3, 5) = 'ato' |
ascii_val(character) | کد ASCII از caractère ascii_val('A') = 65 |
strlen(string) | تعداد کاراکترها در chaine strlen('kitten') = 6 |