الدوال في الاستعلامات .
تستخدم العديد من الدوال ضمن طيات جمل الاستعلام ، وهي
شائعة الاستخدام ، ومريحة ، وتعيد قيمة وحيدة - لا تعيد جدول - سنتعرف على
بعض الدوال مع بعض الأمثلة خلال هذا الدرس .
ولننظر نظرة سريعة إلى الصيغة العامة لاستخدام الدوال والتي تأخذ الشكل التالي :
- اقتباس :
- SELECT func(colum) FROM table WHERE condition;
الدالة
AVG :
تعطينا هذه الدالة متوسط حقل ما ، ولحساب متوسط الأعمار في قاعدة البيانات مثلاً نكتب أمراً كالتالي :
- اقتباس :
- Select AVG(Age) from tb_main;
ولك ان تتخيل ماذا سنفعل لو لم نستخدم هذه الدالة ،
كنا سندور على جميع السجلات حيث نجمع ارقام كل سجل ثم ننتقل إلى التالي
وهكذا - برمجياً - .
أيضاً يمكننا استخدام الدالة بشرط ... فمثلاً لحساب متوسط أعمار الأشخاص الذين لا تزيد أعمارهم عن 25 :
- اقتباس :
- SELECT AVG(Age) FROM tb_main where age < 25;
لو لاحظت لوجدت أن ناتج الدالة يظهر في حقل تحت اسم Expr100 أو ما شابه ... لذا قم - إذا كنت تريد - باعادة تسمية حقل الناتج عن طريق As كما تعلمنا سابقاً وبالشكل التالي : - اقتباس :
- SELECT AVG(Age) as AVGAGE FROM tb_main WHERE age < 25;
لاحظ أن الدالة سوف تتجاهل السجلات الفارغة ...
الدوال
Sum,Max,Min :
تعطي هذه الدوال المجموع - الأكبر - الأصغر على التوالي ، وهذا مثال على أكبر عمر في قاعدة البيانات :
- اقتباس :
-
SELECT max(Age) AS mxAGE FROM tb_main;
لا تنس أن بإمكاننا وضع شرط لعملية الإستعلام .
الدالة
Count :
وتعيد هذه الدالة عدد السجلات ولها صورتان تعمل مع أكسيس ... أما الصورة الثالثة فهي لا تعمل على الاكسيس :
الصيغة الأولى :
Count(colum) ... وتعيد عدد السجلات التي لم يكن هذا الحقل فارغاً فيها .
الصيغة الثانية : Count(*) ... وتعيد عدد السجلات دون النظر إلى إذا ما كانت فارغة أم لا .
أما الصيغة الثالثة : COUNT(DISTINCT Colum( حيث تقوم بعد السجلات مع تجاهل المكرر منها .
ولنر مثالاً على الصيغة الثانية :
- اقتباس :
- Select count(*) From Tb_Main;
لا تنس أن بإمكانك وضع شرط لعملية العد .
كانت هذه بعض الدوال البسيطة والاكثر شهرة في TSql والآن ، ماذا لو كانت لدينا علاقات ونرغب في العمل عليها .
في مثل هذه الحالة ... نريد الحصول على معلومات البطاقة الشخصية الخاصة باسم ما وذلك من Tb_R2 - لاحظ أنه لا يوجد حقل للاسم في الجدول الثاني - .
- اقتباس :
- SELECT tb_main.Fname, tb_main.lname, Tb_R1.passport, tb_r1.bclass, tb_r1.from
FROM tb_main, tb_r1
WHERE tb_main.Number = tb_r1.Number;
دعنا الآن نلاحظ الفروق بين هذه الطريقة والطريقة السابقة :
أولاً : نقوم بكتابة اسم الجدول.اسم الحقل وذلك مهم لأننا نتعامل مع أكثر من جدول .
ثانياً : نقوم بكتابة اكثر من جدول بعد عبارة
From لأننا نريد النواتج من أكثر من جدول .
ثالثاً : السطر الأخير من جملة الاستعلام هو لكي يعرض المعلومات التي تتشابه أرقامها في الجدولين سوية .
دعنا الآن نجرب مثالاً آخراً ... وذلك بالاستعلام عن كافة المعلومات التي تتعلق بالأصدقاء الذين تزيد أعمارهم عن 20 سنة .
- اقتباس :
- SELECT tb_main.Fname, tb_main.lname, Tb_R1.passport, tb_r1.bclass, tb_r1.from
FROM tb_main, tb_r1
WHERE tb_main.Number = tb_r1.Number and tb_main.age >25;
والآن نريد تطبيق امثلة جديدة ، ولكي نبدأ في تطبيق أمثلة
هذا الدرس لا بد أن يكون بعض الأصدقاء لديهم سجلات في الجدول الثاني
والبعض الآخر لا .
ومازال حديثنا حول العلاقات وما يتعلق بها ... وسنتحدث عن الدالة Join .
النوع الأول :
Inner Join :
هي الطريقة العادية والتي تحدثنا عنها في الدرس السابق تعطينا النواتج في حال كان شرط العلاقة متحققاً في كلا الجدولين .
بمعنى : جرب أن تحذف بعض سجلات الأصدقاء من الجدول الثاني ، وستجد أن معلوماتهم - حتى الأساسية - لن تظهر .
هذا النوع من الربط يطلق عليه Inner Join وهو الافتراضي ... ويمكننا كتابته بالشكل التالي للتفريق بين الأنواع المختلفة :
- اقتباس :
- SELECT tb_main.Fname, tb_main.lname, Tb_R1.passport, tb_r1.bclass, tb_r1.from
FROM tb_main inner join tb_r1
on tb_main.Number=tb_r1.Number;
لاحظ أننا استبدلنا Where ب on كما وضعنا inner join بين اسمي الجدولين .
النوع الثاني :
Left Join :
في هذا النوع يعرض جميع بيانات الجدول الأول ( على اليسار ) ومن ثم يعرض البيانات المقابلة في الجدول الثاني .
لاحظ في هذا النوع أمرين :
* إذا كانت هناك سجلات ( على اليسار ) لا تقابلها سجلات على اليمين فإن اليسار يعرض ويعرض اليمين فارغاً .
* وإذا كانت هناك سجلات ( على اليمين ) ليس لها مقابل على اليسار فإنها لا تُعرض أبداً .
مثال هذه النوعية :
- اقتباس :
SELECT tb_main.Fname, tb_main.lname, Tb_R1.passport, tb_r1.bclass, tb_r1.from
FROM tb_main Left JOIN tb_r1 ON tb_main.Number=tb_r1.Number;
النوع الثالث :
Right Join :
هو النوع العكسي تماماً للعملية السابقة ، وهذا مثال عليه :
- اقتباس :
SELECT tb_main.Fname, tb_main.lname, Tb_R1.passport, tb_r1.bclass, tb_r1.from
FROM tb_main Right JOIN tb_r1 ON tb_main.Number=tb_r1.Number;
*** في النهاية أود أن انبه إلى أنه ما زال هناك الكثير في TSQL ولكن كانت هذه مقدمة سريعة إليها ...
والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .