انتقل إلى محتوى الدرس
الدرس 37
دورة MySQL

التعبيرات الشرطية CASE و COALESCE وتحويل الأنواع CAST في MySQLMySQL Conditional Expressions CASE COALESCE and Type Casting

تعلّم التعبيرات الشرطية CASE و COALESCE وتحويل الأنواع CAST في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
8
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

لتضمين منطق التفرع الشرطي (if / else if / else) مباشرة داخل استعلامات SELECT أو ORDER BY أو UPDATE، يوفر معيار SQL القياسي تعبير CASE:

  • الصيغة الشرطية الكاملة CASE WHEN ... THEN ... ELSE ... END: تفحص الشروط المنطقية بالترتيب من الأعلى للأسفل، وتعيد نتيجة أول شرط يتحقق ثم تتوقف عن فحص البقية.
  • أهمية فرع ELSE: إذا لم يتحقق أي شرط ولم تكتب فرع ELSE، يعيد تعبير CASE القيمة الفارغة NULL تلقائياً.
  • الدالة المختصرة IF(cond, v_true, v_false): دالة سريعة في MySQL للشرط الثنائي البسيط.
مخطط يوضح التعبير الشرطي CASE WHEN ومعالجة القيم الفارغة بـ COALESCE و NULLIF وتحويل الأنواع الصريح بـ CAST في MySQL 8
SQL
SELECT
  product_id,
  stock_qty,
  CASE
    WHEN stock_qty = 0 THEN 'Out of Stock'
    WHEN stock_qty < 10 THEN 'Low Stock'
    ELSE 'In Stock'
  END AS inventory_status
FROM products;

من أقوى الأنماط التحليلية في لوحات التحكم الإدارية دمج الدوال التجميعية SUM() أو COUNT() مع تعبير CASE WHEN لتحويل حالات الصفوف إلى أعمدة ملخصة متجاورة في مسحة جدول واحدة:

  • العد الشرطي SUM(CASE WHEN status = 'paid' THEN 1 ELSE 0 END): يحسب عدد الطلبات المدفوعة فقط في عمود مستقل.
  • الجمع المالي الشرطي: يجمع مبالغ الطلبات المكتملة فقط جنباً إلى جنب مع مبالغ الطلبات المستردة في نفس صف التقرير.
SQL
SELECT
  SUM(CASE WHEN status = 'paid' THEN 1 ELSE 0 END) AS paid_cnt,
  SUM(CASE WHEN status = 'void' THEN 1 ELSE 0 END) AS void_cnt,
  SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS net_rev
FROM orders;

عندما يحتوي عمود على القيمة الفارغة NULL، نحتاج في العمليات الحسابية وواجهات العرض إلى استبداله بقيمة افتراضية بديلة:

  • الدالة القياسية COALESCE(val1, val2, ..., default_val): تقبل معاملين أو أكثر وتفحصها بالترتيب لتعيد أول قيمة غير فارغة (Non-NULL) تصادفها.
  • دالة IFNULL(expr1, expr2): دالة خاصة بـ MySQL تقبل معاملين فقط؛ ويُنصح بتفضيل COALESCE() لدعمها سلسلة بدائل متعددة وتوافقها مع معيار SQL القياسي.
SQL
SELECT
  customer_id,
  COALESCE(mobile_phone, home_phone, 'No Phone') AS primary_phone,
  unit_price - COALESCE(discount_amount, 0.00) AS final_price
FROM customers;

تقارن دالة NULLIF(expr1, expr2) بين قيمتين، فإذا تساوتا (expr1 = expr2) تعيد القيمة الفارغة NULL، وإلا فإنها تعيد القيمة الأولى expr1 كما هي. وتبرز أهميتها في حالتين عمليتين:

  • الوقاية من القسمة على صفر: كتابة revenue / NULLIF(visits, 0) تحول المقام الصفري إلى NULL، وبدمجها مع COALESCE(..., 0) نحصل على 0 بأمان تام.
  • تحويل النصوص الفارغة إلى NULL: يحول التعبير NULLIF(TRIM(notes), '') النص الفارغ إلى NULL حقيقي.
SQL
SELECT
  campaign_id,
  COALESCE(clicks / NULLIF(impressions, 0), 0) AS ctr_ratio,
  NULLIF(TRIM(coupon_code), '') AS clean_coupon
FROM ad_campaigns;

عند الحاجة لتحويل نص رقمي لإجراء مقارنة حسابية دقيقة أو تحويل طابع زمني إلى تاريخ صرف، نستخدم دالة التحويل الصريح القياسية CAST(expr AS type) (أو CONVERT(expr, type)):

  • الأنواع المستهدفة المدعومة في MySQL 8: SIGNED (عدد صحيح بعلامة)، وUNSIGNED (عدد صحيح موجب)، وDECIMAL(M,D)، وCHAR، وDATE، وDATETIME، وJSON.
  • انتبه لصيغة الأعداد الصحيحة داخل CAST: نكتب في MySQL الصيغة AS SIGNED أو AS UNSIGNED ولا نكتب AS INT.
SQL
SELECT
  CAST('1250.50' AS DECIMAL(10, 2)) AS exact_amount,
  CAST('42' AS UNSIGNED) AS int_number,
  CAST(created_at AS DATE) AS order_date_only,
  CONVERT(9800, CHAR) AS code_string
FROM orders;

يلخص الجدول المرجعي التالي مقارنة شاملة بين التعبيرات الشرطية ودوال معالجة الفراغ وتحويل الأنواع في MySQL 8:

التعبير / الدالةالوظيفة الأساسيةالتوافق القياسيمثال تطبيقي
CASE WHEN ... ENDالتفرع الشرطي متعدد المساراتقياسي عالمي ANSI SQLCASE WHEN x>0 THEN 'OK' ELSE 'No' END
IF(cond, t, f)شرط ثنائي مختصرخاص بـ MySQLIF(is_paid=1, 'Paid', 'Pending')
COALESCE(a, b, ...)إرجاع أول قيمة غير فارغةقياسي عالمي ANSI SQLCOALESCE(mobile, phone, 'N/A')
IFNULL(a, b)بديل NULL لمعاملين فقطخاص بـ MySQLIFNULL(discount, 0)
NULLIF(a, b)تعيد NULL عند تساوي القيمتينقياسي عالمي ANSI SQLtotal / NULLIF(cnt, 0)
CAST(x AS type)التحويل الصريح لنوع البياناتقياسي عالمي ANSI SQLCAST(val AS DECIMAL(10,2))
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس كتابة الشروط متعددة الفروع عبر CASE WHEN ... END، وبناء تقارير التجميع الشرطي عبر SUM(CASE ...)، ومعالجة القيم الفارغة بدالتي COALESCE() وIFNULL()، ومنع القسمة الصفرية بـ NULLIF()، والتحويل الصريح للأنواع عبر CAST().

الخطوة التالية والدرس القادم

انتقل الآن إلى الوحدة العاشرة والدرس الثامن والثلاثين «العلاقات بين الجداول واحد لواحد وواحد لمتعدد ومتعدد لمتعدد في MySQL» لتعلم هندسة العلاقات العلائقية بين الجداول.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 CASE Expressions التعبيرات الشرطية
تعلّم التعبيرات الشرطية CASE و COALESCE وتحويل الأنواع CAST في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
للمراجعة
02 Searched CASE WHEN Expressions التعبير الشرطي CASE WHEN
المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم التعبير الشرطي CASE WHEN في MySQL 8.
للمراجعة
03 Conditional Aggregation Pivoting التجميع الشرطي وبناء التقارير
المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم التجميع الشرطي وبناء التقارير في MySQL 8.
للمراجعة
04 Handling NULLs with COALESCE استبدال الفارغ بدالة COALESCE
المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم استبدال الفارغ بدالة COALESCE في MySQL 8.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 ANSI ANSI
American National Standards Institute (Standard SQL)
المعيار القياسي للغة SQL الذي يعرف التعبيرات المحمولة CASE و COALESCE و NULLIF و CAST.
للمراجعة
02 CTR CTR
Click-Through Rate
معدل النقر إلى الظهور ويُحسب بأمان في SQL عبر دمج COALESCE مع NULLIF لمنع القسمة على صفر.
للمراجعة
03 KPI KPI
Key Performance Indicator
مؤشر الأداء الرئيسي في التقارير ويُبنى غالباً بنمط التجميع الشرطي SUM(CASE WHEN ...).
للمراجعة
04 JSON JSON
JavaScript Object Notation
صيغة كائنات البيانات المهيكلة وتدعم دالة CAST في MySQL 8 التحويل المباشر إليها.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ استعلامات SQL المشروحة في قسم التعبير الشرطي CASE WHEN داخل قاعدة بيانات MySQL 8 المحلية وتأكد من مطابقة النتائج.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم التجميع الشرطي وبناء التقارير وقارن مخرجات الاستعلام.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 3أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

ماذا يعيد التعبير الشرطي CASE WHEN إذا لم يتحقق أي شرط من شروط WHEN وتم حذف فرع ELSE؟

عند عدم تحقق أي شرط وعدم وجود فرع ELSE يعيد التعبير القيمة الفارغة NULL تلقائياً.

02

ما هي مخرجات الاستعلام SELECT COALESCE(NULL, NULL, "Fallback", "Last"); في MySQL؟

تعيد دالة COALESCE() أول قيمة غير فارغة تصادفها من اليسار لليمين وهي "Fallback".

03

ماذا تعيد الدالة NULLIF(0, 0) ولماذا تُستخدم في مقام عمليات القسمة؟

تعيد القيمة NULL عند تساوي المعاملين، مما يمنع القسمة على صفر عندما يكون المقام مساوياً لصفر.

04

ما هي الكلمة المفتاحية الصحيحة للنوع داخل دالة CAST(expr AS ...) في MySQL لتحويل نص إلى عدد صحيح بعلامة؟

يستخدم محرك MySQL الكلمة المفتاحية SIGNED (أو UNSIGNED) داخل دالة CAST لتحويل الأعداد الصحيحة.

05

يتيح دمج SUM(CASE WHEN status = "paid" THEN 1 ELSE 0 END) حساب عدد الصفوف المطابقة لشرط معين كعمود مستقل داخل استعلام واحد.

صواب؛ يُعرف هذا النمط بالتجميع الشرطي لبناء التقارير الملخصة في مسحة واحدة للجدول.

06

دالة COALESCE() قياسية في معيار ANSI SQL وتقبل أكثر من معاملين، بينما تقبل دالة IFNULL() معاملين فقط.

صواب؛ تدعم دالة COALESCE سلسلة بدائل متعددة وتتوافق مع جميع قواعد البيانات القياسية.

07

في التعبير CASE WHEN score >= 50 THEN "Pass" WHEN score >= 90 THEN "Distinction" END، ما النتيجة عند score = 95؟

يعيد "Pass" لأن CASE يتوقف عند أول شرط يتحقق من الأعلى (95 >= 50)؛ ولذلك يجب وضع الشرط الأعلى (>= 90) أولاً!

08

أي نوعين مما يلي يقبلان التحويل الصريح داخل دالة CAST(expr AS ...) في MySQL 8؟ (اختر إجابتين)

يدعم MySQL 8 التحويل الصريح إلى نوعي DECIMAL(10,2) و DATE.