مستوى الدرس :مبتدئ
بسم الله الرحمن الرحيم
عنوان الدرس : التوابع العالية في MySQL - الجزء الأول
توابع التحكم بالانسياب
كما هو واضح من اسمها أنها تستخدم للتحكم في سير البرنامج, و أهم تابعين يستخدمان للتحكم بالانسياب في MySQL هما ifnull() , if() و سنتكلم عنهما الآن إن شاء الله.
التابع ifnull() :
لنفرض أنك ستكتب استعلاماً يعيد مجموع كل من الراتب salary و الحوافز bonus لكل موظف, فإنك ستكتب الاستعلام التالي:
select name , salary + bonus from emp;
ستفاجئ عندما يظهر لك مجموع راتب و حوافز بعض الموظفين هو NULL فكيف حصل ذلك؟ إن الاستعلام السابق يقوم بجمع الراتب مع الحوافز, لكن هناك بعض الموظفين الذين حوافزهم هي null و أنت تعرف أن نتيجة جمع أي قيمة مع NULL هي null و للتخلص من هذه المعضلة فأنت بحاجة إلى الخوارزمية التالية:
قم بتشغيل استعلام MySQL على الجدول emp
يعيد name و مجموع salary + bonus
فإذا كان bonus = null
اطبع فقط salary
و إلا
اطبع salary + bonus
إذا أردت كتابة هذه الخوارزمية بأحد لغات البرمجة مثل PHP فهي ستكون طويلة, لذلك توفر لنا MySQL التابع ifnull() الذي يعمل عمل الخوارزمية السابقة. يأخذ هذا التابع وسيطين, و هو يقوم باختبار قيمة الوسيط الأول فإذا لم تكن مساوية لـ null فسيعيد قيمة الوسيط الأول, و إذا كانت قيمة الوسيط الأول مساوي لـ null فإن التابع سيعيد قيمة الوسيط الثاني, لذلك فإن الاستعلام السابق سيأخذ الشكل التالي:
select name , salary + ifnull(bonus , 0) as 'total' from emp;
التابع if() :
يأخذ التابع if() ثلاث وسطاء حيث أن الوسيط الأول سيكون شرطاً, و من الممكن أن يكون أي معامل حسابي أو سلسلة محرفية أو عبارة like , و في حال كان الشرط محققاً فإن التابع سيعيد الوسيط الثاني, و إلا فإنه سيعيد الوسيط الثالث, دعنا نأخذ المثال التالي:
لنفرض أنك تريد أن تقدم حسماً قدره 15% على كل أفلام العنف, فباستخدام التابع if() سيكون شكل الاستعلام كما يلي:
select mov_name , kind, if(kind ='violence' , price * .85 , price) as price from movies ;
لاحظ أن الاستعلام سيبحث في العمود kind فإذا وجد فيها القيمة violence سيقوم بضرب القيمة المخزنة بالعمود price بـ 0.85 و إذا وجد أن القيمة المخزنة في العمود kind ليست violence فسيطبع القيمة المخزنة في العمود price كما هي.
و بالتالي ستكون نتيجة الاستعلام السابق كما يلي:
+-----------------------+---------------+--------------+
|mov_name |kind |price |
+-----------------------+---------------+--------------+
|last man standing |violence |212.50 |
|city of angels |romance |300 |
|urban legend |horror |300 |
|the fist of legend |violence |212.50 |
|assassins |violence |340.00 |
|face off |violence |365.50 |
+-----------------------+---------------+--------------+
و آخر دعوانا أن الحمد لله رب العالمين
أخوكم أبو عمر