Skip to content

4. تعبيرات SQL

4.1. مقدمة

في معظم أوامر SQL، يمكن استخدام تعبير. لنأخذ، على سبيل المثال، الأمر SELECT:

الصيغة
SELECT expr1, expr2, ... from table
WHERE تعبير

تقوم SELECT باختيار الصفوف التي يكون التعبير صحيحًا فيها وتعرض قيم expr1 و expr2 و... لكل منها.

أمثلة

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

في هذا القسم، سنشرح مفهوم التعبير. التعبير الأساسي يكون على الشكل:

المعامل 1 المعامل 2

أو

دالة(معلمات)

مثال

في التعبير GENRE = 'ROMAN'

  • GENRE هو المعامل 1
  • 'ROMAN' هو المعامل 2
  • = هو عامل

في التعبير upper(genre)

  • upper هي دالة
  • 'genre' هو معلمة لهذه الدالة.

سنغطي أولاً التعبيرات التي تحتوي على عوامل، ثم سنعرض الدوال المتوفرة في Firebird.

4.2. التعبيرات التي تحتوي على عوامل

سنصنف التعبيرات التي تحتوي على عوامل حسابية وفقًا لنوع المعاملات:

  • رقمية
  • سلسلة
  • تاريخ
  • منطقية أو بولية

4.2.1. التعبيرات ذات المعاملات الرقمية

4.2.1.1. قائمة بالمعاملات

لنفترض أن number1 و number2 و number3 أرقام. يمكن استخدام المعاملات التالية:

المعاملات العلائقية

العدد1 > العدد2
: الرقم1 أكبر من الرقم2
الرقم1 >= الرقم2
: الرقم 1 أكبر من الرقم 2 أو يساويه
الرقم1 < الرقم2
: الرقم1 أقل من الرقم2
الرقم1 <= الرقم2
: الرقم 1 أقل من أو يساوي الرقم 2
الرقم1 = الرقم2
: الرقم1 يساوي الرقم2
الرقم1 != الرقم2
: الرقم 1 لا يساوي الرقم 2
الرقم 1 ≠ الرقم 2
: مثل
الرقم1 بين الرقم2 والرقم3
: الرقم1 يقع في النطاق [الرقم2، الرقم3]
الرقم1 في (قائمة الأرقام)
: الرقم1 ينتمي إلى قائمة الأرقام
الرقم1 هو NULL
: رقم1 ليس له قيمة
number1 IS NOT NULL
: القيمة number1 موجودة

المُشغِّلات الحسابية

number1 + number2
: جمع
العدد1 - العدد2
: طرح
العدد1 * العدد2
: الضرب
العدد1 / العدد2
: القسمة

4.2.1.2. المشغلات العلائقية

يعبر التعبير العلائقي عن علاقة تكون إما صحيحة أو خاطئة. وبالتالي، فإن نتيجة هذا التعبير هي قيمة منطقية أو قيمة بولية.

أمثلة:

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. المُشغِّلات الحسابية

نحن على دراية بالتعبيرات الحسابية. فهي تعبر عن عملية حسابية يتم إجراؤها على البيانات الرقمية. وقد صادفنا مثل هذه التعبيرات من قبل: لنفترض أن السعر المخزن في سجلات ملف BIBLIO هو سعر قبل الضريبة. نريد عرض كل عنوان مع سعره شاملاً الضريبة بمعدل ضريبة القيمة المضافة 18.6%:

    SELECT TITRE, PRIX*1.186 FROM BIBLIO

إذا كان من المقرر أن ترتفع الأسعار بنسبة 3٪، فسيكون الأمر كما يلي

    UPDATE BIBLIO SET PRIX = PRIX*1.03

قد يحتوي التعبير على عدة عوامل حسابية، بالإضافة إلى الدوال والأقواس. تتم معالجة هذه العناصر وفقًا لأولويات مختلفة:

1
الدوال
<---- الأولوية الأعلى
2
()
 
3
* و /
 
4
+ و -
<---- أولوية أقل

عندما يتواجد عاملان من نفس الأولوية في تعبير ما، يتم تقييم العامل الموجود في أقصى اليسار أولاً.

أمثلة

سيتم حساب التعبير PRICE*RATE+TAXES على أنه (PRICE*RATE)+TAXES. وذلك لأن عامل الضرب يُستخدم أولاً. سيتم حساب التعبير PRICE*RATE/100 على أنه (PRICE*RATE)/100.

4.2.2. التعبيرات التي تحتوي على معاملات أحرف

4.2.2.1. قائمة العوامل

يمكن استخدام المعاملات التالية:

لنفترض أن string1 و string2 و string3 و string pattern هي

