طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 122 · برمجة قواعد البيانات

🧪 التدريبات

كل تمرين «جرّب بنفسك» في مكان واحد: اقرأ المطلوب، ثم اكتب الحل وشغّله داخل صفحة الدرس.

الوحدة 1: مقدمة للبرمجة الإجرائية

عدّاد عملاء الرياضتمهيدي · الدرس 1: لماذا البرمجة الإجرائية داخل قاعدة البيانات؟
اكتب كتلة DO تحسب عدد العملاء في مدينة الرياض وتطبع النتيجة.
←
تقرير المخزونمتوسط · الدرس 2: الكتلة الإجرائية: المتغيرات والشروط والحلقات
اكتب كتلة تمر على المنتجات من 1 إلى 6 وتطبع حالة مخزون كل منها.
←

الوحدة 2: إنشاء إجراءات مخزنة ودوال

إجمالي الطلبمتوسط · الدرس 3: أول دالة: CREATE FUNCTION
اكتب دالة order_total(oid int) تُرجع إجمالي طلب: مجموع الكمية × سعر الوحدة لكل بنوده.
←
إلغاء طلبمتوسط · الدرس 4: أول إجراء مخزن: CREATE PROCEDURE و CALL
اكتب إجراء cancel_order(p_oid int) يلغي الطلب إن كانت حالته new أو paid فقط؛ أما المشحون أو الملغى فلا يتغير.
←

الوحدة 3: تحسين الأداء وتنفيذ استعلامات محسّنة

اجعل البحث يستخدم فهرسًامتوسط · الدرس 5: كيف ينفّذ PostgreSQL الاستعلام؟ EXPLAIN
استعلام يبحث عن بنود منتج معيّن في order_items يقرأ الجدول كله (40 ألف صف). أنشئ فهرسًا يجعل المخطِّط يستخدمه، ثم اعرض الخطة.
←
تقرير مبيعات سبتمبرمتوسط · الدرس 6: قياس الأداء وأخطاؤه الشائعة
هذا الاستعلام يحسب طلبات سبتمبر 2025 حسب الحالة، لكنه يقرأ الجدول كله رغم وجود فهرس على التاريخ. أعد كتابته ليستفيد من الفهرس، دون تغيير النتيجة.
←

الوحدة 4: تصميم جداول البيانات بالعلاقات والفهارس

تقييمات المنتجاتمتوسط · الدرس 7: تصميم الجداول والعلاقات
يريد المتجر أن يقيّم العملاء المنتجات: كل عميل يقيّم المنتج مرة واحدة فقط، بدرجة من 1 إلى 5 وتعليق اختياري. صمّم الجدول reviews.
←
فكّك جدول الموردينمتقدم · الدرس 8: التطبيع: من جدول واحد إلى جداول مترابطة
في الجدول sales_flat بيانات الموردين مكررة. أنشئ جدول suppliers واملأه من البيانات الموجودة، ثم أضف إلى sales_flat عمود supplier_id واملأه، واحذف عمودي المورد القديمين.
←
فهرسة المفاتيح الأجنبيةمتوسط · الدرس 9: الفهارس في التصميم: متى ولماذا؟
قاعدة المتجر فيها أربعة مفاتيح أجنبية بلا فهارس. أنشئ فهرسًا لكل منها، ثم اعرض فهارس الجداول.
←

الوحدة 5: إنشاء جداول البيانات

جدول الكوبوناتمتوسط · الدرس 10: CREATE TABLE وأنواع البيانات
أنشئ جدول coupons لكوبونات الخصم بأنواع مناسبة.
←
قيود جدول الموظفينمتوسط · الدرس 11: القيود: NOT NULL و UNIQUE و CHECK و DEFAULT
أنشئ جدول staff لموظفي المتجر بالقيود المطلوبة.
←
الموردون والمنتجاتمتقدم · الدرس 12: المفاتيح الأجنبية وتعديل الجداول
أضف إلى المتجر جدول الموردين، واربط المنتجات به، بحيث إذا حُذف مورد بقيت منتجاته بلا مورد.
←

الوحدة 6: تحسين أداء جداول البيانات وإنشاء الفهارس

فهرس لوحة الموظفينمتقدم · الدرس 13: إنشاء الفهارس وإدارتها
لوحة الموظفين تعرض كل دقيقة الطلبات المدفوعة لعميل معيّن من الأحدث للأقدم: WHERE status = 'paid' AND customer_id = … ORDER BY order_date DESC. صمّم فهرسًا واحدًا يخدمها بأقل حجم.
←
أجزاء الطلبات حسب المنطقةمتقدم · الدرس 14: التجزئة والصيانة: Partitioning و ANALYZE
أنشئ جدول regional_orders مجزّأ بالقائمة حسب المدينة: جزء للمنطقة الوسطى (الرياض)، وجزء للغربية (جدة، مكة، المدينة)، وجزء افتراضي لبقية المدن. ثم انسخ إليه طلبات المتجر مع مدن عملائها.
←

