The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.
Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by ibrquqa65, 2022-09-21 15:14:43

Database-design-ar-hsoub-academy-v1.0

Database-design-ar-hsoub-academy-v1.0

‫تصميم قواعد البيانات‬ ‫فهم عملية التوحيد ‪Normalization‬‬

‫• ‪ :FD‬الاعتمادية الكاملة ‪ ،full dependency‬إذ يشير الاختصار ‪ FD‬إلى الاعتمادية الوظيفي ة ‪functional‬‬
‫‪ dependency‬ع اد ًة‪ ،‬ولكن اس تخدمنا الاختص ار ‪ FD‬على أس اس اختص ار للاعتمادية‬

‫الكاملة ‪ full dependency‬في الشكل السابق فقط‪.‬‬

‫‪ 10.6‬نموذج بويس‪-‬كود المو َّحد ‪BCNF‬‬

‫قد تنتج حالات شاذة عندما يحتوي الجدول على أكثر من مفتاح مر َّش ح ‪ candidate key‬على ال رغم من أن‬
‫العلاق ة بص يغة نم وذج ‪ ،3NF‬حيث يُ َع ّد نم وذج ب ويس‪-‬ك ود الموحَّد ‪ Boyce-Codd normal form‬أو ‪BCNF‬‬
‫اختص ا ًرا حال ًة خاص ًة من النم وذج ‪ ،3NF‬وتك ون العلاق ة ض من نم وذج ‪ BCNF‬إذا وفق ط إذا ك ان ك ل مح ّدد‬

‫‪ determinant‬مفتا ًحا مر َشحًا ‪.candidate key‬‬

‫‪ 10.6.1‬المثال الأول عن نموذج ‪BCNF‬‬

‫ضع في بالك الجدول التالي ‪:St_Maj_Adv‬‬

‫‪Advisor‬‬ ‫‪Major‬‬ ‫‪Student_id‬‬
‫‪111‬‬
‫‪Smith‬‬ ‫‪Physics‬‬ ‫‪111‬‬
‫‪Chan‬‬ ‫‪Music‬‬ ‫‪320‬‬
‫‪Dobbs‬‬ ‫‪Math‬‬ ‫‪671‬‬
‫‪White‬‬ ‫‪Physics‬‬ ‫‪803‬‬
‫‪Smith‬‬ ‫‪Physics‬‬

‫القواعد الدلالية ‪- semantic rules‬أي قواعد العمل المط َّبقة على قاعدة البيانات‪ -‬لهذا الجدول هي‪:‬‬

‫‪ .1‬يجوز لكل طالب ‪ Student‬التخصص في عدة مواد‪.‬‬

‫‪ .2‬يكون لكل طالب معين مدرِّ ًسا واح ًدا فقط لكل تخصص ‪.Major‬‬
‫‪ .3‬لكل تخصص عدة مدرِّسين‪.‬‬

‫‪ .4‬يدرِّس كل مدرِّس تخص ًصا واح ًدا فقط‪.‬‬
‫‪ .5‬يدرِّس كل مدرِّس عدة طلاب في تخصص واحد‪.‬‬
‫الاعتماديات الوظيفية له ذا الج دول م ذكورة أدن اه‪ ،‬ف الأولى هي مفت اح مر َّش ح ‪ ،candidate key‬والثاني ة‬

‫ليست كذلك‪.‬‬

‫‪Student_id, Major ——> Advisor‬‬
‫‪Advisor ——> Major‬‬

‫‪101‬‬

‫تصميم قواعد البيانات‬ Normalization ‫فهم عملية التوحيد‬

:‫تشمل الحالات الشاذة لهذا الجدول ما يلي‬
.‫ مثل حالة حذف الطالب معلومات المدرِّس‬:Delete ‫ الحذف‬.1
.‫ مثل حالة احتياج المدرِّس الجديد إلى وجود طالب‬:Insert ‫ الإدخال‬.2

.‫ مثل الحالات المتناقضة‬:Update ‫ التحديث‬.3

.‫ مفتا ًحا مر َشحًا‬single attribute ‫ليست السمة ال ُمف َردة‬

‫ ويمكن ك إنش اء‬،Student_id, Advisor ‫ أو‬،Student_id, Major ‫ هو‬PK ‫يمكن أن يكون المفتاح الرئيسي‬
:‫ كما يلي‬BCNF ‫ إلى النموذج‬St_Maj_Adv ‫ لتقليل العلاقة‬،‫جدولين جديدين‬

St_Adv (Student_id, Advisor)
Adv_Maj (Advisor, Major)

:St_Adv ‫• جدول‬

Advisor Student_id
111
Smith 111
Chan 320
Dobbs 671
White 803
Smith
:Adv_Maj ‫• جدول‬

Major Advisor

Physics Smith
Music Chan
Math Dobbs
Physics White

BCNF ‫ المثال الثاني عن نموذج‬10.6.2

:Client_Interview ‫انظر الجدول التالي‬

RoomNo StaffNo InterviewTime InterviewDate ClientNo
G101 SG5
G101 SG5 10.30 13-May-02 CR76
G102 SG37
12.00 13-May-02 CR56

12.00 13-May-02 CR74

102

‫تصميم قواعد البيانات‬ ‫فهم عملية التوحيد ‪Normalization‬‬

‫‪G102‬‬ ‫‪SG5‬‬ ‫‪10.30‬‬ ‫‪1-July-02‬‬ ‫‪CR56‬‬