string1 > string2
: string1 أكبر من string2
string1 >= string2
: string1 أكبر من أو يساوي string2
السلسلة 1 < السلسلة 2
: string1 أقل من string2
السلسلة 1 <= السلسلة 2
: string1 أقل من أو يساوي string2
السلسلة 1 = السلسلة 2
: string1 يساوي string2
string1 != string2
: string1 لا يساوي string2
السلسلة 1 ≠ السلسلة 2
: متطابق
string1 بين string2 و string3
: string1 يقع في النطاق [string2, string3]
string1 في قائمة السلاسل
: string1 تنتمي إلى قائمة السلاسل
string1 IS NULL
: string1 ليس له قيمة
string1 IS NOT NULL
: channel1 له قيمة
string1 يشبه النمط
: string1 يطابق النمط

عامل التسلسل

سلسلة1 || سلسلة2 : يتم ربط string2 بـ string1

4.2.2.2. عوامل العلاقة

ماذا يعني مقارنة السلاسل باستخدام عوامل مثل <، <=، إلخ؟

يتم ترميز كل حرف كعدد صحيح. عند مقارنة حرفين، تتم مقارنة رموزهما الصحيحة. يتبع الترميز المستخدم الترتيب الطبيعي للقاموس:

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

تأتي الأرقام قبل الحروف، والحروف الكبيرة قبل الحروف الصغيرة.

4.2.2.3. مقارنة سلسلتين

لنأخذ العلاقة 'CAT' < 'DOG' على سبيل المثال. هل هي صحيحة أم خاطئة؟ لإجراء هذه المقارنة، يقارن نظام إدارة قواعد البيانات (DBMS) السلسلتين حرفًا حرفًا بناءً على رموزهما الصحيحة. وبمجرد العثور على حرفين مختلفين، يُقال إن السلسلة التي تحتوي على الأصغر من الاثنين أصغر من السلسلة الأخرى. في مثالنا، تتم مقارنة 'CAT' بـ 'DOG'. ونحصل على النتائج المتتالية التالية:

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

بعد هذه المقارنة الأخيرة، يُعتبر السلسلة 'CAT' أقصر من السلسلة 'DOG'. وبالتالي، فإن العلاقة 'CAT' < 'DOG' صحيحة.

الآن دعونا نقارن بين "CHAT" و"chat".

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

بعد هذه المقارنة، تُعتبر العلاقة 'CHAT' < 'chat' صحيحة.

أمثلة

SQL> select titre from biblio

Image

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

Image

4.2.2.4. المشغل LIKE

يُستخدم عامل LIKE على النحو التالي: سلسلة LIKE نمط

يكون الشرط صحيحًا إذا كانت السلسلة تتطابق مع النمط. النمط هو سلسلة قد تحتوي على حرفين بديلين:

%
الذي يشير إلى أي تسلسل من الأحرف
_
التي تمثل أي حرف واحد

أمثلة

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. عامل التسلسل

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

Image

4.2.3. التعبيرات التي تحتوي على معاملات من نوع التاريخ

لنفترض أن date1 و date2 و date3 هي تواريخ. يمكن استخدام المعاملات التالية:

المشغلات العلائقية

date1 < date2
صحيح إذا كان date1 أقدم من date2
date1 <= date2
صحيح إذا كان التاريخ 1 أقدم من التاريخ 2 أو يساويه
التاريخ 1 > التاريخ 2
صحيح إذا كان التاريخ 1 أحدث من التاريخ 2
التاريخ 1 >= التاريخ 2
صحيح إذا كان التاريخ 1 في تاريخ 2 أو بعده
التاريخ 1 = التاريخ 2
صحيح إذا كان تاريخ1 وتاريخ2 متطابقين
التاريخ 1 ≠ التاريخ 2
صحيح إذا كان التاريخ 1 والتاريخ 2 مختلفين.
date1 != date2
مما يعادل
date1 BETWEEN date2 AND date3
صحيح إذا كان التاريخ 1 يقع بين التاريخ 2 والتاريخ 3
التاريخ1 في (قائمة التواريخ)
صحيح إذا كان التاريخ1 موجودًا في قائمة التواريخ
التاريخ 1 هو NULL
صحيح إذا كان date1 لا يحتوي على قيمة
date1 IS NOT NULL
صحيح إذا كان date1 له قيمة
date1 يشبه النمط
صحيح إذا كان date1 يطابق النمط
ALL، ANY، EXISTS
 

المشغلات الحسابية

التاريخ 1 - التاريخ 2
: عدد الأيام بين التاريخ 1 والتاريخ 2
التاريخ 1 - الرقم
: التاريخ 2 بحيث التاريخ 1 - التاريخ 2 = الرقم
التاريخ 1 + الرقم
: تاريخ2 بحيث تاريخ2 - تاريخ1 = رقم

أمثلة

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

كم عمر الكتب الموجودة في المكتبة؟

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

Image

4.2.4. التعبيرات التي تحتوي على معاملات منطقية

تذكر أن القيمة المنطقية لها قيمتان محتملتان: صحيح أو خطأ. غالبًا ما تكون المعامل المنطقي نتيجة تعبير علائقي.

لنفترض أن boolean1 و boolean2 هما قيمتان منطقيتان. هناك ثلاثة عوامل ممكنة، وهي، حسب ترتيب الأسبقية:


boolean1 AND boolean2
صحيح إذا كان كل من boolean1 و boolean2 صحيحين.