الوحدة 7: مفاهيم الإجراءات المخزنة والدوال

بريد لا يتكرر بأي كتابةمتوسط · الدرس 15: الدالة أم الإجراء؟ الفوائد والاستخدامات
العملاء يكتبون بريدهم بأحرف كبيرة أو بمسافات زائدة، فيتكرر البريد نفسه بأشكال مختلفة. اكتب دالة توحّد البريد، واستخدمها في فهرس فريد يمنع التكرار.
←
دالة الأسعار لتطبيق الجوالمتقدم · الدرس 16: المعاملات والأمان في البرامج المخزنة
تطبيق الجوال يتصل بالقاعدة بالدور mobile_app. نريده أن يعرف سعر المنتج بعد الضريبة فقط، دون أي صلاحية على الجداول.
←

الوحدة 8: إنشاء إجراءات مخزنة

ملخص الطلبمتوسط · الدرس 17: معاملات الإجراء: IN و OUT و INOUT
اكتب إجراء order_summary يستقبل رقم طلب ويُخرج عدد بنوده وإجماليه.
←
بيع آمنمتقدم · الدرس 18: معالجة الأخطاء: RAISE و EXCEPTION
اكتب إجراء safe_sell(pid int, n int) يبيع n قطعة من المنتج بشروط عمل واضحة.
←

الوحدة 9: إنشاء واستخدام الدوال

الأكثر مبيعًا في التصنيفمتقدم · الدرس 19: دوال تُرجع جداول: RETURNS TABLE
اكتب دالة جدولية best_sellers(cat int, k int) تُرجع أكثر k منتجات مبيعًا (بالكميات) في التصنيف.
←
تقرير المدن بمؤشرمتوسط · الدرس 20: الحلقات على النتائج والمؤشرات
اكتب كتلة DO تطبع لكل مدينة عدد عملائها، مرتبة بالعدد تنازليًّا ثم باسم المدينة، باستخدام مؤشر صريح.
←
خصم المخزون تلقائيًّامتقدم · الدرس 21: المحفزات: دوال تعمل تلقائيًّا
اكتب محفزًا على order_items ينقص مخزون المنتج تلقائيًّا عند إضافة بند، ويرفض البند إن لم يكفِ المخزون.
←

الوحدة 10: تحسين الاستعلامات باستخدام لغة البرمجة الإجرائية

تصنيف العملاء بأمر واحدمتقدم · الدرس 22: التفكير بالمجموعات بدل الحلقات
أضف إلى customers عمود tier واملأه حسب مجموع مشتريات العميل (كل الطلبات): ذهبي gold من 3000 فأكثر، وفضي silver من 500 فأكثر، وإلا basic. بلا حلقات.
←
عدّاد آمن لأي جدولمتقدم · الدرس 23: SQL الديناميكي الآمن: EXECUTE و format
اكتب دالة count_where(tbl text, col text, val text) تُرجع عدد صفوف الجدول tbl التي يساوي فيها العمود col القيمة val، بأمان من الحقن.
←

الوحدة 11: تطوير استعلامات محسّنة باستخدام البرمجة الإجرائية

سلسلة الإدارةمتقدم · الدرس 24: الاستعلامات الفرعية و CTE
لموظف «مساعد مندوب» (رقم 7)، اعرض سلسلة مدرائه صعودًا حتى المدير العام، مع مستوى كل منهم.
←
أغلى منتجين في كل تصنيفمتوسط · الدرس 25: دوال النوافذ: الترتيب والمجاميع المتراكمة
اعرض لكل تصنيف أغلى منتجين، مع ترتيب كل منهما في تصنيفه.
←
لوحة المبيعات اليوميةمتقدم · الدرس 26: العروض والعروض المادية
لوحة الإدارة تعرض مبيعات كل يوم، وتُفتح مئات المرات. ابنِ لها عرضًا ماديًّا يُحدَّث دون إيقاف القراء.
←

الوحدة 12: تنفيذ أمثلة عملية لتحسين استعلامات البيانات

سرّع تقرير الإيرادمتقدم · الدرس 27: مشروع: من استعلام بطيء إلى سريع
هذا التقرير يحسب لكل حالة طلب عدد الطلبات وإيرادها في الربع الثالث من 2025 (يوليو إلى سبتمبر)، لكنه بطيء. أعد كتابته بالنتيجة نفسها.
←
مواصفات مرنة للمنتجاتمتوسط · الدرس 28: قواعد البيانات السحابية و NoSQL
أضف إلى المنتجات عمود مواصفات jsonb، واملأه لمنتجين، وافهرسه، ثم ابحث فيه.
←