‫)‪FD1 – ClientNo, InterviewDate –> InterviewTime, StaffNo, RoomNo (PK‬‬

‫‪FD2 – staffNo, interviewDate, interviewTime –> clientNO‬‬
‫)‪(candidate key: CK‬‬

‫‪FD3 – roomNo, interviewDate, interviewTime –> staffNo, clientNo‬‬
‫)‪(CK‬‬

‫‪FD4 – staffNo, interviewDate –> roomNo‬‬
‫تكون العلاقة بصيغة نموذج ‪ BCNF‬إذا وفقط إذا كان كل مح ّدد ‪ determinant‬مفتاحًا مر َّشحًا‪.‬‬

‫نحن بحاجة إلى إنش اء ج دول يتض من أول ثلاث ة اعتمادي ات كامل ة ‪- FD‬أي ج دول ‪،-Client_Interview2‬‬
‫وإنشاء جدول آخر ‪-‬أي جدول ‪ -StaffRoom‬للاعتمادية الكاملة ‪ FD‬الرابعة‪.‬‬

‫• جدول ‪:Client_Interview2‬‬

‫‪ClientNo‬‬ ‫‪InterviewDate‬‬ ‫‪InterViewTime‬‬ ‫‪StaffNo‬‬
‫‪CR76‬‬ ‫‪13-May-02‬‬ ‫‪10.30‬‬ ‫‪SG5‬‬
‫‪CR56‬‬ ‫‪13-May-02‬‬ ‫‪12.00‬‬ ‫‪SG5‬‬
‫‪CR74‬‬ ‫‪13-May-02‬‬ ‫‪12.00‬‬ ‫‪SG37‬‬
‫‪CR56‬‬ ‫‪1-July-02‬‬ ‫‪10.30‬‬ ‫‪SG5‬‬

‫• جدول ‪:StaffRoom‬‬

‫‪RoomNo‬‬ ‫‪StaffNo‬‬ ‫‪StaffNo‬‬
‫‪13-May-02‬‬
‫‪G101‬‬ ‫‪13-May-02‬‬ ‫‪SG5‬‬
‫‪G102‬‬ ‫‪1-July-02‬‬ ‫‪SG37‬‬
‫‪G102‬‬ ‫‪SG5‬‬

‫‪ 10.7‬التوحيد وتصميم قواعد البيانات‬

‫تأ َّكد أثناء عملية توحيد تصميم قاعدة البيانات من توافق الكيانات المقترحة للنموذج الموحَّد المطلوب قب ل‬
‫إنشاء بُنى الجدول‪.‬‬

‫ُص ِّممت العديد من قواعد البيانات واقع ًيا بصورة غير س ليمة‪ ،‬أو ُأث ِق ل كاهله ا بح الات ش اذة عن د تع ديلها‬
‫بصورة غير سليمة خلال فترة زمنية‪.‬‬

‫‪103‬‬

‫تصميم قواعد البيانات‬ ‫فهم عملية التوحيد ‪Normalization‬‬

‫قد يُطلب منك إعادة تصميم قواعد البيانات الحالية‪ ،‬وتع ديلها‪ ،‬كم ا يمكن أن يك ون ذل ك مهم ًة كب ير ًة إذا‬
‫أجريت عملية التوحيد على الجداول بصور ٍة غير صحيحة‪.‬‬

‫‪ 10.8‬المصطلحات الأساسية والاختصارات‬

‫• نموذج بويس‪-‬كود المو َّحد ‪ Boyce-Codd normal form‬أو ‪ :BCNF‬وه و حال ة خاص ة من نم وذج‬
‫‪.3NF‬‬

‫• النموذج الموحَّد الأول ‪ first normal form‬أو ‪ :1NF‬يُسمح بقيم غير مك ررة فق ط عن د تق اطع ك ل‬
‫صف وعمود‪ ،‬لذلك لا توجد مجموعات مكرَّرة‪.‬‬

‫• التوحيد ‪ :normalization‬عملية تحديد مقدار التكرار الموجود في الجدول‪.‬‬
‫• النموذج الموحَّد الثاني ‪ second normal form‬أو ‪ :2NF‬يجب أن يكون للعلاقة صيغة نموذج ‪،1NF‬‬

‫كما يجب اشتمال المفتاح الرئيسي ‪ PK‬على سم ٍة واحدة‪.‬‬
‫• القواعد الدلالية ‪ :semantic rules‬قواعد العمل المط َّبقة على قاعدة البيانات‪.‬‬
‫• النموذج المو َّحد الثالث ‪ third normal form‬أو ‪ :3NF‬يجب أن يكون للعلاقة ص يغة نم وذج ‪،2NF‬‬
‫كما يجب إزالة جميع الاعتماديات المتع ِّدي ة ‪ ،transitive dependencies‬فق د لا تعتم د الس مة ال تي‬
‫ليست مفتا ًحا ‪ non-key attribute‬اعتما ًدا وظيف ًيا على سمة أخرى ليست مفتاحًا أي ًضا‪.‬‬

‫‪ 10.9‬تمارين‬

‫‪ .1‬ما هو التوحيد ‪normalization‬؟‬
‫‪ .2‬متى يكون جدول ما في نموذج ‪1NF‬؟‬
‫‪ .3‬متى يكون جدول ما في نموذج ‪2NF‬؟‬
‫‪ .4‬متى يكون جدول ما في نموذج ‪3NF‬؟‬
‫‪ .5‬عرِّف وناقش كل من الاعتماديات المشار إليها في مخطط الاعتمادية المو َّضح في الشكل التالي‪:‬‬

‫‪104‬‬

‫تصميم قواعد البيانات‬ ‫فهم عملية التوحيد ‪Normalization‬‬

‫‪ .6‬تستخدم كل ّية جامعية ‪ college‬جديدة بنية الجدول المو َّضحة في الج دول الت الي‪ ،‬وذل ك لتتب ع الطلاب‬
‫والمقرَّرات‪ ،‬وبالتالي‪ ،‬ارسم مخطط الاعتمادية لهذا الجدول‪.‬‬

‫‪Attribute Name‬‬ ‫‪Sample Value‬‬ ‫‪Sample Value‬‬ ‫‪Sample Value‬‬
‫‪2‬‬ ‫‪3‬‬
‫‪StudentID‬‬ ‫‪1‬‬ ‫‪Sandy Law‬‬ ‫‪Sue Rogers‬‬
‫‪2‬‬ ‫‪3‬‬
‫‪StudentName John Smith‬‬ ‫‪Programming Level 1‬‬ ‫‪Business‬‬
‫‪61%‬‬ ‫‪81%‬‬
‫‪CourselD‬‬ ‫‪2‬‬ ‫‪Jan 5th, 2014‬‬ ‫‪Jan 7th, 2014‬‬

‫‪CourseName Programming Level 1‬‬

‫‪Grade‬‬ ‫‪75%‬‬

‫‪CourseDate‬‬ ‫‪Jan 5th, 2014‬‬

‫‪ .7‬اع رض الج داول بص يغة النم وذج الموحَّد الث الث ال تي ستنش ئها لإص لاح المش كلات ال تي واجهته ا‬
‫باستخدام مخطط الاعتمادية الذي رسمته للتو‪ ،‬ثم ارسم مخطط الاعتمادية للجدول الثابت‪.‬‬

‫‪ .8‬توفر الوكالة التي تس مى ‪ Instant Cover‬م وظ ِفين ب دوام ج زئي أو م ؤقت للفن ادق في اس كتلندا‪ ،‬إذ‬
‫يو ِّضح الشكل الآتي الوقت الذي يقضيه موظفو الوكالة في العمل في فنادق مختلف ة‪ ،‬حيث يك ون رقم‬

‫التأمين الوطني ‪- NIN‬أي ‪ -national insurance number‬فري ًدا لكل موظف‪.‬‬

‫استخدم الجدول التالي للإجابة على السؤالين الآتيين‪:‬‬

‫‪NIN‬‬ ‫‪ContractNo‬‬ ‫‪Hours‬‬ ‫‪eName‬‬ ‫‪hNo‬‬ ‫‪hLoc‬‬
‫‪1135‬‬ ‫‪Smith J.‬‬ ‫‪H25‬‬ ‫‪East Killbride‬‬
‫‪C1024‬‬ ‫‪16‬‬

‫‪1057‬‬ ‫‪C1024‬‬ ‫‪24‬‬ ‫‪Hocine D.‬‬ ‫‪H25‬‬ ‫‪East Killbride‬‬

‫‪1068‬‬ ‫‪C1025‬‬ ‫‪28‬‬ ‫‪White T.‬‬ ‫‪H4‬‬ ‫‪Glasgow‬‬
‫‪1135‬‬ ‫‪C1025‬‬ ‫‪15‬‬ ‫‪Smith J.‬‬ ‫‪H4‬‬ ‫‪Glasgow‬‬

‫‪ .1‬هذا الج دول عرض ة لح الات تح ديث ش اذة ل ذا ق ّدم أمثل ًة على ح الات ش اذة للإدخ ال والح ذف‬

‫والتحديث‪.‬‬

‫‪َ .2‬ط ّبق عملية التوحيد على هذا الجدول ليصبح له صيغة النموذج الموحّد الثالث‪ ،‬م ع التأك د من ذك ر‬
‫أي افتراضات‪.‬‬

‫‪ .9‬املأ الفراغات‪:‬‬

‫◦ ينتج عن ______ نموذجًا موحّ ًدا أقل‪.‬‬
‫◦ تسمى السمة التي تح ِّدد قيمتها قي ًما أخرى داخل صف ______‪.‬‬

‫◦ السمة التي لا يمكن تقسيمها توصف بأنها ______‪.‬‬

‫‪105‬‬

‫تصميم قواعد البيانات‬ ‫فهم عملية التوحيد ‪Normalization‬‬

‫◦ يشير _______ إلى مستوى التفاصيل الذي تم ِّثله القيم المخزَّنة في صف الجدول‪.‬‬
‫◦ يجب ألا يحتوي الجدول العلائقي على مجموعات ________‪.‬‬

‫‪106‬‬

‫‪ .11‬عملية تطوير قواعد البيانات‬

‫يتمثل أحد الجوانب الأساسية لهندسة البرمجي ات في تقس يم عملي ة التط وير إلى سلس لة من المراح ل أو‬
‫الخطوات‪ ،‬حيث تر ِّكز كل مرحلة منها على جانب واحد من جوانب التطوير‪.‬‬

‫يشار أحيانًا إلى مجموعة هذه الخطوات بدورة حياة تطوير البرمجيات ‪- software development life cycle‬‬
‫أو ‪ SDLC‬اختصا ًرا‪ ،‬حيث ينتقل المنتج البرمجي عبر مراحل دورة الحياة ه ذه ‪-‬في بعض الأحي ان بص ورة متك ررة‬
‫أثناء ضبطه أو إعادة تطويره‪ -‬حتى يتوقف استخدامه في النهاية‪ ،‬كما يمكن التحقق من كل مرحلة في دورة الحياة‬

‫للتأكد من صحتها قبل الانتقال إلى المرحلة التالية في الحالة المثالية‪.‬‬

‫‪ 11.1‬دورة حياة تطوير البرمجيات ‪ -‬نموذج الشلال ‪Waterfall‬‬

‫لنبدأ بإلقاء نظرة عامة على نموذج الشلال ‪ waterfall model‬الذي هو أحد نماذج تمثي ل دورة حي اة عملي ة‬
‫تطوير البرمجيات ‪ Software Development Life Cycle‬كما ستجده في معظم كتب هندسة البرمجيات‪.‬‬

‫يوضح هذا الشكل الشلالي الموجود في الشكل الآتي نموذج شلال عام يمكن تطبيقه على أية عملي ة تط وير‬
‫لنظام حاسوبي‪ ،‬حيث يُظ ِهر هذا النموذج العملية على أساس تسلسل صارم من الخطوات بأن يكون خ رج خط وة‬

‫واحدة دخاًل للخطوة التالية‪ ،‬كما يجب إكمال كل خطوة قبل الانتقال إلى الخطوة التالية‪.‬‬

‫تصميم قواعد البيانات‬ ‫عملية تطوير قواعد البيانات‬

‫يمكننا استخدام عملية نم وذج الش لال على أس اس وس يلة لتحدي د المه ام المطلوب ة م ع دخ ل وخ رج كل‬
‫نشاط ‪ ،activity‬إذ المهم هنا هو مجالات الأنشطة التي يمكن تلخيصها على النحو التالي‪:‬‬

‫• تتض من مرحل ة إنشاء المتطلب‪W‬ات ‪ Establishing requirements‬التش اور والاتف اق م ع أص حاب‬
‫المصلحة حول ما يريدونه ويحتاجون إلي ه من النظ ام‪ ،‬وال تي يُع َّبر عنه ا بم ا يس َّمى وثيق ة المتطلب ات‬

‫وباللغة الإنجليزية ‪.statement of requirements‬‬

‫‪108‬‬

‫تصميم قواعد البيانات‬ ‫عملية تطوير قواعد البيانات‬

‫تبدأ مرحلة التحليل ‪ Analysis‬بالنظر في وثيقة المتطلب ات وتنتهي من خلال إنت اج مواص فات النظ ام‬ ‫•‬
‫‪ ،system specification‬حيث تُ َع ّد المواصفات تمثياًل رسم ًيا لما يجب على النظ ام فعل ه‪ ،‬ويُع َّبر عنه ا‬

‫بعبارات مستقلة عن كيفية تطبيقها‪.‬‬

‫• تبدأ مرحلة التصميم ‪ Design‬بمواصفات النظام وينتج عنها وثائق التصميم‪ ،‬كم ا تق ِّدم ه ذه المرحل ة‬
‫وص ًفا تفصيل ًيا لكيفية بناء النظام‪.‬‬

‫• مرحلة التطبيق ‪ Implementation‬هي بناء نظام حاسوبي وف ًقا لوثيقة تصميم معينة مع مراعاة البيئة‬
‫التي سيعمل فيها النظام‪ ،‬مثل العتاد‪ ،‬والبرمجيات المتاحة للتطوير؛ كما ق د تُن َّفذ مرحل ة التط بيق على‬

‫مراحل باستخدام نظام أولي يمكن التحقق من صحته واختباره قبل إصدار النظام النهائي للاستخدام‪.‬‬

‫• توازن مرحلة الاختبار ‪ Testing‬النظام ال ُمط َّبق مع وثائق التصميم ومواصفات المتطلب ات‪ ،‬وتنتج ه ذه‬
‫المرحلة تقرير قبول‪ ،‬أو قائم ًة بالأخطاء والزلات البرمجية ‪ bugs‬التي تتطلب مراجع ة عملي ات التحلي ل‪،‬‬
‫والتصميم‪ ،‬والتطبيق لتصحيحها‪ ،‬أي تُ َع ّد مرحل ة الاختب ار ع اد ًة ال َمهم ة ال تي ت ؤدي إلى تك رار نم وذج‬

‫الشلال خلال دورة الحياة‪.‬‬

‫• تتضمن مرحلة الصيانة ‪ Maintenance‬التعامل مع تغ يرات المتطلب ات‪ ،‬أو بيئ ة التط بيق‪ ،‬أو إص لاح‬
‫الزلات البرمجية‪ ،‬أو نقل النظام إلى بيئات جديدة مثل ترحيل نظام من حاسوب مستقل إلى محطة عمل‬
‫يونكس أو بيئة متصلة بالشبكة‪ ،‬كما سيعاد النظر في دورة حياة الش لال بص ورة متك ررة بس بب احت واء‬
‫مرحلة الصيانة على تحليل التغيرات المطلوبة‪ ،‬وتصميم حل‪ ،‬وتطبيق ه‪ ،‬واختب اره على م دى حي اة نظ ام‬

‫برمجي جرت صيانته‪.‬‬

‫‪ 11.2‬دورة حياة قاعدة البيانات ‪Database Life Cycle‬‬

‫نس تطيع اس تخدام دورة الش لال مث ل أس اس لنم وذج تط وير قاع دة البيان ات ال ذي يتض من ثلاثة‬
‫افتراضات هي‪:‬‬

‫‪ .1‬يمكننا فصل تطوير قاعدة البيانات عن عمليات المس تخدم ال تي تس تخدم قاع دة البيان ات‪ ،‬أي تحدي د‬
‫وإنشاء تخطيط ‪ schema‬لتعريف البيانات في قاعدة البيانات‪.‬‬

‫‪ .2‬يمكنن ا اس تخدام معماري ة التخطيط ات الثلاث ة ‪ three-schema architecture‬مث ل أس اس لتمي يز‬
‫الأنشطة المرتبطة بالتخطيط‪.‬‬

‫‪ .3‬يمكننا تمثيل القيود ‪ constraints‬لفرض دلالات ‪ semantics‬البيانات م ر ًة واح د ًة في قاع دة البيان ات‬
‫عو ًضا عن فرضها على كل عملية مستخ ِدم تستخ ِدم البيانات‪.‬‬

‫‪109‬‬

‫تصميم قواعد البيانات‬ ‫عملية تطوير قواعد البيانات‬

‫يمكننا باستخدام هذه الافتراضات والشكل السابق رؤية أ ّن ه ذا المخط ط يم ِّثل نموذجً ا للأنش طة وخرجه ا‬
‫لتطوير قاعدة البيانات‪ ،‬فهذا المخطط ليس قاباًل للتطبيق على النهج العلائقي فقط وإنم ا يُط َّبق على أي ة ص نف‬

‫‪ class‬من نظم إدارة قواعد البيانات ‪ DBMS‬أي ًضا‪.‬‬
‫يُ َع ّد تطوير تطبيقات قواعد البيانات عملي ًة للحص ول على متطلب ات الع الم الحقيقي ‪ ،real-world‬وتحلي ل‬

‫المتطلبات‪ ،‬وتصميم البيانات ووظائف النظام‪ ،‬ثم تطبيق العمليات في النظام‪.‬‬

‫‪110‬‬

‫تصميم قواعد البيانات‬ ‫عملية تطوير قواعد البيانات‬

‫‪ 11.3‬جمع المتطلبات ‪Requirements Gathering‬‬

‫تُ َع ّد مرحل ة جم ع المتطلب ات ‪ requirements gathering‬الخط وة الأولى في نم وذج الش لال‪ ،‬ويجب على‬
‫مصممي قاعدة البيانات خلال هذه الخط وة إج راء مق ابلات م ع العملاء ‪-‬أي مس تخدمي قاع دة البيان ات‪ -‬لفهم‬
‫النظام المقترح والحصول على البيانات والمتطلبات الوظيفية‪ ،‬وتوثيقها‪ ،‬كم ا تك ون نتيج ة ه ذه الخط وة وثيق ًة‬

‫تتضمن المتطلبات التفصيلية التي قدمها المستخ ِدمون‪.‬‬

‫تتضمن مرحلة إنشاء المتطلبات ‪ Establishing requirements‬التشاور والاتفاق بين جميع المس تخ ِدمين‬
‫بشأن البيان ات الثابت ة ‪ persistent data‬ال تي يرغب ون في تخزينه ا م ع الاتف اق على مع نى عناص ر البيان ات‬
‫وتفسيرها‪ ،‬كما يلعب مسؤول البيانات دو ًرا رئيس ًيا في هذه العملية لأنه يستعرِض القضايا التجارية‪ ،‬والقانوني ة‪،‬‬

‫والأخلاقية داخل المؤسسة التي تؤثِّر على متطلبات البيانات‪.‬‬

‫تُس تخ َدم وثيق ة متطلب ات البيان ات ‪ data requirements document‬لتأكي د فهم المتطلب ات م ع‬
‫المستخ ِدمين‪ ،‬فلا ينبغي أن تكون رسمي ًة أو مشفر ًة بمستوى عا ٍل لضمان سهولة فهمها‪.‬‬

‫يجب أن تق ِّدم هذه الوثيق ة ملخ ًص ا م وجزًا لمتطلب ات جمي ع المس تخ ِدمين ‪-‬أي ليس مج رد مجموع ة من‬
‫الأفراد فقط‪ ،-‬وذلك لأ ّن الهدف هو تطوير قاعدة بيانات مشتركة واحدة‪.‬‬

‫يجب ألا ت ِصف المتطلبات كيفية معالجة البيانات‪ ،‬بل تصف عناصر البيانات‪ ،‬وال ِس مات ‪ attributes‬ال تي‬
‫تمتلكها‪ ،‬والقيود المط َّبقة‪ ،‬والعلاقات التي تربط بين عناصر البيانات‪.‬‬

‫‪ 11.4‬التحليل ‪Analysis‬‬

‫تب دأ مرحل ة تحلي ل البيان ات ‪ Data analysis‬بوثيق ة متطلب ات البيان ات‪ ،‬ثم ينتج عنه ا نم وذج بيان ات‬
‫مفاهيمي ‪ .conceptual data model‬الهدف من التحليل ه و الحص ول على وص ف تفص يلي للبيان ات ال تي‬
‫ستناسب متطلبات المستخ ِدم‪ ،‬بحيث يجري التعامل مع خصائص البيانات ذات المس توى الع الي والمنخفض‬
‫واستخدامها‪ .‬تتضمن هذه الخصائص المجال المحتمل من القيم التي يمكن الس ماح به ا للس مات‪ ،‬مث ل‪ :‬رم ز‬
‫مقررات الطالب ‪ ،student course code‬وعنوان المق رر ‪ ،course title‬ونق اط الائتم ان ‪ credit points‬في‬

‫قاعدة بيانات المدرسة على سبيل المثال‪.‬‬

‫يو ِّفر نموذج البيانات المفاهيمي تمثياًل رسم ًيا مشتر ًكا لما يجري توصيله بين العملاء والمطورين أثناء تط وير‬
‫قاعدة البيانات‪ ،‬فهذا النموذج يركز على البيانات في قاعدة البيان ات‪ ،‬بغض النظ ر عن الاس تخدام النه ائي لتل ك‬
‫البيانات في عمليات المستخ ِدم‪ ،‬أو تطبيق البيانات في بيئ ات حاس وبية مح َّددة‪ ،‬ل ذلك يهتم نم وذج البيان ات‬

‫المفاهيمي بمعنى البيانات وبنيتها‪ ،‬وليس بالتفاصيل التي تؤثر على كيفية تطبيقها‪.‬‬

‫إ ًذا يُ َع ّد نموذج البيانات المفاهيمي تمثياًل رسم ًيا للبيانات التي يجب أن تحتويه ا قاع دة البيان ات‪ ،‬والقي ود‬
‫التي يجب على البيانات تلبيتها‪ ،‬كما يجب التعب ير عن ذل ك بمص طلحات مس تقلة عن كيفي ة تنفي ذ النم وذج‪،‬‬

‫‪111‬‬

‫تصميم قواعد البيانات‬ ‫عملية تطوير قواعد البيانات‬

‫لذلك ير ِّكز التحليل على الأسئلة التي تحتوي عبارات مث ل عب ارة "م ا ه و المطل وب؟" وليس على الأس ئلة ال تي‬
‫تحتوي عبارات مثل عبارة "كيف يتحقق ذلك؟"‪.‬‬

‫‪ 11.5‬التصميم المنطقي ‪Logical Design‬‬

‫تب دأ مرحل ة تص ميم قاع دة البيان ات بنم وذج بيان ات مف اهيمي وينتج عنه ا مواص فات التخطيط‬
‫المنطقي ‪ logical schema‬الذي سيح ِّدد نوع نظام قاعدة البيانات المطلوب ‪-‬أي سيحدد إن كان من نوع شبكي‪،‬‬

‫أو علائقي‪ ،‬أو كائني التوجه‪.-‬‬

‫لا يزال التمثيل العلائقي ‪ relational representation‬مستقاًل عن أي نظ ام إدارة قواع د البيان ات ‪،DBMS‬‬
‫فهو نموذج بيانات مفاهيمي آخر‪.‬‬

‫يمكننا استخدام التمثيل العلائقي لنموذج البيانات المفاهيمي على أساس دخ ٍل لعملية التصميم المنطقي‪،‬‬
‫وخرج هذه المرحلة هو مواصفات علائقية مف َّص لة أي تخطي ط منطقي لجمي ع الج داول والقي ود اللازم ة لتلبي ة‬

‫وصف البيانات في نموذج البيانات المفاهيمي‪.‬‬

‫تُخت ار الج داول الأك ثر ملاءم ة أثن اء نش اط التص ميم لتمثي ل البيان ات في قاع دة بيان ات‪،‬‬
‫ولكن يجب أخذ هذه الاختيارات في الحسبان معايير التصميم المختلفة بما في ذل ك على س بيل المث ال مرون ة‬
‫التغي ير‪ ،‬والتحكم في التض اعف أو الاستنس اخ ‪ ،duplication‬وأفض ل طريق ة لتمثي ل القي ود‪.‬‬

‫تح ِّدد الجداول المح َّددة بالتخطيط المنطقي البيانات المخزَّنة وكيفية معالجتها في قاعدة البيانات‪.‬‬

‫يتجه مصممو قواعد البيانات المل ّمون بقواعد البيانات العلائقية ولغة الاس تعلامات الهيكلي ة ‪ SQL‬لل ذهاب‬
‫مباشر ًة إلى مرحلة التطبيق بعد إنتاج نموذج البيانات المفاهيمي لكن لا يؤدي مثل هذا التحول المباشر للتمثي ل‬
‫العلائقي إلى ج داول ‪ SQL‬بالض رورة إلى قاع دة بيان ات تحت وي على جمي ع الخص ائص المرغوب ة مثل‬
‫الكم ال ‪ completeness‬والس لامة ‪ integrity‬والمرون ة ‪ flexibility‬والكف اءة ‪ efficiency‬وقابلية‬
‫الاستخدام ‪ ،usability‬إذ يُ َع ّد نموذج البيانات المفاهيمي الجيد خطو ًة أولى أساسية نحو قاع دة بيان ات له ا ه ذه‬

‫الخصائص‪ ،‬لكن لا يعني هذا أ ّن التحول المباشر إلى جداول ‪ SQL‬ينتج قاعدة بيانات جيدة تلقائ ًيا‪.‬‬

‫ستمثل هذه الخطوة الأولى بدقة الجداول والقيود اللازمة لتلبية وصف نموذج البيانات المفاهيمي‪ ،‬وبالت الي‬
‫ستلبي متطلبات الكمال والسلامة‪ ،‬ولكنها قد تكون غير مرنة‪ ،‬أو قد تق ِّدم قابلية اس تخدام ض عيفة‪ ،‬يُث َنى ‪flexed‬‬
‫التصميم الأول بعد ذلك لتحسين جودة تصميم قاعدة البيانات‪ ،‬ويهدف مصطلح الثني ‪ Flexing‬إلى أخذ الأفك ار‬
‫المتزامنة من شيء مثني لغ رض مختل ف وتش ذيب ج وانب من ه ذا الش يء‪ -‬أي الوص ول إلى الغاي ة نفس ها‬

‫بطريقة وفكرة أخرى تحقق المقصود‪.-‬‬

‫يلخص الش كل الآتي الخط وات التكراري ة الموج ودة في تص ميم قاع دة البيان ات بن ا ًء على النظ رة العام ة‬
‫المق َّدمة‪ ،‬كما يكون الغرض الرئيسي من هذا الشكل هو التمييز بين الهدف العام للجداول التي يجب استخدامها‬
‫عن التعريف المف َّصل للأجزاء المك ِّونة لكل جدول‪ ،‬حيث تُد َرس هذه الج داول واح ًدا تل و الآخ ر رغم أنه ا ليس ت‬

‫‪112‬‬

‫تصميم قواعد البيانات‬ ‫عملية تطوير قواعد البيانات‬

‫مست ِقل ًة عن بعضها البعض‪ ،‬كما سيؤدي كل تكرار يتض ّمن مراجع ًة للجداول إلى تص ميم جدي د‪ ،‬ويش ار إلى ه ذه‬
‫التصاميم الجديدة م ًعا باسم تصاميم القط ع الث اني ‪ second-cut designs‬ح تى ل و تك ررت العملي ة لأك ثر من‬

‫حلق ٍة واحدة‪.‬‬

‫أواًل ‪ ،‬ليس من الضروري تلبي ة جمي ع متطلب ات المس تخدم ال تي يمثله ا نم وذج بيان ات مف اهيمي معين‬
‫بواسطة قاعدة بيانات واحدة‪ ،‬كما يوجد أسباب مختلفة لتطوير أكثر من قاعدة بيان ات‪ ،‬مث ل‪ :‬الحاج ة إلى عملي ة‬
‫مست ِقلة في مواقع مختلفة‪ ،‬أو التحكم الإداري ببيانات قواعد البيانات‪ ،‬لكن إذا احتوت مجموعة قواع د البيان ات‬
‫على بيانات مضا َعفة وكان المستخ ِدمون بحاجة للوصول إلى البيانات في أكثر من قاعدة بيانات‪ ،‬فهناك أس باب‬
‫محتمل ة لتل ّبِي قاع دة بيان ات واح دة متطلب ات متع ددة‪ ،‬وإلا فيجب فحص المش اكل المتعلق ة بمض ا َعفة‬

‫البيانات وتوزيعها‪.‬‬

‫ثان ًيا‪ ،‬أحد الافتراضات حول تطوير قاعدة البيانات ه و أن ه يمكنن ا فص ل تط وير قاع دة البيان ات عن تط وير‬
‫عمليات المستخدم التي تستفيد منها‪ ،‬ويستند ذلك إلى تو ّقع تحديد جميع البيانات المطلوبة بواس طة عملي ات‬
‫المستخ ِدم المح َّددة حال ًيا‪ ،‬وإمكانية الوص ول إليه ا بمج رد تط بيق قاع دة البيان ات‪ ،‬لكنن ا نطلب أي ًض ا المرون ة‬
‫للسماح بتلبية تغيرات المتطلب ات المس تقبلية‪ ،‬كم ا يمكن التنب ؤ بالطلب ات الش ائعة ال تي س ُتق َّدم إلى قاع دة‬

‫البيانات عند تطوير قاعدة بيانات لبعض التطبيقات‪ ،‬وبالتالي يمكننا تحسين تصميمنا للطلبات الأكثر شيو ًعا‪.‬‬

‫ثال ًثا‪ ،‬تعتمد العديد من جوانب تصميم قاعدة البيان ات وتطبيقه ا في المس توى التفص يلي على نظ ام إدارة‬
‫قاعدة البيانات ‪ DBMS‬المستخ َدم‪ ،‬فإذا كان اختيار نظام إدارة قواعد البيانات ثاب ًتا أو ُأجرِي قبل مهم ة التص ميم‪،‬‬
‫فيمكن استخدام هذا الاختيار لتحديد مع ايير التص ميم ب داًل من الانتظ ار ح تى مرحل ة التط بيق‪ ،‬أي يمكن دمج‬

‫‪113‬‬

‫تصميم قواعد البيانات‬ ‫عملية تطوير قواعد البيانات‬

‫قرارات التصميم لنظام إدارة قاعدة البيانات ‪ DBMS‬معين عو ًضا عن إنتاج تصميم عام‪ ،‬ثم تكييفه مع نظ ام إدارة‬
‫قاعدة البيانات ‪ DBMS‬أثناء التطبيق‪.‬‬

‫ليس غري ًبا العثور على تصميم مفرد لا يمكنه تلبية جميع خصائص قاعدة البيانات الجيدة في الوقت نفسه‪،‬‬
‫ل ذلك من المهم أن يعطي المص مم الأولوي ة له ذه الخص ائص‪ ،‬ويك ون ذل ك ع اد ًة باس تخدام معلوم ات من‬
‫مواصفات المتطلبات‪ ،‬مثل‪ :‬تحديد ما إذا كانت السلامة أهم من الكفاءة‪ ،‬وما إذا كانت قابلية الاستخدام أهم من‬

‫المرونة في تطوير مع َّين‪.‬‬

‫ستح ِّدد تعليمات لغة تعريف البيانات ‪- data definition language‬أو ‪ DDL‬اختصا ًرا‪ -‬الخاص ة بلغ ة ‪SQL‬‬
‫التخطيط المنطقي في نهاية مرحلة التصميم‪ ،‬حيث تصف لغة ‪ DDL‬قاعدة البيانات ال تي يجب تطبيقه ا لتلبي ة‬

‫متطلبات المستخ ِدم‪.‬‬

‫‪ 11.6‬التطبيق ‪Implementation‬‬

‫تتض من مرحل ة التنفي ذ أو التط بيق ‪ Implementation‬بن اء قاع دة بيان ات وف ًق ا لمواص فات التخطي ط‬
‫المنطقي‪ ،‬والذي سيتض ّمن مواصفات تخطيط التخزين ‪ storage schema‬المناسب‪ ،‬وفرض الأمان‪ ،‬والتخطيط‬
‫الخارجي‪ ،‬وما إلى ذل ك‪ ،‬كم ا يت أثر التط بيق بش دة باختي ار نظم إدارة قواع د البيان ات المتاح ة‪ ،‬وأدوات قواع د‬

‫البيانات‪ ،‬وبيئة التشغيل‪.‬‬

‫هناك مهام إضافية تتجاوز مجرد إنشاء تخطيط قاعدة بيانات ‪ database schema‬وتطبيق القيود‪ ،‬إذ يجب‬
‫إدخال البيانات في الجداول‪ ،‬ومعالجة القض ايا المتعلق ة بالمس تخ ِدمين وعملي ات المس تخ ِدم‪ ،‬كم ا يجب دعم‬

‫الأنشطة الإدارية المرتبطة بالجوانب الأوسع لإدارة بيانات الشركة‪.‬‬

‫نريد معالجة أكبر عدد ممكن من هذه القضايا المو َّضحة أدناه داخل نظام إدارة قواعد البيانات تماش ًيا مع نهج‬
‫نظم إدارة قواعد البيانات‪.‬‬

‫يتطلب تط بيق التخطي ط المنطقي عمل ًي ا في نظ ام إدارة قواع د البيان ات ‪ DBMS‬معرف ًة مفص ل ًة للغاي ة‬
‫بالميزات والفوائد المحددة التي يجب تقديمها من ِق َبل نظام إدارة قواعد البيانات‪.‬‬

‫ستشمل المرحلة الأولى من التطبيق انس جا َم متطلب ات التص ميم م ع أفض ل أدوات التط بيق المتاح ة ثم‬
‫استخدام تلك الأدوات للتطبيق‪ ،‬وذلك مثال ًيا وتماش ًيا مع الممارسة الجيدة لهندسة البرمجيات‪ ،‬كما قد يتض من‬
‫ذلك في قواعد البيانات على اختيار منتجات البائ ِعين ذات متغيرات من نظام إدارة قواعد البيانات ‪ DBMS‬ولغ ة‬
‫‪ SQL‬الأكثر ملاءمة لقاعدة البيانات التي نحتاج إلى تطبيقها‪ ،‬لكننا لا نعيش في عالم مثالي‪ ،‬كما س ُتتخَذ في كث ير‬
‫من الأحيان قرارات اختيار العتاد والقرارات المتعلقة بنظام إدارة قواعد البيان ات ‪ DBMS‬قب ل النظ ر في تص ميم‬
‫قاعدة البيانات بوقت طويل‪ ،‬وبالتالي‪ ،‬يمكن أن يتضمن التطبيق ثن ًيا إضاف ًيا للتصميم للتغلب على مح دوديات‬

‫البرمجيات أو العتاد‪.‬‬

‫‪114‬‬

‫تصميم قواعد البيانات‬ ‫عملية تطوير قواعد البيانات‬

‫‪ 11.7‬تحقيق التصميم ‪Realizing the Design‬‬

‫نحتاج إلى إنشاء قاعدة بياناتنا بعد إنشاء التصميم المنطقي وف ًقا للتعريفات التي أنتجناه ا‪ ،‬كم ا يُحت َم ل أن‬
‫يتضمن التطبيق مع نظام إدارة قواعد البيانات ‪ DBMS‬العلائقي استخدام لغة ‪ SQL‬لإنش اء ج داول وقي ود تل بي‬
‫وصف التخطيط المنطقي واختيار تخطيط التخزين المناسب ‪-‬إذا كان نظام إدارة قواع د البيان ات ‪ DBMS‬يس مح‬

‫بهذا المستوى من التحكم‪.‬‬

‫تتمثل إحدى طرق تحقيق ذلك في كتابة تعليم ات لغ ة ‪ SQL DDL‬المناس بة في مل ف يمكن لنظ ام إدارة‬
‫قواعد البيانات ‪ DBMS‬تنفيذه‪ ،‬بحيث يكون هناك سجل مس تقل أو مل ف نص ي من تعليم ات لغ ة ‪ SQL‬ال تي‬
‫تع رِّف قاع دة البيان ات؛ أم ا الطريق ة الأخ رى فهي العم ل تفاعل ًي ا باس تخدام أداة قاع دة بيان ات مثل‬

‫الأداتين ‪ SQL Server Management Studio‬أو ‪.Microsoft Access‬‬

‫مهما كانت الآلية المستخ َدمة لتطبيق التخطيط المنطقي‪ ،‬فالنتيج ة هي أن قاع دة البيان ات ‪-‬م ع الج داول‬
‫والقيود‪ -‬معرَّفة ولكنها لن تحتوي على بيانات لعمليات المستخ ِدم‪.‬‬

‫‪ 11.8‬ملء قاعدة البيانات ‪Populating the Database‬‬

‫يوجد طريقتان لملء الج داول بع د إنش اء قاع دة البيان ات؛ إم ا من بيان ات موج ودة أو من خلال اس تخدام‬
‫تطبيقات المستخ ِدم المط َّورة لقاعدة البيانات‪.‬‬

‫قد تكون هناك بيانات موجودة من قاعدة بيانات أو ملف ات بيان ات أخ رى وذل ك بالنس بة لبعض الج داول‬
‫فمثاًل نتوقع عند إنشاء قاعدة بيانات لمستشفى وجود بعض السجلات بالفعل لجميع الموظفين المراد تضمينهم‬
‫في قاعدة البيانات‪ ،‬كما يمكن أي ًضا إحضار البيانات من وكالة خارجية مث ل ق وائم العن اوين ال تي تُجلَب بص ورة‬
‫متكررة من شركات خارجية أو يمكن إنتاجها أثناء مهمة إدخ ال بيان ات كب يرة ‪-‬أي يمكن إج راء تحوي ل الس جلات‬
‫اليدوية المطبوعة إلى ملفات حاسوبية بواسطة وكالة إدخال بيانات‪ -‬ويُ َع ّد استخدام وس ائل الاس تيراد والتص دير‬

‫الموجودة في نظام إدارة قواعد البيانات ‪ DBMS‬أبسط طريقة لملء قاعدة البيانات في مثل هذه الحالات‪.‬‬

‫تتوفر عاد ًة وسائل لاستيراد وتصدير البيانات بتنسيقات قياسية مختلفة‪ ،‬وتُع َرف ه ذه الوظ ائف أي ًض ا في‬
‫بعض الأنظمة باسم تحميل ‪ loading‬البيانات وتفريغه ا ‪ ،unloading‬كم ا ي تيح الاس تيراد إمكاني ة نس خ مل ف‬

‫البيانات مباشر ًة إلى جدول‪.‬‬

‫إذا جرى الاحتفاظ بالبيانات بتنسيق ملف غير مناس ب لاس تخدام عملي ة الاس تيراد‪ ،‬فيجب إع داد برن امج‬
‫تطبيقي يق رأ البيان ات القديم ة‪ ،‬ويح ّوله ا حس ب الض رورة‪ ،‬ثم ي دخلها في قاع دة البيان ات باس تخدام ش يفرة‬

‫لغة ‪ SQL‬الذي ُأنت ِجت خصي ًصا من أجل هذا الهدف‪.‬‬

‫‪115‬‬

‫تصميم قواعد البيانات‬ ‫عملية تطوير قواعد البيانات‬

‫يُس ّمى نقل كمي ات كب يرة من البيان ات الموج ودة إلى قاع دة بيان ات بالتحمي ل المج َّمع ‪ ،bulk load‬وق د‬
‫يتضمن التحميل المج َّمع للبيانات كميات كبير ًة ج ًدا من البيانات ال ُمح َّملة أي تحمي ل ج دول في نفس ال وقت‪،‬‬

‫لذلك قد تجد وسائل في نظام إدارة قواعد البيانات ‪ DBMS‬لتأجيل فحص قيد حتى نهاية التحميل المج َّمع‪.‬‬

‫‪ 11.9‬إرشادات لتطوير مخطط ‪ER‬‬

‫لاحظ أن هذه الإرش ادات العام ة ستس اعد في تط وير أس اس ق وي لتص ميم قاع دة البيان ات الفعلي ة أي‬
‫النموذج المنطقي‪:‬‬

‫‪ .1‬وثّق جميع الكيانات المكت َشفة خلال مرحلة جمع المعلومات‪.‬‬
‫‪ .2‬وثّق جميع السمات التي تنتمي إلى كل كيان‪ ،‬وح ّدد المف اتيح المر َّش حة ‪ ،candidate keys‬والمف اتيح‬
‫الرئيس ية ‪ ،primary keys‬كم ا تأك د من اعتمادي ة جمي ع الس مات ال تي ليس ت‬

‫مفاتيح ‪ non-key attributes‬لكل كيان بصورة كاملة على المفتاح الرئيسي‪.‬‬
‫‪ .3‬ط ِّور مخطط ‪ ER‬الأولي وراجعه مع الأشخاص المناسبين‪ ،‬وتذ َّكر أن هذه عملية تكرارية‪.‬‬
‫‪ .4‬أن ِشئ كيانات ‪-‬أي جداول‪ -‬جديدة للسمات متعددة القيم والمجموعات المكرَّرة‪ ،‬ثم ض ِّمن هذه الكيانات‪-‬‬

‫أي الجداول‪ -‬الجديدة في مخطط ‪ ،ER‬وراجع ذلك مع الأشخاص المناسبين‪.‬‬
‫‪ .5‬تح َّقق من نمذجة الكيان العلائقي ‪ ER‬عبر تطبيق عملية التوحيد ‪ normalizing‬على الجداول‪.‬‬

‫‪ 11.10‬مصطلحات أساسية‬

‫• التحليل ‪ :analysis‬تبدأ مرحلة التحليل من خلال النظر في وثيقة المتطلبات وتنتهي من خلال إنتاج‬
‫مواصفات النظام‪.‬‬

‫• التحميل المج َّمع ‪ :bulk load‬هو نقل كميات كبيرة من البيانات الموجودة إلى قاعدة بيانات‪.‬‬
‫• وثيقة متطلبات البيانات ‪ :data requirements document‬وتُستخ َدم هذه الوثيقة لتأكيد فهم‬

‫المتطلبات مع المستخ ِدم‪.‬‬
‫• التصميم ‪ :design‬تبدأ مرحلة التصميم بمواصفات النظام‪ ،‬وينتج عنها وثائق التصميم‪ ،‬كما يو ّفر وص ًفا‬

‫تفصيل ًيا لكيفية بناء النظام‪.‬‬
‫• تحديد المتطلبات ‪ :establishing requirements‬تتضمن هذه المرحلة التشاور والاتفاق مع أصحاب‬

‫المصلحة على ما يريدونه من النظام‪ ،‬كما يع َّبر عنها بوثيقة المتطلبات‪.‬‬
‫• الثني ‪ :flexing‬مصطلح يهدف إلى أخذ الأفكار المتزامنة من شيء مثني لغاية مختلفة وإضعاف‬

‫جوانب من هذا الشيء عند ثنيه‪.‬‬

‫‪116‬‬

‫تصميم قواعد البيانات‬ ‫عملية تطوير قواعد البيانات‬

‫• التطبيق ‪ :implementation‬بناء نظام حاسوبي وف ًقا لوثيقة تصميم معينة‪.‬‬
‫• الصيانة ‪ :maintenance‬تتضمن هذه المرحلة التعامل مع تغيرات المتطلبات‪ ،‬أو بيئة التطبيق‪ ،‬أو‬

‫إصلاح الأخطاء‪ ،‬أو نقل النظام إلى بيئات جديدة‪.‬‬
‫• جمع المتطلبات ‪ :requirements gathering‬عملية يقابل خلالها مصمم قاعدة البيانات مستخ ِدم‬
‫قاعدة البيانات لفهم النظام المقت َرح‪ ،‬وذلك للحصول على البيانات‪ ،‬والمتطلبات الوظيفية‪ ،‬وتوثيقها‪.‬‬

‫• تصاميم القطع الثاني ‪ :second-cut designs‬مجموعة التكرارات التي يتضمن كل منها مراجعة‬
‫الجداول التي تؤدي إلى تصميم جديد‪.‬‬

‫• دورة حياة تطوير البرمجيات ‪ software development life cycle‬أو ‪ :SDLC‬سلسلة لخطوات‬
‫عملية تطوير قواعد البيانات‪.‬‬

‫• الاختبار ‪ :testing‬توازن هذه المرحلة النظام المط َّبق مع وثائق التصميم ومواصفات المتطلبات‪ ،‬وينتج‬
‫عنها تقرير قبول‪.‬‬

‫• نموذج الشلال ‪ :waterfall model‬يُظ ِهر هذا النموذج عملية تطوير قاعدة البيانات مثل تسلسل صارم‬
‫من الخطوات حيث يكون خرج خطوة دخاًل للخطوة التالية‪.‬‬

‫• عملية نموذج الشلال ‪ :waterfall process‬وسيلة لتحديد المهام المطلوبة لتطوير قاعدة البيانات‪،‬‬
‫بالإضافة إلى دخل وخرج كل نشاط‪.‬‬

‫‪ 11.11‬تمارين‬

‫‪ .1‬اشرح نموذج الشلال‪ ،‬واذكر خطواته‪.‬‬
‫‪ .2‬ماذا يعني الاختصار ‪SDLC‬؟ وما الذي يمثله؟‬
‫‪ .3‬ما الذي يجب تعديله في نموذج الشلال لاستيعاب تصميم قاعدة البيانات؟‬
‫‪ .4‬اذكر الخطوات التكرارية الموجودة في تصميم قاعدة البيانات‪.‬‬

‫‪117‬‬

‫‪ .12‬لغة الاستعلامات الهيكلية ‪SQL‬‬

‫لغ ة الاس تعلامات الهيكلي ة ‪- Structured Query Language‬أو ‪ SQL‬اختص ا ًرا‪ -‬هي لغ ة قاع دة بيان ات‬
‫مص َّممة لإدارة البيانات الموجودة في نظام إدارة قواعد البيانات العلائقية‪.‬‬

‫ط ّورت شركة ‪ IBM‬لغة ‪ SQL‬في أوائ ل الس بعينات ‪-‬عُرِفت بالإص دار ‪ ،-1986‬حيث ُص ِّمم الإص دار الأولي‬
‫المس َّمى بلغ ة الاس تعلامات الهيكلي ة الإنجليزي ة ‪- SEQUEL‬اختص ا ًرا للعب ارة ‪Structured English Query‬‬
‫‪ -Language‬لمعالجة واسترداد البيانات المخزَّنة في نظام خاص بشركة ‪ IBM‬وشبه علائقي لإدارة قواعد البيان ات‬

‫‪ ،quasi-relational database management system‬ويُس َّمى نظام ‪.R‬‬
‫ق ّدمت بعد ذلك شركة ‪- Relational Software Inc‬والتي أصبحت الآن شركة ‪ -Oracle Corporation‬أول‬
‫تطبيق متاح تجاريًا للغة ‪ SQL‬والمس َّمى بـ ‪ Oracle V2‬لحواسيب ‪ VAX‬في أواخر السبعينات من القرن الماضي‪.‬‬

‫تُستخ َدم العديد من أنظمة ‪ DBMS‬العلائقية المتاحة حال ًيا‪ ،‬مثل‪:‬‬
‫• ‪Oracle Database‬‬

‫• ‪Microsoft SQL Server‬‬
‫• ‪MySQL‬‬

‫• ‪IBM DB2‬‬
‫• ‪IBM Informix‬‬
‫• ‪Microsoft Access‬‬

‫تصميم قواعد البيانات‬ ‫لغة الاستعلامات الهيكلية ‪SQL‬‬

‫تُستخ َدم لغة قاعدة بيانات ‪ SQL‬في نظام ‪ DBMS‬من أجل‪:‬‬
‫• إنشاء بنى قواعد البيانات والجداول‪.‬‬

‫• إجراء الأعمال الأساسية لإدارة البيانات‪ ،‬مثل‪ :‬الإضافة‪ ،‬والحذف‪ ،‬والتعديل‪.‬‬
‫• إجراء استعلامات مع َّقدة لتحويل البيانات الأولية إلى معلومات مفيدة‪.‬‬

‫سوف نركز في هذا الفصل على استخدام لغة ‪ SQL‬لإنشاء بنى قواعد البيانات والجداول‪ ،‬باستخدام لغة ‪SQL‬‬
‫على أساس لغة تعريف بيانات ‪- data definition language‬أو ‪ -DDL‬بصورة أساسية‪.‬‬

‫سنستخدم لغة ‪ SQL‬في فصل لاح ق على أس اس لغ ة معالج ة بيان ات ‪data manipulation language‬‬
‫أو ‪ DML‬لإدخال البيانات‪ ،‬وحذفها‪ ،‬واختيارها‪ ،‬وتحديثها في جداول قاعدة البيانات‪.‬‬

‫‪ 12.1‬إنشاء قاعدة بيانات ‪Create Database‬‬

‫تتك ّون عبارات لغة ‪ SQL DDL‬الرئيسية من‪ :‬عملية إنشاء قاعدة البيانات ‪ ،CREATE DATABASE‬وعمليات‬
‫الإنشاء ‪ CREATE‬والحذف ‪ DROP‬والتع ديل ‪ ALTER‬على الج داول‪ ،‬إذ تُس تخ َدم عب ارة ‪ CREATE‬في لغ ة ‪SQL‬‬

‫لإنشاء بنى قواعد البيانات والجداول‪.‬‬

‫‪ 12.1.1‬مثال عن إنشاء قاعدة بيانات‬

‫تُن َشأ قاعدة بيانات جديدة تس َّمى ‪ SW‬باس تخدام العب ارة ‪ CREATE DATABASE SW‬بلغ ة ‪ .SQL‬الخط وة‬
‫التالية بعد إنشاء قاعدة البيانات هي إنشاء جداول قاعدة البيانات‪.‬‬
‫التنسيق العام للأمر ‪ CREATE TABLE‬هو‪:‬‬

‫>‪CREATE TABLE <tablename‬‬
‫(‬
‫‪ColumnName, Datatype, Optional Column Constraint,‬‬
‫‪ColumnName, Datatype, Optional Column Constraint,‬‬
‫‪Optional table Constraints‬‬
‫;)‬

‫يكون ‪ Tablename‬اسم جدول قاعدة البيانات مثل جدول الموظف ‪ ،Employee‬كما يتك ون ك ل حق ل من‬
‫الأمر ‪ CREATE TABLE‬من ثلاثة أجزاء‪ ،‬هي‪:‬‬
‫‪ .1‬اسم العمود ‪ColumnName‬‬
‫‪ .2‬نوع البيانات ‪Data type‬‬

‫‪ .3‬قيد عمود اختياري ‪Optional Column Constraint‬‬

‫‪119‬‬

‫تصميم قواعد البيانات‬ ‫لغة الاستعلامات الهيكلية ‪SQL‬‬

‫‪ 12.1.2‬اسم العمود ‪ColumnName‬‬

‫يجب أن يكون اس م العم ود ‪ ColumnName‬فري ًدا في الج دول‪ ،‬وبعض الأمثل ة على أس ماء الأعم دة هي‬
‫‪ ،FirstName‬و ‪.LastName‬‬

‫‪ 12.1.3‬نوع البيانات ‪Data Type‬‬

‫يجب على نوع البيانات أن يكون نوع بيانات نظام أو نوع بيانات يعرِّفه المستخ ِدم‪ ،‬كما تملك العديد من أنواع‬
‫البيانات حج ًما‪ ،‬مثل‪ ،CHAR(35( :‬أو (‪.Numeric(8,2‬‬

‫• النوع ‪ :Bit‬بيانات أعداد صحيحة ‪ Integer‬لها قيمة ‪ 1‬أو ‪.0‬‬

‫• النوع ‪ :Int‬بيانات أعداد صحيحة ‪ Integer‬لها القيم من ‪ -2^31‬أي ‪ -2,147,483,648‬حتى ‪ 2^31 – 1‬أي‬
‫‪.2,147,483,647‬‬

‫• النوع ‪ :Smallint‬بيانات أعداد صحيحة ‪ Integer‬لها القيم من ‪ -2^15‬أي ‪ -32,768‬ح تى ‪ 2^15 – 1‬أي‬
‫‪.32,767‬‬

‫• النوع ‪ :Tinyint‬بيانات أعداد صحيحة ‪ Integer‬لها القيم من ‪ 0‬حتى ‪.255‬‬

‫• النوع ‪ :Decimal‬بيانات ذات دقة ثابتة وقياس رقمي لها القيم من ‪ -10^38 -1‬إلى ‪.10^38‬‬

‫• النوع ‪ :Numeric‬مرادف للنوع ‪.decimal‬‬

‫• النوع ‪ :Timestamp‬رقم فريد على مستوى قاعدة البيانات‪.‬‬

‫‪globally‬‬ ‫‪unique‬‬ ‫ا ‪identifier‬‬ ‫د عالم ًي‬ ‫رَّف فري‬ ‫• الن وع ‪ :Uniqueidentifier‬مع‬
‫أو ‪ GUID‬اختصا ًرا‪.‬‬

‫• الن وع ‪ :Money‬ت تراوح قيم البيان ات النقدي ة من ‪ -2^63‬أي ‪ -922,337,203,685,477.5808‬ح تى‬
‫الع دد ‪ 2^63 – 1‬أي ‪ 922,337,203,685,477.5807‬بدق ة تص ل إلى واح د من عش رة آلاف من‬

‫الوحدة النقدية‪.‬‬

‫• الن وع ‪ :Smallmoney‬ت تراوح قيم البيان ات النقدي ة من ‪ -214,748.3648‬إلى ‪ +214,748.3647‬بدق ة‬
‫تصل إلى واحد من عشرة آلاف من الوحدة النقدية‪.‬‬

‫• النوع ‪ :Float‬بيانات أرقام ذات دقة عشرية تتراوح قيمها بين ‪ -1.79E + 308‬و ‪.1.79E + 308‬‬

‫• النوع ‪ :Real‬بيانات أرقام ذات دقة عشرية قيمها تتراوح من ‪ -3.40E + 38‬حتى ‪.3.40E + 38‬‬

‫• النوع ‪ :Datetime‬بيانات التاريخ والوقت تتراوح قيمها من تاريخ ‪ 1‬ين اير ك انون الث اني ‪ 1753‬إلى ت اريخ‬
‫‪ 31‬ديسمبر كانون الأول ‪ 9999‬بدقة تبلغ واحد إلى ثلاثة أجزاء من مئة من الثانية‪ ،‬أو ‪ 3.33‬ميلي ثانية‪.‬‬

‫‪120‬‬

‫تصميم قواعد البيانات‬ ‫لغة الاستعلامات الهيكلية ‪SQL‬‬

‫• النوع ‪ :Smalldatetime‬بيانات التاريخ والوقت تتراوح قيمها من تاريخ ‪ 1‬يناير كانون الث اني ‪ 1900‬ح تى‬
‫تاريخ ‪ 6‬يونيو حزيران ‪ 2079‬بدقة تبلغ دقيقة واحدة‪.‬‬

‫• النوع ‪ :Char‬بيانات محارف ثابتة الطول وليست يونيكود بطول أقصى ‪ 8000‬محرف‪.‬‬
‫• النوع ‪ :Varchar‬بيانات متغيرة الطول وليست يونيكود بحد أقصى ‪ 8000‬محرف‪.‬‬

‫• النوع ‪ :Text‬بيانات متغيرة الطول وليست يونيكود بطول أقص ى يبل غ ‪ 2^31 – 1‬أي ‪2,147,483,647‬‬
‫محر ًفا‪.‬‬

‫• النوع ‪ :Binary‬بيانات ثنائية ذات طول ثابت بطول أقصى ‪ 8000‬بايت‪.‬‬
‫• النوع ‪ :Varbinary‬بيانات ثنائية متغيرة الطول بطول أقصى يبلغ ‪ 8000‬بايت‪.‬‬
‫• النوع ‪ :Image‬بيانات ثنائية متغيرة الطول بطول أقصى ‪ 2^31 – 1‬أي ‪ 2,147,483,647‬بايت‪.‬‬

‫‪ 12.1.4‬قيود العمود الاختيارية ‪Optional Column Constraints‬‬

‫قيود العمود الاختيارية هي ‪ ،NULL‬و ‪ ،NOT NULL‬و ‪ ،UNIQUE‬و‪ ،PRIMARY KEY‬و‪ ،DEFAULT‬وتُستخ َدم‬
‫لتهيئة قيمة لسجل جديد‪.‬‬

‫يشير قيد العمود ‪ NULL‬إلى أن القيمة الفارغة ‪ null‬مسموح به ا‪ ،‬مم ا يع ني أن ه يمكن إنش اء ص ف ب دون‬
‫قيمة لهذا العمود‪ ،‬ويشير قيد العمود ‪ NOT NULL‬إلى وجوب توفير قيمة عند إنشاء صف جديد‪.‬‬

‫سنستخدم تعليمة لغة ‪ SQL‬للتوضيح والتي هي ‪ CREATE TABLE EMPLOYEES‬لإنشاء جدول م وظفين‬
‫يحتوي على ‪ 16‬سمة ‪ attributes‬أو حقل ‪.fields‬‬

‫‪USE SW‬‬ ‫)‪CHAR(10‬‬ ‫‪NOT NULL‬‬ ‫‪UNIQUE,‬‬
‫‪CREATE TABLE EMPLOYEES‬‬ ‫)‪CHAR(30‬‬ ‫‪NOT NULL‬‬ ‫‪DEFAULT‬‬
‫(‬
‫‪EmployeeNo‬‬ ‫)‪CHAR(25‬‬ ‫‪NOT NULL,‬‬
‫‪DepartmentName‬‬ ‫)‪CHAR(25‬‬ ‫‪NOT NULL,‬‬
‫‪“Human Resources”,‬‬ ‫)‪CHAR(20‬‬ ‫‪NOT NULL,‬‬
‫‪FirstName‬‬ ‫‪CURRENCY‬‬ ‫‪NOT NULL,‬‬
‫‪LastName‬‬ ‫‪LOGICAL‬‬ ‫‪NOT NULL,‬‬
‫‪Category‬‬ ‫)‪CHAR(1‬‬ ‫‪NOT NULL,‬‬
‫‪HourlyRate‬‬ ‫)‪CHAR(1‬‬ ‫‪NOT NULL,‬‬
‫‪TimeCard‬‬ ‫‪LOGICAL‬‬ ‫‪NOT NULL,‬‬
‫‪HourlySalaried‬‬
‫‪EmpType‬‬
‫‪Terminated‬‬

‫‪121‬‬

‫تصميم قواعد البيانات‬ SQL ‫لغة الاستعلامات الهيكلية‬

ExemptCode CHAR(2) NOT NULL,
Supervisor
SupervisorName LOGICAL NOT NULL,
BirthDate
CollegeDegree CHAR(50) NOT NULL,
CONSTRAINT
); DATE NOT NULL,

CHAR(5) NOT NULL,

Employee_PK PRIMARY KEY(EmployeeNo)

‫ ولا يمكن للمس تخ ِدم‬،‫ مح ارف‬10 ‫ ويبلغ طول هذا الحق ل‬،CHAR ‫ من النوع‬EmployeeNo ‫الحقل الأول هو‬
.30 ‫ بطول‬CHAR ‫ من النوع‬DepartmentName ‫ أما الحقل الثاني هو‬،NOT NULL ‫ترك هذا الحقل فار ًغا‬

،primary key ‫ لإنش اء المفت اح الأساس ي‬CONSTRAINT ‫يُستخ َدم قيد الجدول المع رَّف بواس طة الكلم ة‬
:‫ أي كما يلي‬،‫وذلك بعد تعريف جميع أعمدة الجدول‬

CONSTRAINT EmployeePK PRIMARY KEY(EmployeeNo)

‫ باس تخدام‬Assignment ‫ وجدول مهام‬،Project ‫ وجدول مشاريع‬،Department ‫يمكننا إنشاء جدول أقسام‬
:‫ كما هو مو َّضح في المثال التالي‬،SQL DDL ‫ بلغة‬CREATE TABLE ‫الأمر‬

USE SW

CREATE TABLE DEPARTMENT

(

DepartmentName Char(35) NOT NULL,

BudgetCode Char(30) NOT NULL,

OfficeNumber Char(15) NOT NULL,

Phone Char(15) NOT NULL,

CONSTRAINT DEPARTMENT_PK PRIMARY KEY(DepartmentName)

);

‫ واسم‬،ProjectID ‫ مع رِّف المش روع‬:‫ الت الي بس بعة حق ول هي‬project ‫ُأن ِش ئ ج دول المش اريع‬
‫ وت اريخ‬،MaxHours ‫ والح د الأقص ى للس اعات‬،Department ‫ والقس م‬،ProjectName ‫المش روع‬

.EndDate ‫ وتاريخ الانتهاء‬،StartDate ‫البدء‬

USE SW

CREATE TABLE PROJECT

(

ProjectID Int NOT NULL IDENTITY (1000,100),

ProjectName Char(50) NOT NULL,

122

‫تصميم قواعد البيانات‬ ‫لغة الاستعلامات الهيكلية ‪SQL‬‬

‫‪Department‬‬ ‫‪Char(35) NOT NULL,‬‬
‫‪MaxHours‬‬ ‫‪Numeric(8,2) NOT NULL DEFAULT 100,‬‬
‫‪StartDate‬‬ ‫‪DateTime NULL,‬‬
‫‪EndDate‬‬ ‫‪DateTime NULL,‬‬
‫‪CONSTRAINT‬‬ ‫)‪ASSIGNMENT_PK PRIMARY KEY(ProjectID‬‬
‫;)‬

‫بينما ُأن ِشئ ج دول المه ام ‪ assignment‬بثلاث ة حق ول‪ ،‬هي‪ :‬مع رِّف المش روع ‪ ،ProjectID‬ورقم الموظ ف‬
‫‪ ،EmployeeNumber‬وساعات العمل ‪.HoursWorked‬‬

‫يُستخ َدم جدول المهام لتسجيل الموظف باستخدام الحقل ‪ ،EmployeeNumber‬ومقدار الوقت باس تخدام‬
‫الحقل ‪ HoursWorked‬الذي عمل فيه الموظف في مشروع معين باستخدام الحقل ‪ ،ProjectID‬أي كما يلي‪:‬‬

‫‪USE SW‬‬

‫‪CREATE TABLE ASSIGNMENT‬‬

‫(‬

‫‪ProjectID‬‬ ‫‪Int NOT NULL,‬‬

‫‪EmployeeNumber Int NOT NULL,‬‬

‫‪HoursWorked Numeric(6,2) NULL,‬‬

‫;)‬

‫‪ 12.2‬قيود الجدول ‪Table Constraints‬‬

‫تُعرَّف قيود الجدول بواسطة الكلمة المفتاحية ‪ CONSTRAINT‬ويمكن استخدامها لتطبيق العديد من القيود‬
‫المو َّضحة أدناه‪.‬‬

‫‪ 12.2.1‬القيد ‪IDENTITY‬‬

‫يمكننا استخدام قيد العمود الاختياري ‪ IDENTITY‬لتوفير قيمة فريدة تزايدية لهذا العمود‪ ،‬إذ تُستخ َدم أعمدة‬
‫الهوية ‪ Identity‬مع قيود المفتاح الرئيسي ‪ PRIMARY KEY‬لتكون بمثابة معرِّف صف فريد للجدول‪ ،‬كم ا يمكن‬
‫إسناد الخاص ية ‪ IDENTITY‬إلى عم ود ل ه ن وع بيان ات ‪ ،tinyint‬أو ‪ ،smallint‬أو ‪ ،int‬أو ‪ ،decimal‬أو ‪،numeric‬‬

‫وهذا القيد‪:‬‬
‫• يولِّد أرقا ًما متسلسل ًة‪.‬‬
‫• لا يفرض سلامة الكيان ‪.entity integrity‬‬

‫• يمكن أن يحتوي عمود واحد فقط على الخاصية ‪.IDENTITY‬‬

‫• يجب تعريفه على أساس نوع بيانات ‪ ،integer‬أو ‪ ،numeric‬أو ‪.decimal‬‬

‫‪123‬‬

‫تصميم قواعد البيانات‬ ‫لغة الاستعلامات الهيكلية ‪SQL‬‬

‫• لا يمكن تحديث عمود له الخاصية ‪.IDENTITY‬‬
‫• لا يمكن أن يحتوي على قيم فارغة ‪.NULL‬‬

‫• لا يمكنه ربط الافتراضات والقيود الافتراضية بالعمود‪.‬‬
‫بالنسبة للقيد [(‪:IDENTITY[(seed, increment‬‬

‫• ‪ :Seed‬هي القيمة الأولية لعمود الهوية ‪.identity‬‬
‫• ‪ :Increment‬هي القيمة المطلوب إضافتها إلى عمود الزيادة ‪ increment‬الأخير‪.‬‬
‫سنس تخدم مث ال قاع دة بيان ات آخ ر لتوض يح عب ارات لغ ة ‪ SQL DDL‬بص ورة أك بر من خلال إنش اء‬

‫الجدول ‪ tblHotel‬في قاعدة بيانات الفندق ‪ HOTEL‬كما يلي‪:‬‬

‫‪CREATE TABLE tblHotel‬‬

‫(‬

‫‪HotelNo‬‬ ‫‪Int‬‬ ‫‪IDENTITY (1,1),‬‬
‫‪NOT NULL,‬‬
‫‪Name‬‬ ‫)‪Char(50‬‬ ‫‪NULL,‬‬
‫‪NULL,‬‬
‫‪Address‬‬ ‫)‪Char(50‬‬

‫‪City‬‬ ‫)‪Char(25‬‬

‫)‬

‫‪ 12.2.2‬القيد ‪UNIQUE‬‬

‫يمنع القيد ‪ UNIQUE‬من إدخال قيم مكررة في عمود‪ ،‬حيث‪:‬‬

‫• يُستخ َدم القيدان ‪ ،PK‬و‪ UNIQUE‬لفرض سلامة الكيان‪.‬‬

‫• يمكن تعريف قيود ‪ UNIQUE‬متعددة للجدول‪.‬‬

‫• يجري دائ ًما التحقق من صحة البيانات الموجودة عند إضافة قيد ‪ UNIQUE‬إلى جدول موجود‪.‬‬
‫• يمكن وضع القيد ‪ UNIQUE‬على الأعمدة ال تي تقب ل القيم الفارغ ة‪ ،‬حيث يمكن أن يك ون ص ٌف واح د‬

‫فقط ‪.NULL‬‬
‫• ين ِشئ القيد ‪ UNIQUE‬دلياًل فري ًدا للعمود ال ُمختار تلقائ ًيا‪.‬‬

‫الصيغة التالية هي الصيغة العامة للقيد ‪:UNIQUE‬‬

‫]‪[CONSTRAINT constraint_name‬‬
‫]‪UNIQUE [CLUSTERED | NONCLUSTERED‬‬
‫)]]‪(col_name [, col_name2 […, col_name16‬‬

‫‪124‬‬

‫تصميم قواعد البيانات‬ ‫لغة الاستعلامات الهيكلية ‪SQL‬‬

‫]‪[ON segment_name‬‬

‫يستخدم المثال التالي القيد ‪ UNIQUE‬كما يلي‪:‬‬

‫‪CREATE TABLE EMPLOYEES‬‬

‫(‬

‫‪EmployeeNo‬‬ ‫)‪CHAR(10‬‬ ‫‪NOT NULL‬‬ ‫‪UNIQUE,‬‬

‫)‬

‫‪ 12.2.3‬القيد ‪ FOREIGN KEY‬المفتاح الخارجي‬

‫يعرِّف القيد ‪- FOREIGN KEY‬أو ‪ FK‬اختص ا ًرا‪ -‬عم و ًدا‪ ،‬أو مجموع ة من الأعم دة ال تي تتط ابق قيمه ا م ع‬
‫المفتاح الرئيسي ‪- PRIMARY KEY‬أو ‪ PK‬اختصا ًرا‪ -‬لجدول آخر‪ ،‬بحيث‪:‬‬

‫• تُح َّدث القيم في المفت اح الخ ارجي ‪ FK‬تلقائ ًي ا عن د تح ديث أو تغي ير قيم المفت اح الرئيس ي ‪ PK‬في‬
‫الجدول المرتبط‪.‬‬

‫• يجب أن تشير قيود المفتاح الخارجي ‪ FK‬إلى القيد المفتاح الرئيسي ‪ ،PK‬أو القيد ‪ UNIQUE‬لجدول آخر‪.‬‬

‫• يكون عدد أعمدة المفتاح الخارجي ‪ FK‬هو نفسه قيد المفتاح الرئيسي ‪ ،PK‬أو قيد ‪.UNIQUE‬‬
‫• إذا اُس تخ ِدم الخي ار ‪ ،WITH NOCHECK‬فلن يتحق ق قي د المفت اح الخ ارجي ‪ FK‬من ص حة البيان ات‬

‫الموجودة في الجدول‪.‬‬

‫• لا يوجد دليل ‪ index‬للأعمدة التي تشارك في قيد المفتاح الخارجي ‪.FK‬‬

‫الصيغة التالية هي الصيغة العامة لقيد المفتاح الخارجي ‪:FOREIGN KEY‬‬

‫]‪[CONSTRAINT constraint_name‬‬
‫])]]‪[FOREIGN KEY (col_name [, col_name2 […, col_name16‬‬
‫])]]‪REFERENCES [owner.]ref_table [(ref_col [, ref_col2 […, ref_col16‬‬

‫يكون الحقل ‪ HotelNo‬في المثال التالي في الج دول ‪ tblRoom‬مفتاحً ا خارج ًي ا ‪ FK‬للحق ل ‪ HotelNo‬في‬
‫الجدول ‪ tblHotel‬المو َّضح ساب ًقا‪:‬‬

‫‪USE HOTEL‬‬ ‫‪NOT NULL ,‬‬
‫‪GO‬‬ ‫‪NOT NULL,‬‬
‫‪CREATE TABLE tblRoom‬‬
‫(‬
‫‪HotelNo Int‬‬
‫‪RoomNo Int‬‬

‫‪125‬‬

‫تصميم قواعد البيانات‬ SQL ‫لغة الاستعلامات الهيكلية‬

Type Char(50) NULL,

Price Money NULL,

PRIMARY KEY (HotelNo, RoomNo),

FOREIGN KEY (HotelNo) REFERENCES tblHotel

)

CHECK ‫ القيد‬12.2.4

:‫ بحيث‬،‫ القيم التي يمكن إدخالها في جدول‬CHECK ‫يق ِّيد القيد‬
.WHERE ‫• يمكن أن يحتوي على شروط بحث مشابهة لعبارة‬

.‫• يمكنه الربط بين الأعمدة في نفس الجدول‬

‫ من خلال تعب ير‬CHECK ‫• يجب العم ل على تق ييم قاع دة التحق ق من ص حة البيان ات للقي د‬
.boolean expression ‫بولياني‬

.‫• يمكن تعريفه لعمود له قاعدة مرتبطة به‬

:CHECK ‫الصيغة التالية هي الصيغة العامة للقيد‬

[CONSTRAINT constraint_name]
CHECK [NOT FOR REPLICATION] (expression)

.Executive ‫ أو‬Suite ‫ أو‬Double ‫ أو‬Single :‫ في المثال التالي على الأنواع‬Type ‫يقتصر حقل النوع‬

USE HOTEL

GO

CREATE TABLE tblRoom

(

HotelNo Int NOT NULL,

RoomNo Int NOT NULL,

Type Char(50) NULL,

Price Money NULL,

PRIMARY KEY (HotelNo, RoomNo),

FOREIGN KEY (HotelNo) REFERENCES tblHotel

CONSTRAINT Valid_Type

CHECK (Type IN ('Single', 'Double', 'Suite', 'Executive'))

)

126

‫تصميم قواعد البيانات‬ SQL ‫لغة الاستعلامات الهيكلية‬

‫ أو يجب أن يك ون الح د‬،January 1, 2004 ‫يجب في المثال التالي أن يكون تاريخ تع يين الموظ ف قب ل‬
:‫ ألف دولار‬300 ‫الأقصى للراتب‬

GO

CREATE TABLE SALESREPS

(

Empl_num Int Not Null

CHECK (Empl_num BETWEEN 101 and 199),

Name Char (15),

Age Int CHECK (Age >= 21),

Quota Money CHECK (Quota >= 0.0),

HireDate DateTime,

CONSTRAINT QuotaCap CHECK ((HireDate < “01-01-2004”) OR (Quota
<=300000))

)

DEFAULT ‫ القيد‬12.2.5

:‫ بحيث‬،‫ لتوفير قيمة تُضاف تلقائ ًيا لعمود ما إذا لم يو ّفرها المستخدم‬DEFAULT ‫يُستخ َدم القيد‬
.‫ واحد فقط‬DEFAULT ‫• يمكن احتواء العمود على قيد‬

‫ أو ال تي لها‬،timestamp ‫ في الأعم دة ال تي له ا ن وع البيان ات‬DEFAULT ‫• لا يمكن اس تخدام القي د‬
.identity ‫الخاصية‬

.‫ تلقائ ًيا بعمود عند إنشائها‬DEFAULT ‫• ترتبط القيود‬
:‫ هي‬DEFAULT ‫الصيغة العامة للقيد‬

[CONSTRAINT constraint_name]
DEFAULT {constant_expression | niladic-function | NULL}
[FOR col_name]

:"Vancouver" ‫ على القيمة‬city field ‫ لحقل‬default ‫يضبط المثال التالي القيمة الافتراضية‬

USE HOTEL
ALTER TABLE tblHotel
Add CONSTRAINT df_city DEFAULT 'Vancouver' FOR City

127

‫تصميم قواعد البيانات‬ ‫لغة الاستعلامات الهيكلية ‪SQL‬‬

‫‪ 12.3‬الأنواع التي ُيعرفها المستخدم ‪User Defined Types‬‬

‫تعتمد الأنواع التي يعرِّفها المستخ ِدم دائ ًما على نوع البيانات التي يوفرها النظام‪ ،‬فيمكن لهذه الأن واع ف رض‬
‫سلامة البيانات والسماح بالقيم الفارغة ‪ .nulls‬اختر الأن واع ال تي تك ون تحت الكلم ة "‪ "Programmability‬في‬
‫قاعدة البيانات الخاصة بك‪ ،‬لإنشاء نوع بيانات يعرِّفه المستخ ِدم في خادم ‪ ،SQL Server‬ثم انقر بزر الفأرة الأيمن‬
‫واخ تر المس ار '‪ ،'New' –> 'User-defined data type‬أو ن ّف ذ إج راء النظ ام ‪ sp_addtype‬ال ُمخ زَّن‬

‫أي ‪ ،system stored procedure‬ثم اكتب ما يلي‪:‬‬

‫'‪sp_addtype ssn, 'varchar(11)', 'NOT NULL‬‬

‫سيؤدي هذا إلى إضافة نوع بيانات جديد عرّفه المستخدم يسمى ‪ SIN‬بتسعة محارف‪.‬‬

‫يستخدم الحقل ‪ EmployeeSIN‬نوع البيانات ‪ SIN‬الذي عرّفه المستخدم في المثال التالي‪:‬‬

‫‪CREATE TABLE SINTable‬‬
‫(‬
‫‪EmployeeID INT Primary Key,‬‬
‫‪EmployeeSIN SIN,‬‬
‫‪CONSTRAINT CheckSIN‬‬
‫‪CHECK (EmployeeSIN LIKE‬‬
‫)' ]‪' [0-9][0-9][0-9] – [0-9][0-9] [0-9] – [0-9][0-9][0-9‬‬
‫)‬

‫‪ 12.3.1‬التعليمة ‪ALTER TABLE‬‬

‫يمكن استخدام تعليمات ‪ ALTER TABLE‬لإضافة وحذف القيود‪ ،‬بحيث‪:‬‬

‫• تسمح تعليمة ‪ ALTER TABLE‬بإزالة الأعمدة‪.‬‬

‫• يُتحقق من جميع البيانات الموجودة عند إضافة قيد للتأكد من عدم وجود انتهاكات‪.‬‬

‫نستخدم في المثال تعليمة ‪ ALTER TABLE‬للخاصية ‪ IDENTITY‬في الحقل ‪:ColumnName‬‬

‫‪USE HOTEL‬‬
‫‪GO‬‬
‫‪ALTER TABLE tblHotel‬‬
‫)‪ADD CONSTRAINT unqName UNIQUE (Name‬‬

‫استخدم تعليمة ‪ ALTER TABLE‬لإضافة عمود مع الخاصية ‪.IDENTITY‬‬

‫‪128‬‬

‫تصميم قواعد البيانات‬ ‫لغة الاستعلامات الهيكلية ‪SQL‬‬

‫‪ADD‬‬ ‫)‪int IDENTITY(seed, increment‬‬
‫‪ColumnName‬‬

‫‪ 12.3.2‬التعليمة ‪DROP TABLE‬‬

‫تزي ل التعليم ة ‪ DROP TABLE‬ج دواًل من قاع دة البيان ات‪ ،‬ل ذلك يجب علي ك التأك د من تحدي د قاع دة‬
‫البيانات الصحيحة‪.‬‬

‫‪DROP TABLE tblHotel‬‬
‫سيؤدي تنفيذ عبارة ‪ DROP TABLE‬بلغة ‪ SQL‬إلى إزالة الجدول ‪ tblHotel‬من قاعدة البيانات‪.‬‬

‫‪ 12.4‬مصطلحات أساسية‬

‫• ‪ :DDL‬اختصار للغة تعريف البيانات ‪.data definition language‬‬

‫• ‪ :DML‬اختصار للغة معالجة البيانات ‪.data manipulation language‬‬

‫• ‪ :SEQUEL‬اختصار للغة الاستعلامات الهيكلية الإنجليزية ‪Structured English Query Language‬‬
‫التي ُص ِّممت لمعالجة واسترداد البيانات المخزَّنة في نظام شبه علائقي لإدارة قواعد‬

‫البيانات ‪ ،quasi-relational database management system‬وخاص بشركة ‪ ،IBM‬ويس َّمى نظام ‪.R‬‬

‫• لغة الاستعلامات الهيكلية ‪ Structured Query Language‬أو ‪ :SQL‬لغة قاعدة بيانات مص َّممة‬
‫لإدارة البيانات الموجودة في نظام إدارة قواعد البيانات العلائقية‪.‬‬

‫‪ 12.5‬تمارين‬

‫‪ .1‬باستخدام المعلومات الخاصة بالتمرين الموجود في الفصل قواعد السلامة والقيود ال ُمط َّبقة عند تصميم‬
‫قواعد البيانات‪ ،‬ط ّبق التخطيط بلغة ‪ Transact SQL‬أي اعرض تعليمات ‪ SQL‬لكل جدول وط ّبق القيود‪.‬‬

‫‪ .2‬أنشئ الجدول ‪ Employee‬المو َّضح أدناه في خادم ‪ ،SQL Server‬واعرض التعليمات التي استخدمتها‪.‬‬

‫النوع‬ ‫اسم الحقل (العمود)‬
‫‪EMP_NUM‬‬
‫)‪CHAR(3‬‬ ‫‪EMP_LNAME‬‬
‫)‪VARCHAR(15‬‬ ‫‪EMP_FNAME‬‬
‫)‪VARCHAR(15‬‬ ‫‪EMP_INITIAL‬‬
‫)‪CHAR(1‬‬ ‫‪EMP_HIREDATE‬‬
‫‪DATE‬‬ ‫‪JOB_CODE‬‬
‫)‪CHAR(3‬‬

‫‪129‬‬

‫تصميم قواعد البيانات‬ ‫لغة الاستعلامات الهيكلية ‪SQL‬‬

‫‪ .3‬اكتب شيفرة لغة ‪ SQL‬لإدخال صفوف الجدول السابق‪ ،‬بعد إنشاء بنيته‪.‬‬

‫استخدم الجدول السابق للإجابة على الأسئلة من ‪ 4‬إلى ‪.10‬‬

‫‪EMP_NUM EMP_LNAME EMP_FNAME EMP_INITIAL EMP_HIREDATE‬‬ ‫_‪JOB‬‬
‫‪CODE‬‬
‫‪101 News‬‬ ‫‪John‬‬ ‫‪G‬‬ ‫‪08-Nov-00‬‬ ‫‪502‬‬
‫‪H‬‬ ‫‪12-Jul-89‬‬ ‫‪501‬‬
‫‪102 Senior‬‬ ‫‪David‬‬ ‫‪E‬‬ ‫‪01-Dec-96‬‬ ‫‪500‬‬
‫‪K‬‬ ‫‪15-Nov-87‬‬ ‫‪501‬‬
‫‪103‬‬ ‫‪Arnough‬‬ ‫‪June‬‬ ‫‪K‬‬ ‫‪01-Feb-93‬‬ ‫‪502‬‬
‫‪22-Jun04‬‬ ‫‪500‬‬
‫‪104‬‬ ‫‪Ramoras‬‬ ‫‪Anne‬‬ ‫‪D‬‬ ‫‪10-Oct-93‬‬ ‫‪500‬‬
‫‪B‬‬ ‫‪22-Aug-91‬‬ ‫‪501‬‬
‫‪105‬‬ ‫‪Johnson‬‬ ‫‪Alice‬‬ ‫‪W‬‬ ‫‪18-Jul-97‬‬ ‫‪501‬‬

‫‪106‬‬ ‫‪Smithfield‬‬ ‫‪William‬‬

‫‪107 Alonzo‬‬ ‫‪Maria‬‬

‫‪108 Washington Ralph‬‬

‫‪109 Smith‬‬ ‫‪Larry‬‬

‫‪ .4‬اكتب شيفرة لغة ‪ SQL‬لتغي ير رم ز الوظيف ة ‪ job code‬إلى ‪ 501‬للموظ ف ال ذي رقم ه ‪ ،107‬وافحص‬
‫النتائج بعد الانتهاء من المهمة‪ ،‬ثم أعد ضبط رمز الوظيفة إلى قيمته الأصلية‪.‬‬

‫‪ .5‬اكتب شيفرة لغة ‪ SQL‬لإعط اء قائم ة بجمي ع الس مات الخاص ة برم ز الوظيف ة ‪ ،502‬ب افتراض إدخ ال‬
‫البيانات المو َّضحة في جدول الموظف ‪.Employee‬‬

‫‪ .6‬اكتب شيفرة لغة ‪ SQL‬لحذف الصف الخاص بالش خص ال ذي اس مه "‪ ،"William Smithfield‬وال ذي‬
‫ُو ِّظف في ‪ ،June 22, 2004‬والذي تصنيف رمز وظيفته هو ‪.500‬‬

‫استخدم المعاملات المنطقية لتضمين جميع المعلومات الواردة في هذه المسألة‬

‫‪ .7‬أضف السمتين ‪ ،EMP_PCT‬و‪ PROJ_NUM‬إلى جدول الموظف‪ ،‬بحيث تك ون الس مة ‪ EMP_PCT‬هي‬
‫نسبة المكافأة المدفوعة لكل موظف‪.‬‬

‫‪ .8‬اكتب شيفرة لغة ‪ SQL‬باستخدام أمر واحد لإدخال رقم المشروع ‪ PROJ_NUM = 18‬لجميع الموظفين‬
‫الذين تصنيف الوظيفة ‪ JOB_CODE‬الخاص بهم هو ‪.500‬‬

‫‪ .9‬اكتب شيفرة لغة ‪ SQL‬باستخدام أمر واحد لإدخال رقم المشروع ‪ PROJ_NUM = 25‬لجميع الموظفين‬
‫الذين تصنيف الوظيفة ‪ JOB_CODE‬الخاص بهم يساوي ‪ 502‬أو أعلى‪.‬‬

‫‪ .10‬اكتب شيفرة لغة ‪ SQL‬لتغيير رقم المشروع ‪ PROJ_NUM‬إلى ‪ 14‬للموظفين الذين تع ّينوا قبل ‪January‬‬
‫‪ ،1, 1994‬ورمز الوظيفة الخاصة بهم يساوي ‪ 501‬على الأقل‪( .‬قد تفترض أن الجدول سيعاد إلى حالت ه‬

‫الأصلية التي سبقت هذا السؤال)‪.‬‬

‫‪130‬‬

‫‪ .13‬لغة معالجة البيانات ‪ DML‬الخاصة‬
‫بلغة ‪SQL‬‬

‫تُستخ َدم لغة معالج ة البيان ات ‪- Data Manipulation Language‬أو ‪ DML‬اختص ا ًرا‪ -‬الخاص ة بلغ ة ‪SQL‬‬
‫للاستعلام عن البيانات في قاعدة البيانات وتعديلها‪ ،‬وسنشرح في هذا الفصل كيفي ة اس تخدام تعليم ات أوام ر‬

‫لغة ‪ SQL DML‬والتي هي ‪ SELECT‬و ‪ INSERT‬و ‪ UPDATE‬و ‪ DELETE‬ال ُمعرَّفة كما يلي‪:‬‬
‫• ‪ :SELECT‬للاستعلام عن بيانات في قاعدة البيانات‪.‬‬
‫• ‪ :INSERT‬لإدخال بيانات في جدول‪.‬‬
‫• ‪ :UPDATE‬لتحديث بيانات في جدول‪.‬‬
‫• ‪ :DELETE‬لحذف بيانات من جدول‪.‬‬
‫في تعليمة ‪:SQL DML‬‬
‫• يجب بدأ كل شرط في عبارة بسطر جديد‪.‬‬

‫• يجب انتظام بداية كل شرط مع بداية الشروط الأخرى‪.‬‬
‫• إذا تألّف شرط من عدة أجزاء‪ ،‬فيجب تو ُّضع هذه الأجزاء على سطور منفصلة‪ ،‬كم ا يجب إض افة مس افة‬

‫بادئة لها تحت بداية الشرط لإظهار العلاقة‪.‬‬
‫• تُستخ َدم الأحرف الكبيرة لتمثيل الكلمات المحجوزة‪.‬‬
‫• تُستخ َدم الحروف الصغيرة لتمثيل الكلمات التي يُعرِّفها المستخ ِدم‪.‬‬

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫‪ 13.1‬تعليمة ‪SELECT‬‬

‫تسمح التعليمة أو الأمر ‪ SELECT‬للمستخ ِدم باستخراج البيانات من الجداول‪ ،‬بنا ًء على معايير مح َّددة‪ ،‬حيث‬
‫تُعالَج وف ًقا للتسلسل التالي‪:‬‬

‫• ‪ SELECT DISTINCT‬اختيار عنصر أو مجموعة عناصر‪.‬‬
‫• ‪ FROM‬من جدول أو مجموعة جداول‪.‬‬
‫• ‪ WHERE‬يليها تعبير شرطي‪.‬‬

‫• ‪ GROUP BY‬يليها حقل أو مجموعة حقول‪.‬‬
‫• ‪ ORDER BY‬يليها مجموعة حقول‪.‬‬

‫يمكن استخدام تعليمة ‪ SELECT‬لإنشاء قائمة بهواتف الموظفين من جدول الموظفين ‪ ،Employees‬انظر‪:‬‬

‫‪SELECT FirstName, LastName, phone‬‬
‫‪FROM Employees‬‬
‫‪ORDER BY LastName‬‬

‫س يعرض ه ذا الإج راء اس م عائل ة ‪ last name‬الموظ ف‪ ،‬واس مه الأول ‪ ،first name‬ورقم‬
‫هاتفه ‪ phone number‬من جدول الموظفين ‪ Employees‬كما في الجدول التالي‪:‬‬

‫‪Last Name‬‬ ‫‪First Name‬‬ ‫‪Phone Number‬‬
‫‪Hagans‬‬ ‫‪604-232-3232‬‬
‫‪Wong‬‬ ‫‪Jim‬‬ ‫‪604-244-2322‬‬
‫‪Bruce‬‬

‫سنستخدم في المثال التالي جدول الناشرين ‪ Publishers table‬الذي يم ِّثله الجدول الآتي‪ ،‬حيث س تلاحظ‬

‫أ ّن كن دا ‪ Canada‬مكتوب ة بطريق ة خاطئ ة في حق ل بل د الناش ر ‪ Publisher Country‬المقاب ل لحق ل اسم‬
‫الناشر "‪ ،"Example Publishing‬ومدينة الناشر "‪."ABC Publishing‬‬

‫‪Publisher Name‬‬ ‫‪Publisher City‬‬ ‫‪Publisher Province Publisher Country‬‬
‫‪Acme Publishing‬‬ ‫‪Vancouver‬‬ ‫‪BC Canada‬‬
‫‪Example Publishing‬‬ ‫‪Edmonton‬‬ ‫‪AB Cnada‬‬
‫‪ABC Publishing‬‬ ‫‪Toronto‬‬ ‫‪ON Canda‬‬

‫استخدم تعليمة ‪ UPDATE‬لتصحيح الأخطاء وتوحي د حق ل البل د ليص بح ‪ ،Canada‬كم ا س نتكلم لاح ًق ا عن‬

‫تعليمة ‪ UPDATE‬في هذا الفصل‪.‬‬

‫‪132‬‬

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫إذا أضف َت اسم الناشر ‪ ،Publisher Name‬ومدينة الناشر ‪ ،Publisher City‬فستستخ ِدم تعليمة ‪،SELECT‬‬
‫ويتبعها اسم الحقول التي يُف َصل بينها بفاصلة أجنبية ‪ ،comma‬أي كما يلي‪:‬‬

‫‪SELECT PubName, city‬‬
‫‪FROM Publishers‬‬

‫سيؤدي هذا الإجراء إلى عرض اسم الناشر ومدينته من جدول الناشرين‪.‬‬

‫إذا أردت عرض حقل اسم الناش ر باس م حق ل المدين ة ‪-‬أي تب ديل اس م الحق ل ‪ PubName‬ليص بح ‪،-city‬‬
‫فاستخ ِدم تعليمة ‪ SELECT‬مع عدم وضع فاصلة أجنبية بين ‪ Pub_Name‬و‪ ،city‬أي كما يلي‪:‬‬

‫‪SELECT PubName city‬‬
‫‪FROM Publishers‬‬

‫سيعرض تنفيذ هذا الإجراء فقط الحقل ‪ PUB_NAME‬من جدول الناشرين‪ ،‬بحيث يكون ل ه العن وان "‪."city‬‬
‫سيفترض ‪ SQL Server‬أنك تريد وضع اسم عمود جديد للحقل ‪ PUB_NAME‬إذا لم تض ّمن الفاصلة الأجنبية‪.‬‬

‫‪ 13.1.1‬تعليمة ‪ SELECT‬مع معيار ‪WHERE‬‬

‫قد ترغب أحيانًا في التركيز على جزء من ج دول الناش رين‪ ،‬مث ل الناش رين الموج ودين في مدين ة ف انكوفر‬
‫‪ Vancouver‬فقط‪ ،‬إذ ستستخدم في هذه الحالة عبارة ‪ SELECT‬مع معيار ‪ ،WHERE‬أي كما يلي‪:‬‬

‫'‪WHERE city = 'Vancouver‬‬

‫يو ِّضح المثالان الأول ّيان التاليان كيفية تحدي د اختي ار س جل م ع المعي ار ‪ WHERE‬باس تخدام ‪ ،BETWEEN‬إذ‬
‫يعطي كل من هذين المثالَين نتائج تخزين العناصر نفسها التي عددها بين ‪ 20‬و ‪ 50‬عنصر في المخزن‪.‬‬

‫يستخدم المثال رقم ‪ 1‬الكمي ة ال تي قيمته ا بين ‪ 20‬و‪ 50‬عنص ر م ع تض مين العنص رين ‪ 20‬و‪ 50‬بالص ورة‬
‫التالية‪.qty BETWEEN 20 and 50 :‬‬

‫‪SELECT StorID, qty, TitleID‬‬
‫‪FROM Sales‬‬
‫ضّمن العنصرين رقم ‪ 20‬و‪WHERE qty BETWEEN 20 and 50 -- 50‬‬

‫يستخ ِدم المثال رقم ‪ 2‬الشرط ‪.qty >=20 and qty <=50‬‬

‫‪SELECT StorID, qty, TitleID‬‬
‫‪FROM Sales‬‬
‫‪WHERE qty >= 20 and qty <= 50‬‬

‫يو ِّضح المثال رقم ‪ 3‬كيفية تحديد اختيار سجل مع المعيار ‪ WHERE‬باستخدام ‪.NOT BETWEEN‬‬

‫‪133‬‬

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫‪SELECT StorID, qty, TitleID‬‬
‫‪FROM Sales‬‬
‫‪WHERE qty NOT BETWEEN 20 and 50‬‬

‫يظهر المث الان التالي ان ط ريق َتين مختلف َتين لتحدي د اختي ار س جل م ع المعي ار ‪ WHERE‬باس تخدام ‪ IN‬مع‬
‫النتائج نفسها‪.‬‬

‫يوضح المثال رقم ‪ 4‬كيفية اختيار السجلات باستخدام حق ل المقاطع ة ‪ province‬من ج دول ‪Publishers‬‬
‫أي =‪ province‬على أساس جزء من تعليمة ‪.WHERE‬‬

‫* ‪SELECT‬‬
‫‪FROM Publishers‬‬
‫'‪WHERE province = 'BC' OR province = 'AB' OR province = 'ON‬‬

‫يو ِّضح المثال رقم ‪ 5‬كيفية اختي ار الس جلات باس تخدام المقاطع ة ‪ province‬م ع ‪ IN‬على أس اس ج زء من‬
‫تعليمة ‪:WHERE‬‬

‫* ‪SELECT‬‬
‫‪FROM Publishers‬‬
‫)'‪WHERE province IN ('BC', 'AB', 'ON‬‬

‫يو ِّضح المثالان الأخيران كيف يمكن استخدام ‪ NULL‬و‪ NOT NULL‬لتحديد السجلات‪ ،‬ولكن سنس تخدم في‬
‫هذين المثالين جدول الكتب ‪ Books table‬الغير مو َّضح هنا‪ ،‬وال ذي يحت وي على حق ول‪ ،‬وهي‪ :‬العن وان ‪،Title‬‬

‫والكمية ‪ ،Quantity‬وسعر الكتاب ‪ ،Price‬وكل ناشر لديه جدول كتب يعطي قائم ًة بجميع كتب الناشر‪.‬‬

‫يستخ ِدم المثال رقم ‪ 6‬القيمة ‪:NULL‬‬

‫‪SELECT price, title‬‬
‫‪FROM Books‬‬
‫‪WHERE price IS NULL‬‬

‫يستخ ِدم المثال رقم ‪ 7‬القيمة ‪:NOT NULL‬‬

‫‪SELECT price, title‬‬
‫‪FROM Books‬‬
‫‪WHERE price IS NOT NULL‬‬

‫‪134‬‬

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫‪ 13.1.2‬استخدام محارف البدل ‪ wildcards‬في شرط ‪LIKE‬‬

‫يح ِّدد الشرط ‪ LIKE‬الصفوف التي تحتوي على الحقول التي تطابق أجزا ًء محددة من سلاس ل محرفي ة‪ ،‬كم ا‬
‫يُستخ َدم الشرط ‪ LIKE‬مع البيانات التي هي من النوع ‪ ،char‬و‪ ،varchar‬و‪ ،text‬و‪ ،datetime‬و‪.smalldatetime‬‬

‫يسمح محرف البدل ‪ wildcard‬للمستخ ِدم بمطابقة الحقول التي تحتوي على محارف معينة‪ ،‬حيث سيعطي‬
‫محرف البدل '‪ province = 'N%‬جميع المقاطعات التي تبدأ بالمحرف ‪.N‬‬

‫يو ِّضح الجدول أربعة طرائق لتحديد محارف البدل في تعليمة ‪ SELECT‬في صيغة التعبير المنتظم‪:‬‬

‫نتيجة استخدامه‬ ‫محرف البدل ‪wildcard‬‬

‫يمثل أ ّي سلسلة تتألف من صفر أو أكثر من المحارف‬ ‫‪%‬‬
‫_‬
‫يمثل أ ّي محرف واحد‬
‫[]‬
‫يمثل أ ّي محرف واحد ضمن مجال محدد مثل المجال‬
‫[‪،]a-f‬‬ ‫[^]‬

‫أو مجموعة مح َّددة مثل المجموعة [‪]abcdef‬‬

‫يمثل أي محرف واحد ليس ضمن مجال محدد مثل‬
‫المجال [‪،]^a-f‬‬

‫أو مجموعة مح َّددة مثل المجموعة [‪]^abcdef‬‬

‫تبحث التعليم ة '‪ LIKE 'Mc%‬في المث ال رقم ‪ 1‬عن جمي ع أس ماء العائل ة ‪ last names‬ال تي تب دأ‬
‫بالمحرفين "‪ "Mc‬مثل ‪:McBadden‬‬

‫‪SELECT LastName‬‬
‫‪FROM Employees‬‬
‫'‪WHERE LastName LIKE 'Mc%‬‬

‫تبحث التعليم ة '‪ LIKE '%inger‬في المث ال رقم ‪ 2‬عن جمي ع أس ماء العائل ة ال تي تنتهي‬
‫بالمحارف "‪ ،"inger‬مثل‪ ،Ringer :‬و‪:Stringer‬‬

‫‪SELECT LastName‬‬
‫‪FROM Employees‬‬
‫'‪WHERE LastName LIKE '%inger‬‬

‫تبحث التعليم ة '‪ LIKE '%en%‬عن جمي ع أس ماء العائل ة ال تي تحت وي على المح رفين "‪،"en‬‬
‫مثل‪ ،Bennett :‬و‪ ،Green‬و‪:McBadden‬‬

‫‪SELECT LastName‬‬
‫‪FROM Employees‬‬
‫'‪WHERE LastName LIKE '%en%‬‬

‫‪135‬‬

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫‪ 13.1.3‬تعليمة ‪ SELECT‬مع الشرط ‪ORDER BY‬‬

‫يُستخ َدم الشرط ‪ ORDER BY‬لترتيب السجلات في القائمة الناتجة‪ ،‬ويمكنك استخدام ‪ ASC‬لترتيب النت ائج‬
‫تصاعديًا‪ ،‬و ‪ DESC‬لترتيب النتائج تنازل ًيا‪.‬‬
‫يستخ ِدم المثال التالي ‪:ASC‬‬

‫* ‪SELECT‬‬
‫‪FROM Employees‬‬
‫‪ORDER BY HireDate ASC‬‬

‫يستخدم المثال التالي ‪:DESC‬‬

‫* ‪SELECT‬‬
‫‪FROM Books‬‬
‫‪ORDER BY type, price DESC‬‬

‫‪ 13.1.4‬تعليمة ‪ SELECT‬مع الشرط ‪GROUP BY‬‬

‫يُستخ َدم الشرط ‪ GROUP BY‬لإنشاء خرج هو عبارة عن صف واحد لكل مجموعة‪ ،‬وينتج قي ًما مو ِجز ًة للأعمدة‬
‫المح َّددة‪ ،‬كما هو مو َّضح أدناه‪:‬‬

‫‪SELECT type‬‬
‫‪FROM Books‬‬
‫‪GROUP BY type‬‬

‫يستخدم المثال التالي التعليمة السابقة‪:‬‬

‫'‪SELECT type AS 'Type', MIN(price) AS 'Minimum Price‬‬
‫‪FROM Books‬‬
‫‪WHERE royalty > 10‬‬
‫‪GROUP BY type‬‬

‫إذا تضمنت تعليمة ‪ SELECT‬معيار ‪ WHERE‬ليكون السعر ‪ price‬قيم ًة غير فارغة ‪ not null‬كما يلي‪:‬‬

‫‪SELECT type, price‬‬
‫‪FROM Books‬‬
‫‪WHERE price is not null‬‬

‫‪136‬‬

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫فستكون التعليمة التي تحتوي على شرط ‪ GROUP BY‬كما يلي‪:‬‬

‫'‪SELECT type AS 'Type', MIN(price) AS 'Minimum Price‬‬
‫‪FROM Books‬‬
‫‪WHERE price is not null‬‬
‫‪GROUP BY type‬‬

‫‪ 13.1.5‬استخدام ‪ COUNT‬مع ‪GROUP BY‬‬

‫يمكننا استخدام ‪ COUNT‬لإحصاء عدد العناصر الموجودة في حاوية ‪ ،container‬ولكن إذا أردت حس اب ع دد‬
‫عناص ر مختلف ة في مجموع ات منفص لة مث ل رخ ام ذي أل وان مختلف ة‪ ،‬فسنس تخ ِدم دال ة ‪ COUNT‬مع‬

‫الأمر ‪.GROUP BY‬‬

‫توضح تعليمة ‪ SELECT‬أدناه كيفية حساب عدد مجموعات من البيانات باستخدام دالة ‪ COUNT‬م ع الش رط‬
‫أو الأمر ‪:GROUP BY‬‬

‫)*(‪SELECT COUNT‬‬
‫‪FROM Books‬‬
‫‪GROUP BY type‬‬

‫‪ 13.1.6‬استخدام ‪ AVG‬و‪ SUM‬مع ‪GROUP BY‬‬

‫يمكننا استخدام دالة ‪ AVG‬لتعطينا متوسط أي مجموعة‪ ،‬وتُستخ َدم الدالة ‪ SUM‬لإعطاء المجموع‪.‬‬

‫يستخ ِدم المثال رقم ‪ 1‬التالي دالة ‪ AVG‬مع الشرط ‪:GROUP BY type‬‬

‫)‪SELECT AVG(qty‬‬
‫‪FROM Books‬‬
‫‪GROUP BY type‬‬

‫يستخ ِدم المثال رقم ‪ 2‬التالي دالة ‪ SUM‬مع الشرط ‪:GROUP BY type‬‬

‫)‪SELECT SUM(qty‬‬
‫‪FROM Books‬‬
‫‪GROUP BY type‬‬

‫يستخ ِدم المثال رقم ‪ 3‬كاًل من الدالتين ‪ ،AVG‬و‪ SUM‬مع الشرط ‪ GROUP BY type‬في تعليمة ‪:SELECT‬‬

‫‪SELECT 'Total Sales' = SUM(qty), 'Average Sales' = AVG(qty), stor_id‬‬
‫‪FROM Sales‬‬
‫'‪GROUP BY StorID ORDER BY 'Total Sales‬‬

‫‪137‬‬

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫‪ 13.1.7‬تقييد الصفوف مع ‪HAVING‬‬

‫يمكن استخدام الشرط ‪ HAVING‬لتقييد الصفوف‪ ،‬فهو يشبه شرط ‪ WHERE‬باستثناء أنه يتض ّمن دالة تجمي ع‬
‫‪aggregate function‬؛ إذ لا يس تطيع الش رط ‪ WHERE‬فع ل ذل ك‪ ،‬أي يتص رّف الش رط ‪ HAVING‬مثل‬

‫الشرط ‪ ،WHERE‬ولكنه قابل للتطبيق على المجموعات‪.‬‬
‫نستخدم في هذا المثال الشرط ‪ HAVING‬لاستبعاد المجموعات التي مقاطعتها '‪.'BC‬‬

‫'‪SELECT au_fname AS 'Author”s First Name', province as 'Province‬‬
‫‪FROM Authors‬‬
‫‪GROUP BY au_fname, province‬‬
‫'‪HAVING province <> 'BC‬‬

‫‪ 13.2‬تعليمة ‪INSERT‬‬

‫تضيف تعليمة ‪ INSERT‬صفو ًفا إلى جدول‪ ،‬وأي ًضا ما يلي‪:‬‬
‫• تح ِّدد تعليمة ‪ INSERT‬الجدول أو العرض ‪ view‬التي س ُتد َخل البيانات فيه‪.‬‬

‫• تعرض ‪ Column List‬قائم ًة بالأعمدة التي ستتأثر بتعليمة ‪.INSERT‬‬
‫• يجب توفير كل قيمة إذا حُ ِذف عمود‪.‬‬

‫• يمكن وضع الأعمدة في قائمة ضمن أي ترتيب إذا ض ّمنتها‪.‬‬
‫• تح ِّدد الكلمة ‪ VALUES‬البيانات التي تريد إدخالها في الجدول‪ ،‬وتكون ‪ VALUES‬إلزامية)‪.‬‬
‫• يجب ع دم إدراج الأعم دة ذات الخاص ية ‪ IDENTITY‬بص ورة ص ريحة في ‪column_list‬‬

‫أو ‪.values_clause‬‬
‫صيغة تعليمة ‪ INSERT‬هي‪:‬‬

‫]‪INSERT [INTO] Table_name | view name [column_list‬‬
‫‪DEFAULT VALUES | values_list | select statement‬‬

‫تُط َّبق القواعد التالية عند إدخال صفوف باستخدام تعليمة ‪:INSERT‬‬
‫• يؤدي إدخال سلسلة فارغة (' ') في عمود من النوع ‪ ،varchar‬أو ‪ text‬إلى إدخال مسافة واحدة‪.‬‬

‫• تُح َشى جميع الأعمدة ذات النوع ‪ char‬على اليمين ‪ right-padded‬لتصل إلى الطول المحدد‪.‬‬
‫• تُزال جميع المسافات الزائدة من البيانات المدرج ة في أعم دة من الن وع ‪ ،varchar‬باس تثناء السلاس ل‬

‫التي تحتوي على مسافات فقط‪ ،‬إذ تُخت َصر هذه السلاسل إلى مسافة واحدة فقط‪.‬‬

‫‪138‬‬

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫• إذا أخلَّت تعليمة ‪ INSERT‬بالقيد‪ ،‬أو الافتراض‪ ،‬أو القاع دة‪ ،‬أو إذا ك ان ن وع البيان ات خاطًئا‪ ،‬فستفش ل‬
‫هذه التعليمة‪ ،‬وسيعرض خادم ‪ SQL Server‬رسالة خطأ‪.‬‬

‫يمكن حدوث أحد الأشياء الثلاث ة التالي ة للأعم دة ال تي لا تحت وي على قيم عن د تحدي د قيم بعض الأعم دة‬
‫في ‪ column_list‬فقط‪:‬‬

‫‪ .1‬تُد َخل قيمة افتراضية إذا كان للعمود قيد ‪ ،DEFAULT‬أو إذا ك ان الاف تراض مرتب ط ب العمود‪ ،‬أو إذا ك ان‬
‫الافتراض مرتبط بنوع البيانات التي يعرِّفها المستخدم‪.‬‬

‫‪ .2‬تُد َخل القيم ة الفارغ ة ‪ NULL‬فق ط إذا س مح العم ود ب القيم الفارغ ة‪ ،‬ولا توج د قيم ة افتراض ية‬
‫موجودة للعمود‪.‬‬

‫‪ .3‬سوف تُع َرض رسالة خطأ ويُر َفض الصف إذا ُع َرِف العمود بأن ه غ ير ف ارغ ‪ ،NOT NULL‬ولا توج د قيم ة‬
‫افتراضية‪.‬‬

‫يستخ ِدم المثال التالي تعليمة ‪ INSERT‬لإضافة سجل إلى جدول الك ّتاب ‪:Authors‬‬

‫‪INSERT INTO Authors‬‬
‫‪VALUES('555-093-467', 'Martin', 'April', '281 555-5673', '816 Market‬‬
‫)‪St.,' , 'Vancouver', 'BC', 'V7G3P4', 0‬‬

‫يو ِّض ح المث ال الت الي كيفي ة إدخ ال ص ف ج زئي ‪ partial row‬في ج دول الناش رِين ‪ Publishers‬مع‬
‫قائمة أعمدة‪.‬‬

‫يملك عمود الدولة ‪ country‬قيمة افتراضية هي ‪ ،Canada‬لذلك لا يلزمك تضمينه في قيمك‪.‬‬

‫)‪INSERT INTO Publishers (PubID, PubName, city, province‬‬
‫)'‪VALUES ('9900', 'Acme Publishing', 'Vancouver', 'BC‬‬
‫اتبع المثال التالي لإدخال صفوف في جدول مع عم ود ‪ ،IDENTITY‬ولا تعطي قيم ًة للعم ود ‪،IDENTITY‬‬

‫ولا قيم ًة لاسم العمود ضمن قائمة الأعمدة‪.‬‬

‫‪INSERT INTO jobs‬‬
‫)‪VALUES ('DBA', 100, 175‬‬

‫‪ 13.2.1‬إدخال قيم محددة ضمن عمود ‪IDENTITY‬‬

‫لا يمكن إدخال البيانات مباشرة في عمود ‪ IDENTITY‬افتراض ًيا‪ ،‬ولكن إذا حُ ِذف ص ف خط ًأ‪ ،‬أو إذا ك انت‬
‫هناك ثغرات في قيم عمود ‪ ،IDENTITY‬فيمكنك إدخال صف وتحديد قيمة العمود ‪.IDENTITY‬‬

‫‪IDENTITY_INSERT option‬‬

‫‪139‬‬

‫تصميم قواعد البيانات‬ SQL ‫ الخاصة بلغة‬DML ‫لغة معالجة البيانات‬

:‫ مح َّددة‬identity ‫ على النحو التالي للسماح بإدخال قيمة هوية‬IDENTITY_INSERT ‫يمكن استخدام‬

SET IDENTITY_INSERT jobs ON
INSERT INTO jobs (job_id, job_desc, min_lvl, max_lvl)
VALUES (19, 'DBA2', 100, 175)
SET IDENTITY_INSERT jobs OFF

SELECT ‫ إدخال صفوف باستخدام عبارة‬13.2.2

.SELECT ‫ لذلك يمكننا إدخال صفوف مع تعليمة‬،‫يمكننا إنشاء جدول مؤقت صغير من جدول كبير‬

‫ ق د يك ون هن اك العدي د من‬،‫ وبالت الي‬،‫ عند استخدام ه ذا الأم ر‬uniqueness ‫لا يوجد تحقق لصحة التفرد‬
.‫ نفسه في المثال التالي‬pub_id ‫الصفوف بالمعرّف‬

‫ أص غر باس تخدام تعليم ة إنش اء‬tmpPublishers ‫ مؤقت هو‬Publishers ‫ين ِشئ هذا المثال جدول ناشرِين‬
‫ لإض افة س جلات إلى ج دول‬SELECT ‫ م ع تعليم ة‬INSERT ‫ ثم تُس تخ َدم تعليم ة‬،CREATE TABLE ‫ج دول‬

.Publishers ‫الناشرِين المؤقت من جدول الناشرين‬

CREATE TABLE dbo.tmpPublishers (
PubID char (4) NOT NULL ,
PubName varchar (40) NULL ,
city varchar (20) NULL ,
province char (2) NULL ,
country varchar (30) NULL DEFAULT ('Canada')
)
INSERT tmpPublishers
SELECT * FROM Publishers

:‫ننسخ في هذا المثال مجموع ًة فرعي ًة من البيانات‬

INSERT tmpPublishers (pub_id, pub_name)
SELECT PubID, PubName
FROM Publishers

:Canada ‫ إلى القيمة‬country ‫ ويُض َبط عمود الدولة‬tmpPublishers ‫تُن َسخ بيانات الناشرين هنا إلى جدول‬

INSERT tmpPublishers (PubID, PubName, city, province, country)
SELECT PubID, PubName, city, province, 'Canada'
FROM Publishers

140

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫‪ 13.3‬تعليمة ‪UPDATE‬‬

‫تغ ّي ر تعليم ة ‪ UPDATE‬البيان ات في الص فوف الموج ودة إم ا بإض افة بيان ات جدي دة أو بتع ديل البيان ات‬
‫الموجودة ساب ًقا‪.‬‬

‫يستخ ِدم المثال التالي تعليمة ‪ UPDATE‬لتوحيد حقل الدولة ‪ country‬ليكون ‪ Canada‬لجميع الس جلات في‬
‫جدول ‪:Publishers‬‬

‫‪UPDATE Publishers‬‬
‫'‪SET country = 'Canada‬‬

‫يزيد المثال التالي مبالغ حقوق المؤلف ‪ royalty‬التي قيمتها بين ‪ 10‬و‪ 20‬بنسبة ‪:%10‬‬

‫‪UPDATE roysched‬‬
‫)‪SET royalty = royalty + (royalty * .10‬‬
‫‪WHERE royalty BETWEEN 10 and 20‬‬

‫‪ 13.3.1‬تضمين استعلامات فرعية ‪ subqueries‬ضمن عبارة ‪UPDATE‬‬

‫يُم َنح الموظف ون في ج دول الم وظفين ‪ Employees‬ال ذين و ّظفهم الناش ر في ع ام ‪ 2010‬ترقي ًة إلى أعلى‬
‫مستوى وظيفي حسب نوع عملهم كما يلي‪:‬‬

‫‪UPDATE Employees‬‬
‫= ‪SET job_lvl‬‬
‫‪(SELECT max_lvl FROM jobs‬‬
‫)‪WHERE employee.job_id = jobs.job_id‬‬
‫‪WHERE DATEPART(year, employee.hire_date) = 2010‬‬

‫‪ 13.4‬تعليمة ‪DELETE‬‬

‫تزيل تعليمة ‪ DELETE‬صفو ًفا من مجموعة س جلات‪ ،‬كم ا تح ِّدد عب ارة ‪ DELETE‬الج دول أو الع رض ‪view‬‬
‫الذي يحوي الصفوف التي س ُتح َذف‪ ،‬ويمكن إدراج جدول أو صف واحد فقط في الوقت نفسه‪.‬‬

‫يُ َع ّد الشرط ‪ WHERE‬المعيار الذي يح ِّدد السجلات المراد حذفها‪ ،‬وتكون صيغة تعليمة ‪ DELETE‬كما يلي‪:‬‬

‫} ‪DELETE [FROM] { table_name | view_name‬‬
‫]‪[WHERE clause‬‬

‫‪141‬‬

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫قواعد تعليمة ‪ DELETE‬هي‪:‬‬
‫‪ .1‬إذا حُ ِذف شرط ‪ WHERE‬فس ُتزال جمي ع الص فوف الموج ودة في الج دول باس تثناء الفه ارس ‪،indexes‬‬

‫والجدول‪ ،‬والقيود‪.‬‬
‫‪ .2‬لا يمكن استخدام عبارة ‪ DELETE‬بعرض ‪ view‬يحتوي على شرط ‪ FROM‬يس ّمي أك ثر من ج دول واح د‪،‬‬

‫فتعليمة ‪ DELETE‬يمكن أن تؤثر على جدول أساسي فقط في الوقت نفسه‪.‬‬
‫فيما يلي ثلاث تعليمات ‪ DELETE‬مختلفة يمكن استخدامها‪:‬‬
‫• حذف جميع الصفوف من جدول‪:‬‬

‫‪DELETE‬‬
‫‪FROM Discounts‬‬

‫• حذف صفوف مح َّددة‪:‬‬

‫‪DELETE‬‬
‫‪FROM Sales‬‬
‫'‪WHERE stor_id = '6380‬‬

‫• حذف صفوف بنا ًء على قيمة ضمن استعلام فرعي‪:‬‬

‫‪DELETE FROM Sales‬‬
‫‪WHERE title_id IN‬‬
‫)'‪(SELECT title_id FROM Books WHERE type = 'mod_cook‬‬

‫‪ 13.5‬الدوال المبنية مسبقا ‪Built-in Functions‬‬

‫يوجد العديد من الدوال المبنية مسب ًقا في ‪ ،SQL Server‬مثل‪:‬‬
‫‪ .1‬دوال التجميع ‪ :Aggregate‬ترجع قي ًما مو ِجزة ‪.summary values‬‬
‫‪ .2‬دوال التحويل ‪ :Conversion‬تح ِّول نوع بيانات معين إلى نوع آخر‪.‬‬

‫‪ .3‬دوال التاريخ ‪ :Date‬تعرض معلومات عن التواريخ والأوقات‪.‬‬
‫‪ .4‬الدوال الرياضية ‪ :Mathematical‬تجري عمليات على البيانات العددية‪.‬‬
‫‪ .5‬الدوال المتعلِّقة بالسلاسل ‪ :String‬تجري عمليات على سلاسل المح ارف‪ ،‬أو على البيان ات الثنائي ة‪ ،‬أو‬

‫على التعابير‪.‬‬
‫‪ .6‬الدوال المتعلِّقة بالنظام ‪ :System‬ترجع معلومات من قاعدة البيانات‪.‬‬

‫‪142‬‬

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫‪ .7‬الدوال المتعلِّقة بالنصوص ‪ ،Text‬والص ور ‪ :image‬تج ري عملي ات على بيان ات نص ية‪ ،‬أو على بيان ات‬
‫الصور‪.‬‬

‫سنشرح أدناه الدوال الأربع الأولى شر ًحا مف َّصاًل مع أمثلة عنها‪.‬‬

‫‪ 13.5.1‬دوال التجميع ‪Aggregate functions‬‬

‫تجري دوال التجميع حسابات على مجموعة من القيم‪ ،‬وترجع قيم ًة واحد ًة أو قيم ًة مو ِجز ًة‪.‬‬
‫يعرض الجدول التالي هذه الدوال‪:‬‬

‫وصفها‬ ‫الدالة ‪FUNCTION‬‬

‫ترجع متوسط ‪ average‬جميع القيم‪ ،‬أو القيم المميزة‬ ‫‪AVG‬‬
‫‪ DISTINCT‬فقط‪ ،‬ضمن التعبير‬

‫ترجع عدد القيم غير الفارغة في التعبير‪ ،‬وإذا استخ ِدم‬ ‫‪COUNT‬‬
‫التمايز ‪ DISTINCT‬فستجد الدالة ‪ COUNT‬عدد القيم‬

‫غير الفارغة الفريدة‬

‫ترجع عدد الصفوف‪ ،‬ولا تأخذ الدالة (*)‪COUNT‬‬ ‫(*)‪COUNT‬‬
‫معاملات‪ ،‬كما لا يمكن استخدام التمايز ‪DISTINCT‬‬

‫معها‬

‫ترجع القيمة العليا في التعبير‪ ،‬ويمكن استخدام الدالة‬ ‫‪MAX‬‬
‫‪ Max‬مع الأعمدة ذات النوع العددي‪ ،‬والمحرفي‪،‬‬

‫والأعمدة ذات النوع ‪ ،datetime‬ولكنها لا تُستخ َدم مع‬
‫الأعمدة ذات النوع ‪ ،bit‬كما تعطي الدالة ‪ MAX‬مع‬
‫الأعمدة المحرفية أعلى قيمة في تسلسل مرتَّب‪،‬‬
‫وتتجاهل هذه الدالة القيم الفارغة‬

‫ترجع القيمة الدنيا في التعبير‪ .‬يمكن استخدام الدالة‬ ‫‪MIN‬‬

‫‪ MIN‬مع أعمدة عددية‪ ،‬ومحرفية‪ ،‬وذات النوع‬
‫‪ ،datetime‬ولكنها لا تُستخ َدم مع أعمدة لها النوع ‪،bit‬‬

‫كما تعطي الدالة ‪ MIN‬مع الأعمدة المحرفية أعلى قيمة‬
‫في تسلسل مرتَّب‪ ،‬وتتجاهل هذه الدالة القيم الفارغة‬

‫ترجع مجموع كل القيم‪ ،‬أو فقط القيم المميزة‬ ‫‪SUM‬‬
‫‪ DISTINCT‬في التعبير‪ ،‬ويمكن استخدام الدالة ‪SUM‬‬

‫مع الأعمدة العددية فقط‬

‫سنعرض فيما يلي أمثل ًة عن كل من دوال التجميع الموجودة في الجدول السابق‪.‬‬

‫• المثال الأول‪ :‬الدالة ‪AVG‬‬

‫'‪SELECT AVG (price) AS 'Average Title Price‬‬
‫‪FROM Books‬‬

‫‪143‬‬

‫تصميم قواعد البيانات‬ SQL ‫ الخاصة بلغة‬DML ‫لغة معالجة البيانات‬

COUNT ‫ الدالة‬:‫• المثال الثاني‬

SELECT COUNT(PubID) AS 'Number of Publishers'
FROM Publishers

COUNT ‫ الدالة‬:‫المثال الثالث‬

SELECT COUNT(province) AS 'Number of Publishers'
FROM Publishers

COUNT )*( ‫ الدالة‬:‫• المثال الرابع‬

SELECT COUNT(*)
FROM Employees
WHERE job_lvl = 35

MAX ‫ الدالة‬:‫• المثال الخامس‬

SELECT MAX (HireDate)
FROM Employees

MIN ‫ الدالة‬:‫• المثال السادس‬

SELECT MIN (price)
FROM Books

SUM ‫ الدالة‬:‫• المثال السابع‬

SELECT SUM(discount) AS 'Total Discounts'
FROM Discounts

Conversion function ‫ دالة التحويل‬13.5.2

.‫تح ّول دالة التحويل نوع بيانات معين إلى نوع بيانات آخر‬
‫ حيث تك ون‬،‫ إلى خمسة مح ارف في المث ال الآتي‬99 ‫ الذي يحتوي ضمنه على تسعتين‬price ‫يُح َّول السعر‬

:‫صيغة التعليمة بالصورة التالية‬

SELECT 'The date is ' + CONVERT(varchar(12), getdate())

:‫إليك مثال‬

144

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫)‪SELECT CONVERT(int, 10.6496‬‬
‫‪SELECT title_id, price‬‬
‫‪FROM Books‬‬
‫'‪WHERE CONVERT(char(5), price) LIKE '%99%‬‬

‫تغ ِّير دالة التحويل في المثال التالي البيانات إلى نوع بيانات بحجم مختلف‪:‬‬

‫'‪SELECT title_id, CONVERT(char(4), ytd_sales) as 'Sales‬‬
‫‪FROM Books‬‬
‫'‪WHERE type LIKE '%cook‬‬

‫‪ 13.5.3‬دالة التاريخ ‪Date function‬‬

‫تُنتج دال ة الت اريخ تاريخً ا عن طري ق إض افة فاص ل زم ني إلى ت اريخ مح َّدد‪ ،‬والنتيج ة هي قيم ة لها‬
‫نوع ‪ ،datetime‬وتساوي التاريخ مضا ًفا إليه عدد أجزاء التاريخ ‪.date parts‬‬

‫إذا ك ان معام ل دال ة الت اريخ قيم ًة من الن وع ‪ ،smalldatetime‬فس تكون النتيج ة قيم ًة من‬
‫النوع ‪ smalldatetime‬أي ًضا‪.‬‬

‫تُستخ َدم الدالة ‪ DATEADD‬لإضافة وزيادة قيم التاريخ‪ ،‬وصيغة هذه الدالة هي‪:‬‬

‫)‪DATEADD(datepart, number, date‬‬

‫إليك مثال‪:‬‬

‫)‪SELECT DATEADD(day, 3, hire_date‬‬
‫‪FROM Employees‬‬

‫يستخ ِدم المثال الآتي الدالة (‪ ،DATEDIFF(datepart, date1, date2‬ويعيد هذا الأمر ع دد أج زاء‬
‫التاريخ أو "الحدود" ‪ boundaries‬المتقاطعة بين تاريخَين محددين‪.‬‬

‫تجعل طريقة حساب الحدود المتقاطعة النتيجة التي أعطته ا الدال ة ‪ DATEDIFF‬متوافق ة م ع جمي ع أن واع‬
‫البيانات‪ ،‬مثل الدقائق‪ ،‬والثواني‪ ،‬والميلي ثانية‪.‬‬

‫)'‪SELECT DATEDIFF(day, HireDate, 'Nov 30 1995‬‬
‫‪FROM Employees‬‬

‫يمكننا فحص أي جزء من تاريخ مع َّين من السنة إلى الميلي ثانية‪.‬‬
‫يع رض الج دول الت الي أج زاء الت اريخ ‪ ،DATEPART‬واختص اراتها‪ ،‬وقيمه ا المقبول ة ال تي يع ترف بها‬

‫خادم ‪.SQL Server‬‬

‫‪145‬‬

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫قيمه ‪VALUES‬‬ ‫اختصاره ‪ABBREVIATION‬‬ ‫جزء التاريخ ‪DATE PART‬‬
‫‪1753-9999‬‬ ‫‪yy‬‬ ‫‪Year‬‬
‫‪1-4‬‬ ‫‪qq‬‬
‫‪1-12‬‬ ‫‪mm‬‬ ‫‪Quarter‬‬
‫‪1-366‬‬ ‫‪dy‬‬ ‫‪Month‬‬
‫‪1-31‬‬ ‫‪dd‬‬ ‫‪Day of year‬‬
‫‪1-53‬‬ ‫‪wk‬‬
‫‪dw‬‬ ‫‪Day‬‬
‫)‪1-7 (Sun.-Sat.‬‬ ‫‪hh‬‬ ‫‪Week‬‬
‫‪0-23‬‬ ‫‪mi‬‬ ‫‪Weekday‬‬
‫‪0-59‬‬ ‫‪ss‬‬ ‫‪Hour‬‬
‫‪0-59‬‬ ‫‪ms‬‬ ‫‪Minute‬‬
‫‪0-999‬‬ ‫‪Second‬‬
‫‪Millisecond‬‬

‫‪ 13.5.4‬الدوال الرياضية ‪Mathematical functions‬‬

‫تجري الدوال الرياضية عمليات على البيانات العددية‪ ،‬ويعرض المثال التالي السعر الحالي لكل كتاب يبيع ه‬
‫الناشر‪ ،‬كما يعرض ما سيكون عليه الأمر إذا ارتفعت جميع الأسعار بنسبة ‪:%10‬‬

‫‪SELECT Price, (price * 1.1) AS 'New Price', title‬‬
‫‪FROM Books‬‬
‫)‪SELECT 'Square Root' = SQRT(81‬‬
‫)‪SELECT 'Rounded' = ROUND(4567.9876,2‬‬
‫)‪SELECT FLOOR (123.45‬‬

‫‪ 13.6‬ضم الجداول ‪Joining Tables‬‬

‫يُ َع ّد ضم جدولين أو أكثر مثل عملية موازنة بيانات ضمن أعمدة مح َّددة‪ ،‬واس تخدام نت ائج الموازن ة لتش كيل‬
‫جدول جديد من الصفوف المؤهلة لذلك‪.‬‬
‫تقوم عبارة الضم ‪ join‬بما يلي‪:‬‬
‫• تح ِّدد عمو ًدا من كل جدول‪.‬‬

‫• توازن القيم الموجودة في تلك الأعمدة ص ًفا ص ًفا‪.‬‬
‫• تدمج الصفوف ذات القيم المؤهلة ضمن صف جديد‪.‬‬
‫تكون الموازنة عاد ًة مساوا ًة ‪-‬أي القيم التي تتطابق مع بعضها البعض تما ًما‪ ،-‬ولكن يمكن تحدي د أن واع ض م‬

‫أخرى أي ًضا‪.‬‬

‫‪146‬‬

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫سنشرح جميع أنواع الضم المختلف ة أدن اه‪ ،‬مث ل‪ :‬الض م ال داخلي ‪ ،inner‬واليس اري (الخ ارجي)‪ ،‬واليمي ني‬
‫(الخارجي)‪ ،‬والضم المتقاطع ‪.cross join‬‬

‫‪ 13.6.1‬الضم الداخلي ‪Inner join‬‬

‫يربط الضم الداخلي جدولين في عمود له نفس نوع البيانات‪ ،‬وينتج الصفوف التي تتطابق فيها قيم العم ود‬
‫فقط‪ ،‬حيث يجري تجاهل الصفوف التي لا مثيل لها‪.‬‬
‫المثال الأول‪:‬‬

‫‪SELECT jobs.job_id, job_desc‬‬
‫‪FROM jobs‬‬
‫‪INNER JOIN Employees ON emp‬‬
‫‪loyee.job_id = jobs.job_id‬‬
‫‪WHERE jobs.job_id < 7‬‬

‫المثال الثاني‪:‬‬

‫‪SELECT authors.au_fname, authors.au_lname, books.royalty, title‬‬
‫‪FROM authorsINNER JOIN titleauthor ON authors.au_id=titleauthor.au_id‬‬
‫‪INNER JOIN books ON titleauthor.title_id=books.title_id‬‬
‫‪GROUP BY authors.au_lname, authors.au_fname, title, title.royalty‬‬
‫‪ORDER BY authors.au_lname‬‬

‫‪ 13.6.2‬الضم اليساري الخارجي ‪Left outer join‬‬

‫ينتج عن الضم الخارجي اليساري كل الصفوف الخارجي ة اليس رى‪ ،‬إذ تُض َّمن جمي ع الص فوف من الج دول‬
‫الأيسر التي لا تح ّقق الشرط المح ّدد في مجموعة النتائج‪ ،‬وتُض َبط أعم دة الخ رج من الج دول الآخ ر على القيم ة‬

‫الفارغة ‪.NULL‬‬

‫يستخ ِدم المثال التالي الصيغة الجديدة للضم اليساري الخارجي‪:‬‬

‫‪SELECT publishers.pub_name, books.title‬‬
‫‪FROM Publishers‬‬
‫‪LEFT OUTER JOIN Books On publishers.pub_id = books.pub_id‬‬

‫بينما يستخ ِدم المثال التالي الصيغة القديمة للضم الخارجي اليساري‪:‬‬

‫‪147‬‬

‫تصميم قواعد البيانات‬ SQL ‫ الخاصة بلغة‬DML ‫لغة معالجة البيانات‬

SELECT publishers.pub_name, books.title
FROM Publishers, Books
WHERE publishers.pub_id *= books.pub_id

Right outer join ‫ الضم الخارجي الأيمن‬13.6.3

‫يت ّضمن الضم الخارجي الأيمن في مجموعة النتائج الخاص ة ب ه كاف ة الص فوف من الج دول الأيمن ال تي لا‬
.NULL ‫ وتُض َبط أعمدة الخرج المقابلة من الجدول الآخر على القيمة الفارغة‬،‫تح ّقق الشرط المح ّدد‬

:‫يستخ ِدم المثال التالي الصيغة الجديدة للضم الخارجي الأيمن‬

SELECT titleauthor.title_id, authors.au_lname, authors.au_fname
FROM titleauthor
RIGHT OUTER JOIN authors ON titleauthor.au_id = authors.au_id
ORDERY BY au_lname

:‫بينما يو ِّضح المثال التالي الصيغة القديمة المستخ َدمة للضم الخارجي الأيمن‬

SELECT titleauthor.title_id, authors.au_lname, authors.au_fname
FROM titleauthor, authors
WHERE titleauthor.au_id =* authors.au_id
ORDERY BY au_lname

Full outer join ‫ الضم الخارجي الكامل‬13.6.4

،‫يح ِّدد الضم الخ ارجي الكام ل أن ه في حال ة ع دم تط ابق ص ف من أي من الج دولين م ع مع ايير التحدي د‬
‫ وتُض َبط أعمدة الخ رج الخاص ة ب ه ال تي تتواف ق م ع الج دول الآخ ر إلى‬،‫فس ُيض َّمن الصف في مجموعة النتائج‬

.NULL ‫القيمة الفارغة‬

:‫فيما يلي مثال عن ضم خارجي كامل‬

SELECT books.title, publishers.pub_name, publishers.province
FROM Publishers
FULL OUTER JOIN Books ON books.pub_id = publishers.pub_id
WHERE (publishers.province <> “BC” and publishers.province <> “ON”)
ORDER BY books.title_id

148

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫‪ 13.6.5‬الضم المتقاطع ‪Cross join‬‬

‫الضم المتقاطع هو ناتج دمج جدولين‪ ،‬وينتج عن هذا الضم ص فوف حال ة ع دم اس تخدام الش رط ‪WHERE‬‬
‫نفسها‪ ،‬أي كما يلي‪:‬‬

‫‪SELECT au_lname, pub_name,‬‬
‫‪FROM Authors CROSS JOIN Publishers‬‬

‫‪ 13.7‬مصطلحات أساسية‬

‫• دالة التجميع ‪ :aggregate function‬تعيد قي ًما مو ِجزة‪.‬‬
‫• ‪ :ASC‬ترتيب تصاعدي‪.‬‬

‫• دالة التحويل ‪ :conversion function‬تح ّول نوع بيانات مع َّين إلى نوع بيانات آخر‪.‬‬
‫• الضم المتقاطع ‪ :cross join‬ناتج دمج جدولين‪.‬‬

‫• دالة التاريخ ‪ :date function‬تعرض معلومات عن التواريخ والأوقات‪.‬‬
‫• تعليمة ‪ :DELETE‬تزيل صفو ًفا من مجموعة سجلات‪.‬‬
‫• ‪ :DESC‬ترتيب تنازلي‪.‬‬

‫• الضم الخارجي الكامل ‪ :full outer join‬يح ِّدد الحالة التي لا يتطابق فيها صف من أي جدول مع‬
‫معايير الاختيار‪.‬‬

‫• ‪ :GROUP BY‬وهي تُستخ َدم من أجل إنشاء صف خرج واحد لكل مجموعة‪ ،‬وتنتج قي ًما مو ِجز ًة‬
‫للأعمدة المختارة‪.‬‬

‫• الضم الداخلي ‪ :inner join‬يربط جدولين من خلال عمود له نوع البيانات نفسه‪.‬‬
‫• تعليمة ‪ :INSERT‬يضيف صفو ًفا إلى جدول‪.‬‬

‫• الضم الخارجي اليساري ‪ :left outer join‬يُن ِتج جميع الصفوف الخارجية اليسرى‪.‬‬
‫• الدالة الرياضية ‪ :mathematical function‬تجري عمليات على البيانات العددية‪.‬‬
‫• الضم الخارجي اليميني ‪ :right outer join‬يتضمن جميع الصفوف من الجدول الأيمن الذي لم يحقق‬

‫الشرط المح َّدد‪.‬‬
‫• تعليمة ‪ :SELECT‬تُستخ َدم للاستعلام عن البيانات في قاعدة البيانات‪.‬‬

‫‪149‬‬

‫تصميم قواعد البيانات‬ ‫لغة معالجة البيانات ‪ DML‬الخاصة بلغة ‪SQL‬‬

‫• الدالة المتعلِّقة بالسلاسل ‪ :string function‬تجري عمليات على سلاسل المحارف‪ ،‬أو البيانات‬
‫الثنائية‪ ،‬أو التعابير‪.‬‬

‫• الدالة المتعلِّقة بالنظام ‪ :system function‬تعيد معلومات من قاعدة البيانات‪.‬‬

‫• الدوال المتعلقة بالنصوص والصور ‪ :text and image functions‬تجري عمليات على البيانات‬
‫النصية وبيانات الصور‪.‬‬

‫• تعليمة ‪ :UPDATE‬تغ ّير البيانات في الصفوف الموجودة إما بإضافة بيانات جديدة‪ ،‬أو بتعديل‬
‫البيانات الموجودة‪.‬‬

‫• محرف البدل ‪ :wildcard‬يسمح للمستخ ِدم بمطابقة الحقول التي تحتوي على محارف معينة‪.‬‬

‫‪ 13.8‬تمارين‬

‫استخ ِدم نموذج قاعدة البيانات ‪ PUBS‬الذي أنشأته مايكروسوفت لحل لأسئلة التالية‪:‬‬
‫‪ .1‬اعرض قائم ًة بتواريخ النشر والعناوين (الكتب) التي نُشرِت في عام ‪.2011‬‬

‫‪ .2‬اعرض قائم ًة بعناوين الكتب ال ُمص َّنفة على أساس كتب طبخ تقلي دي‪ ،‬أو كتب طبخ ح ديث باس تخدام‬
‫جدول الكتب ‪.Books‬‬

‫‪ .3‬اعرض جميع المؤلفين ‪ authors‬الذين تتألف أسماؤهم الأولى من خمسة أحرف‪.‬‬

‫‪ .4‬اع رض من ج دول الكتب‪ :‬الن وع ‪ ،type‬والس عر ‪ ،price‬والمع رِّف ‪ ،Pub_id‬وعن وان ‪ title‬الكتب ال تي‬
‫وضعها كل ناشر‪ ،‬ثم أ ِع ْد تسمية عمود النوع ‪ type‬ليصبح فئة الكت اب ‪ ،Book Category‬ورتّب ه حس ب‬

‫النوع ‪ type‬تنازل ًيا‪ ،‬ثم حسب السعر ‪ price‬تصاعديًا‪.‬‬
‫‪ .5‬اع رض الحق ل ‪ ،title_id‬والحق ل ‪ ،pubdate‬والحق ل ‪ pubdate‬مض ا ًفا إلي ه ثلاث ة أي ام‪ ،‬باس تخدام‬

‫جدول الكتب‪.‬‬

‫‪ .6‬ح ِّدد باستخدام الدالتين ‪ ،datediff‬و‪ getdate‬مقدار الوقت المنقضي (مق َّد ًرا بالأشهر) من ذ نش ر الكتب‬
‫في جدول الكتب‪.‬‬

‫‪ .7‬اع رض قائم ًة بمعرِّف ات العن اوين ‪ ،title ID‬وكمي ة ‪ quantity‬جمي ع الكتب ال تي بي ع منه ا أك ثر‬
‫من ‪ 30‬نسخة‪.‬‬

‫‪ .8‬اعرض قائم ًة بجميع أسماء عائلات الم ؤلفين ال ذين يعيش ون في أونت اريو ‪- Ontario‬أو ‪ ON‬اختص ا ًرا‪،-‬‬
‫والمدن التي يعيشون فيها‪.‬‬

‫‪150‬‬


Click to View FlipBook Version