boolean1 OR boolean2
صحيح إذا كان إما boolean1 أو boolean2 صحيحًا.

NOT boolean1
تكون قيمتها عكس قيمة boolean1.

أمثلة

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

Image

نحن نبحث عن كتب ضمن نطاق سعري:

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

Image

البحث العكسي:

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

Image

انتبه لأولوية العوامل الحسابية!

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

Image

استخدم الأقواس للتحكم في أولوية العمليات الحسابية:

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

Image

4.3. وظائف Firebird المحددة مسبقًا

يحتوي Firebird على وظائف محددة مسبقًا. لا يمكن استخدامها مباشرة في عبارات SQL. يجب أولاً تشغيل البرنامج النصي SQL <firebird>\UDF\ib_udf.sql، حيث يشير <firebird> إلى دليل تثبيت نظام إدارة قواعد البيانات Firebird:

Image

باستخدام IBExpert، نتبع الخطوات التالية:

  • نستخدم أداة [Script Executive] التي يمكن الوصول إليها عبر الخيار [Tools/Script Executive]:

Image

  • بمجرد فتح الأداة، نقوم بتحميل البرنامج النصي <firebird>\UDF\ib_udf.sql:

Image

  • ثم نقوم بتنفيذ البرنامج النصي:

Image

بمجرد الانتهاء من ذلك، تصبح وظائف Firebird المحددة مسبقًا متاحة للقاعدة البيانات التي كنت متصلاً بها عند تشغيل البرنامج النصي. لرؤية ذلك، ما عليك سوى الانتقال إلى مستكشف قاعدة البيانات والنقر على عقدة [UDF] الخاصة بقاعدة البيانات التي تم استيراد الوظائف إليها:

Image

فيما يلي الوظائف المتاحة لقاعدة البيانات. لاختبارها، من المفيد أن يكون لديك جدول من صف واحد. لنسمه TEST:

Image

ونعرفه على النحو التالي (انقر بزر الماوس الأيمن على Tables / New Table):

دعونا نضيف صفًا واحدًا إلى هذا الجدول:

Image

Image

لننتقل الآن إلى محرر SQL (F12) وننفذ عبارة SQL التالية:

SQL> select cos(0) from test

الذي يستخدم دالة cos (جيب التمام) المحددة مسبقًا. يقوم الأمر أعلاه بحساب cos(0) لكل صف في جدول TEST، أي في الواقع لصف واحد. وبالتالي، فإنه يعرض ببساطة قيمة cos(0):

Image

UDFs (الدوال المحددة من قبل المستخدم) هي دوال يمكن للمستخدمين إنشاؤها، ويمكن العثور على مكتبات UDFs على الويب. هنا، نصف فقط بعض تلك المتوفرة مع الإصدار القابل للتنزيل من Firebird (2005). نقوم بتصنيفها وفقًا للنوع السائد لمعلماتها أو وفقًا لدورها:

  • الدوال ذات المعلمات الرقمية
  • الدوال ذات المعلمات من نوع السلسلة

4.3.1. الدوال ذات المعلمات الرقمية


abs(رقم)
القيمة المطلقة للرقم
abs(-15) = 15

ceil(الرقم)
أصغر عدد صحيح أكبر من أو يساوي العدد
ceil(15.7) = 16

floor(الرقم)
أكبر عدد صحيح أقل من أو يساوي الرقم
floor(14.3) = 14

div(الرقم1، الرقم2)
ناتج القسمة الصحيحة (الناتج عدد صحيح) لـ number1 على number2
div(7,3)=2

mod(العدد1، العدد2)
الباقي من القسمة الصحيحة (النتيجة عدد صحيح) لـ number1 على number2
mod(7,3)=1

sign(number)
-1 إذا كان number < 0
0 إذا كان العدد=0
+1 إذا كان الرقم > 0
علامة(-6) = -1

جذر (العدد)
الجذر التربيعي للعدد إذا كان العدد >= 0
-1 إذا كان الرقم < 0
جذر (16) = 4

4.3.2. الدوال ذات المعلمات النصية

ascii_char(الرقم)
رقم حرف رمز ASCII
ascii_char(65) = 'A'
lower(سلسلة)
تحويل السلسلة إلى أحرف صغيرة
lower('INFO')='info'
ltrim(string)
القص من اليسار - تتم إزالة المسافات التي تسبق النص في السلسلة:
ltrim(' kitten')='kitten'
replace(string1, string2, string3)
يستبدل string2 بـ string3 في string1.
replace('cat and dog','cat','**')='**at and **og'
rtrim(string1, string2)
القص من اليمين - مثل ltrim ولكن من اليمين
rtrim('cat ')='cat'
substr(string, p, q)
جزء من سلسلة يبدأ من الموضع p وينتهي عند الموضع q.
substr('kitten',3,5)='to'
ascii_val(character)
رمز ASCII للحرف
ascii_val('A')=65
strlen(سلسلة)
عدد الأحرف في السلسلة
strlen('kitten')=6