مشاهدة النسخة كاملة : الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء
The Coder
06-11-2005, 02:45 AM
بسم الله الرحمن الرحيم
مقدمة :
الحمد لله رب العالمين .. والصلاة والسلام على اشرف الانبياء والمرسلين .. سيدنا محمد وعلى اله وصحبه اجمعين .. وبعد ,,
محال ان تجبر شخص على عمل شيء لا يريده ...
ولما كان هذا الامر , يعد ضربا من المستحيل فانني لست الا موجها ومدربا ومعين لك في طريقك لاحتراف برمجة قواعد البيانات اوراكل , وحامل عنك عناء البحث , ومصححا لعثراتك
وكل ما لدي قوله هو ان تساعد نفسك اولا .. فانا لا استطيع مساعدتك طالما لم ترد انت ذلك ...
وكلي ثقة انني سوف أساعدك على مساعدة نفسك ... بكل ما لدي من طاقة ... وان اترجم طاقاتك ابداعا ..
سأحاول بقدر المستطاع ان اجعلك تحصل على شهادة مطور اوراكل , وان اجعلك جديرا بحملها ,
ان اصبت فمن الله ... وان اخطأت فمن نفسي ومن الشيطان , فلا خير فيني ان لم اعترف بخطأي ... ولا خير فيكم ان لم تقوموني
المؤلف ,,
The Coder
06-11-2005, 02:49 AM
معلومات عن المؤلف :
لا معلومات ... غير ان اسمي حمزة ..... ولي خبرة في الاوراكل ..
تستطيع ان تقول .... "فاعل خير"
The Coder
06-11-2005, 02:51 AM
ملاحظات هامة جدا :
- استفسارات الدورة ... هنا على هذا الرابط :
http://www.montada.com/showthread.php?p=4304677#post4304677
- قد تجد بعض الصور مختفية او مفقودة , ماذا تفعل ؟ كل ما تفعله ان تأخذ ارقام الصور المفقودة , ثم تراسلني لكي ارسلها لك واصححها في الموضوع .
- قد تجد وصلات لا تعمل .. ماذا تقعل ؟ كل ما تفعله هو ان تأخذ ارقام الوصلات المفقودة , وتراسلني لكي ارسلها لك و اصححها في الموضوع .
- ليس كل ما أقوله قران منزل لا خطأ فيه ... قد اصيب او اخطئ !! لكن لا تخف .. سأشير الى النقاط التي لست متأكدا منها .. وما عداها فهي ان شاء الله صائبة ,,,
- اذا شاهدت خطأ ما .. فراسلني او اعرض خطأك في الموضوع ,,,
- اذا صعب عليك شيء ... راسلني او اعرض ما صعب عليك في الموضوع ..
- بعد انتهاء الدورة .. سوف اجمع الدروس واجعلها كتابا الكترونيا مجانا ..
- سوف اشير الى المصادر التي اخذت منها ... فترقبها
- اعتمدت المصادر العربية لكي يسهل عليك كعربي ان تراجعها .. وسوف ارسلها لك فيما بعد ... وسأرسل ايضا مصادر اجنبية ان شاء الله ,,
- ستلاحظ في دورتي الكثير الكثير من الامثلة .. والتي تسهل عليك فهم المادة ..
- ستلاحظ ان طرح الدروس غير منتظم .. مثل ان اطرح في الاسبوع الاول 7 دروس و الاسبوع الثاني درسين على سبيل المثال .. وهلم جر .. والسبب قد انشغل في بعض الاحيان .
- اذا لم يعجبك طريقة الشرح .. ارسل لي طريقة ترتاح لها انت .. او ارسل لي النقطة التي تزعجك !!
- لا تستحي من طرح أي شيء تريده ...
- ارجو عدم طرح أي رد ... لا اريد ان ارى "مشكور ما قصرت" ولا "الى الامام" او أي كلمات اخرى لا تغني او تسمن من جوع ,, الا اذا كان استفسار او تنبيه لنقطة او شيء من هذا القبيل
- ستجد الدروس على شكل ملف PDF وايضا على شكل رد في هذا الموضوع .. انتظر الملفات
- الواجبات ارسلها لي على الخاص او ارسلها لي على الايميل .... وحلها سوف تجده بعد المدة التي اراها انا .. انها مناسبة .. سوف احدد التاريخ ,,,
- اريد منك شيء واحد ... ان تجلس لمدة 60 ثانية من عمرك .. تدعي لي ولنفسك ولسائر المسلمين .. بس هاااااه .. لا تقول "جزاك الله خير " وخلاص !! ... ابيها من صميم قلبك .. مؤمن بأن الله يجيب دعوتك ...
- هذا كل ما لدي الان .. واي استفسار .. انا حاضر
بعد انتهاء الدورة .. سوف اجمع الدروس واجعلها كتابا الكترونيا مجانا ..</U></FONT></FONT>
- سوف اشير الى المصادر التي اخذت منها ... فترقبها
- اعتمدت المصادر العربية لكي يسهل عليك كعربي ان تراجعها .. وسوف ارسلها لك فيما بعد ... وسأرسل ايضا مصادر اجنبية ان شاء الله ,,
- ستلاحظ في دورتي الكثير الكثير من الامثلة .. والتي تسهل عليك فهم المادة ..
- ستلاحظ ان طرح الدروس غير منتظم .. مثل ان اطرح في الاسبوع الاول 7 دروس و الاسبوع الثاني درسين على سبيل المثال .. وهلم جر .. والسبب قد انشغل في بعض الاحيان .
- اذا لم يعجبك طريقة الشرح .. ارسل لي طريقة ترتاح لها انت .. او ارسل لي النقطة التي تزعجك !!
- لا تستحي من طرح أي شيء تريده ...
- ارجو عدم طرح أي رد ... لا اريد ان ارى "مشكور ما قصرت" ولا "الى الامام" او أي كلمات اخرى لا تغني او تسمن من جوع ,, الا اذا كان استفسار او تنبيه لنقطة او شيء من هذا القبيل
- ستجد الدروس على شكل ملف PDF وايضا على شكل رد في هذا الموضوع .. انتظر الملفات
- الواجبات ارسلها لي على الخاص او ارسلها لي على الايميل .... وحلها سوف تجده بعد المدة التي اراها انا .. انها مناسبة .. سوف احدد التاريخ ,,,
- اريد منك شيء واحد ... ان تجلس لمدة 60 ثانية من عمرك .. تدعي لي ولنفسك ولسائر المسلمين .. بس هاااااه .. لا تقول "جزاك الله خير " وخلاص !! ... ابيها من صميم قلبك .. مؤمن بأن الله يجيب دعوتك ...
- هذا كل ما لدي الان .. واي استفسار .. انا حاضر
JAVA
The Coder
06-11-2005, 02:54 AM
الخطة الحالية :
-مقدمة عن قواعد البيانات ,,
-لغة الـ SQL
-لغة الـ PL\SQL
-الـ Forms
-الـ Reports
-دروس في بناء وتصميم قواعد البيانات
- - ماهية قواعد البيانات
من الممكن ان اضع دروس بناء وتصميم قواعد البيانات في البداية قبل لغة الـ SQL
اما من ناحية ماهية قواعد البيانات وبصراحة ... سوف اقوم بالبحث عن ماهية قواعد البيانات لأنني لم ابرمجها .. فسأحاول معرفة ماهيتها لكي اشرحها لكم بكل يسر وسهولة ,, لذا لن اطيل في تعريف قواعد البيانات كثيرا , وقصدي في ماهية قواعد البيانات .. طريقة برمجتها + كيفية عملها تقنيا .
The Coder
06-11-2005, 03:04 AM
الدرس الاول :
مقدمة عن قواعد البيانات
-----------------------------------------------------------------
المتوقع منك :
- فكرة بسيطة جدا عن قواعد البيانات
- معرفة نظام قواعد البيانات المتبع في منهجنا ... الا وهو " نظام قواعد البيانات العلائقية"
- معرفة نظام ادارة قواعد البيانات
- معرفة المكونات الخاصة بنظام قواعد البيانات
---------------------------------------------------------------
· ماهي قواعد البيانات؟...ولماذا قواعد بيانات ؟؟
لا يخفى علينا اهمية البيانات لاي مؤسسة ولاي غرض كان ...
مثلا نريد بيانات الطلاب في جامعة ما , لكل طالب له بياناته الخاصة ,مثل (اسم الطالب , رقمه الجامعي .....الخ)
الان نسمي كل بيان من بيانات الطالب بـ "حقل"(Field) , يعني حقل اسم الطالب , حقل الرقم الجامعي ,
الان نجمع هذه الحقول , لينتج ما يسمى بـ "سجل"(Record) , سجل الطالب احمد او بيانات الطالب احمد ...
الان لدينا سجل لاحمد ومحمد وصالح وفارس وكل الطلبة بالجامعة
اذا جمعنا جميـــــــــــع السجلات ... نتج ما يسمى بـ "قواعد البيانات" (DATABASE)
يعني ان قواعد البيانات هي مجموعة من البيانات والمعلومات مخزنة بطريقة نموذجية وخاصة ودون تكرار والمتصلة مع بعضها وفق علاقات متبادلة .
- اكتفي الان بأنها طريقة نموذجية وخاصة !!
- مع الملاحظ اننا بقدر الامكان ان لا نكرر البيانات .. حتى لا تكبر مساحة قاعدة البيانات .
- لاحظ شيء مهم جدا جدا جدا .. قواعد البيانات مجرد ملف .. ملف عااادي جدا .. ولكن تركيبته خاصة جدا وسوف اشرحها فيما بعد ان شاء الله
· قواعد البيانات العلائقية :
قام علماء قواعد البيانات بتطوير قواعد البيانات .. وظهرت اشكال وانظمة عديدة لقواعد البيانات .. واشهر هذه الانظمة هي "نظام قواعد البيانات العلائقية" (علائقية ؟؟ ما معنى هذه الكلمة)
فكرة قواعد البيانات العلائقية هي .. مجرد جداول ...
جداول عديدة .. بينها علاقات (Relations)... (كيف ذلك ؟؟)
<ew Roman">- معرفة المكونات الخاصة بنظام قواعد البيانات </FONT>
---------------------------------------------------------------
· ماهي قواعد البيانات؟...ولماذا قواعد بيانات ؟؟
لا يخفى علينا اهمية البيانات لاي مؤسسة ولاي غرض كان ...
مثلا نريد بيانات الطلاب في جامعة ما , لكل طالب له بياناته الخاصة ,مثل (اسم الطالب , رقمه الجامعي .....الخ)
الان نسمي كل بيان من بيانات الطالب بـ "حقل"(Field) , يعني حقل اسم الطالب , حقل الرقم الجامعي ,
الان نجمع هذه الحقول , لينتج ما يسمى بـ "سجل"(Record) , سجل الطالب احمد او بيانات الطالب احمد ...
الان لدينا سجل لاحمد ومحمد وصالح وفارس وكل الطلبة بالجامعة
اذا جمعنا جميـــــــــــع السجلات ... نتج ما يسمى بـ "قواعد البيانات" (DATABASE)
يعني ان قواعد البيانات هي مجموعة من البيانات والمعلومات مخزنة بطريقة نموذجية وخاصة ودون تكرار والمتصلة مع بعضها وفق علاقات متبادلة .
- اكتفي الان بأنها طريقة نموذجية وخاصة !!
- مع الملاحظ اننا بقدر الامكان ان لا نكرر البيانات .. حتى لا تكبر مساحة قاعدة البيانات .
- لاحظ شيء مهم جدا جدا جدا .. قواعد البيانات مجرد ملف .. ملف عااادي جدا .. ولكن تركيبته خاصة جدا وسوف اشرحها فيما بعد ان شاء الله
· قواعد البيانات العلائقية :
قام علماء قواعد البيانات بتطوير قواعد البيانات .. وظهرت اشكال وانظمة عديدة لقواعد البيانات .. واشهر هذه الانظمة هي "نظام قواعد البيانات العلائقية" (علائقية ؟؟ ما معنى هذه الكلمة)
فكرة قواعد البيانات العلائقية هي .. مجرد جداول ...
جداول عديدة .. بينها علاقات (Relations)... (كيف ذلك ؟؟)
بمجرد وضع صفوف واعمدة ... العمود الواحد يمثل الحقل !! والصف الواحد يمثل سجل !!
انظر الصورة (11)
http://www.w6w.net/upload2/21-11-2005/w6w_20051121011950127cfb97.JPG
هذا جدول الطلاب او قواعد البيانات الخاصة بالطلبة و به معلومات عن الطلبة ...
ونعمل جدول اخر للكليات مثلا وبه معلومات للكليات ... وجدول ثالث للمواد .... وهكذا ..
نقاط مهمة عن نظام قواعد البيانات العلائقية :
- نظام قواعد البيانات العلائقية اشهر واقوى الانظمة والتي تعتمد عليه اغلب برامج قواعد البيانات ومن ضمنها اوراكل
- لماذا هذا النظام بهذه القوة ؟
- لانه يستوعب قدر كبير جدا من البيانات
- لان ادائه من ناحية السرعة والدقة .. لا تتأثران مع كمية البيانات الضخمة
- لانه يتمتع بالسرية التامة والامان لاحتوائه على نظام اعطاء الصلاحيات
* نظام ادارة قاعدة البيانات DBMS (اختصار لـ Database Management Information System )
عبارة عن برامج .. والتي تعتبر حلقة الوصل بين المستخدم (المستخدم ؟؟ ومن هو المستخدم يا ترى؟) وقاعدة البيانات .
البرامج هذه تعدل على البيانات وتضيف وتحذف وتخزن البيانات , أي انها تدير البيانات .
البرامج ايضا تستقبل طلبات المستخدمين و تنادي برامج اخرى تنفذ العملية والطلب على قواعد البيانات .. ومن ثم ترجع بالنتيجة الى المستخدم .. مثل مستخدم طلب معلومات الطالب احمد .. هذه البرامج متكفلة باحضار معلومات احمد من جدول الطلاب وتعرضها للمستخدم .
هذه البرامج تسمى DBMS
* مكونات نظام قواعد البيانات :
1- المكونات المادية
مثل الحاسبات المتصلة بقواعد البيانات , الطابعات , اجهزة الاتصالات ..... الخ
2- البرمجيات او البرامج .
وهي ثلاث اقسام ,
- نظام التشغيل مثل وندوز او ماكنتوش او لينيكس.....
- برنامج قواعد البيانات مثل الاوراكل او الاكسس ...
- برامج تطبيقية وبرامج اخرى مساعدة : مثل التي تستخرج التقارير مثلا لعرضها وطباعتها على ورق .. او برامج لتصميم النوافذ والواجهات ....الخ .
3- المستخدمون .
وهم كما يلي :
* مدير النظام : الذي يدير عمل البيئة ككل ومهامه :
- يقوم بمتابعة عمل النظام ,
- يدير اجهزة التخزين والاجهزة الاخرى
- يدير المستخدمين ويعطي الصلاحيات المناسبة لكل مستخدم .
* مدير قاعدة البيانات : يقوم بادارة قاعدة البيانات ومهامه :
- يحدد متطلبات قواعد البيانات من برامج وتجهيزات ,
- يتابع نظام قواعد البيانات .
- يوفر الامن للنظام
- يحافظ على قواعد البيانات ويوفر الخدمات للمستخدمين الاخرين
*مصمم قاعدة البيانات : وهو الشخص الذي يصمم قواعد البيانات ومهامه :
- تحدد البيانات الواجب تخزينها في قواعد البيانات
- تصميم افضل التراكيب لحفظ البيانات
- تصميم قاعدة بيانات خالية من التكرار
- يصمم الشاشات والتقارير بطريقة سهلة للوصول الى البيانات والتعامل معها
- توثيق عملية التصميم وطرق الوصول للبيانات
*المبرمجون ومحللو النظم : وهم الذين يقومون ببرمجة النظام ومهامهم :
- تصميم النظام وبرمجته باللغة او اللغات البرمجية المقررة
- اختبار تلك البرامج للتأكد من خلوها من الاخطاء
- صيانة البرامج .
* المستخدم النهائي : وهو الذي يقول باضافة البيانات والتعديل والحذف وووو .. ويقوم باستخدام النظام ... على سبيل المثال مدخل البيانات
4- الإجراءات والعمليات : بعض القوانين التي تحكم قواعد البيانات .. وتختلف من مؤسسة الى اخرى ,
5- البيانات : هي اهم المكونات .. وهي الحقائق المخزنة مثل اسماء الطلاب وارقامهم وبقية البيانات الاخرى ..
احب ان اشير الى ان المصمم لقواعد البيانات هو الذي يحدد مكان وتخزين البيانات هذه .
لا يوجد عندي اسئلة ... غير ان هذا ليس كل شيء عن قواعد البيانات .. وسوف يكون هناك المزيد ان شاء الله ,,,
The Coder
06-11-2005, 06:56 AM
احب ان اشير لشيء ..
لا ترد برد .. الا ذو نفع لنا ..
راجعو النقاط والملاحظات المهمة ,,,
ياسرر
06-11-2005, 12:53 PM
شكررررررررررررررررررررا
CHALLENGER
06-11-2005, 03:30 PM
لا ترد برد .. الا ذو نفع لنا ..
[size=7]size]
شكررررررررررررررررررررا
سبحان الله :)
اتمنى من المشرفين مسح الرد يلي قبلي و ردي كمان ما نريد ردود الا مفيدة او فيها سؤال
The Coder
07-11-2005, 06:29 AM
ايميلي :
اسف (hamzah79@hotmail.com) ,, يوجد ضغط عجيـــــــــــــــــــــب في ايميلي ... حنشوف لكم حل في مسألة الايميل قريبا ان شاء ربي
The Coder
09-11-2005, 04:23 AM
اقووووووول ..
لم يصلني الا ثلاث اشخاص !!!!!!
وين الناس .. لي يومين انتظر .... فين المعلومات الي طلبتهم ؟؟
على فكرة ... عندي قوانين جديدة .... جديرة بان تكون دورة على اسمها ...
1- انتم من يتحكم في سرعة طرح الدروس .. وليس انا ,.. اي انني من الممكن انتهي من الدرس .. ولن اطرحه حتى ارى التفاعل ...
2- الواجبات ... لازم يحلها على الاقل 10 اشخاص ... رغم انه يوجد اكثر من 25 شخص تكفلو بحل الواجبات ... اذا لم تصلني الحلول العشر على الاقل فسوف اطرح الدرس الي بعده .. ولن اطرح اي درس ... حتى تأتيني حلول .. او محاولات ...
3- يوجد عندي جدول بقائمة الاسماء او الالقاب التي تتابعني .... فأعرف من معي على الخط ... واعرف من لم يكن معي ....
4- لن احل الواجبات ابدا .. الا اذا جائتني العشر محاولات او الحلول ..
5- واخيرا ... كيفية الارسال ...
العنوان : !!!!!!!!!!!!!!!!!!
الرسالة :
الاسم او اللقب او اي شي يدل على وجود انسان يكلمني : _ _ _ _ _ _
العمر : __ ____ (يلزمني العمر .. لمعرفة على الاقل عقلية هذا الشخص.. واذا ارسل سابقا ... فلا داعي للعمر)
الواجب :
_ _ _ _ _
_ _ _ _ _
_ _ _ _ _
اسف على ازعاجكم ...
ولكن انا لا اكتب كتاب فقط .. انا اعمل دورة على الهواء مباشرة ^^
وعلى فكرة .. الدرس الثاني غدا اضعه ان شاء الله ...
ولا ارى اي وجود بشري لايميلي ...
تفاعلو حفظكم الله .. الزوار عددهم اكثر من المئة ....
The Coder
09-11-2005, 08:06 AM
بسم الله الرحمن الرحيم
الدرس الثاني
ملاحظة مهمة : ما بين القوسين تنبيه او ما اتوقعه من القاريء
اسم الدرس : مدخلك الى تصميم قواعد البيانات
نوع الدرس : نظري مع مفاهيم أساسية ...
صعوبة الدرس : *** من *****
الوقت المتوقع منك لفهم الدرس : ساعة و 30 دقيقة ربما تزيد كثيرا أو تنقص
متطلبات تتوفر فيك : تحمل على قراءة السطور .. وتفهمها لكي ترتاح مستقبلا
ملاحظات :
- قد لا تفهم بعض النقاط !! لا تخف .. سوف تعرفها بالتمرس والتكرار فيما بعد ,,
- أصابني التعب والإعياء في هذا الدرس الصغير , لكي اجعله مفهوم لدرجة أن الأبله يفهمه !
المتوقع منك في هذا الدرس :
- معرفة أكثر عن قواعد البيانات
- معرفة أكثر في قواعد البيانات العلائقية
- معرفة ما هو المفتاح الاساسي
- العلاقات وانواعها
- ماهو المفتاح الاجنبي
===================================
قواعد البيانات .. بتعمق :
تحدثنا عن قواعد البيانات وقلنا انه مجموعة من البيانات مخزنة بطريقة نموذجية دون تكرار والمتصلة مع بعضها وفق علاقات متبادلة .
وانها ملفات تركيبتها خاصة .. (لماذا لها هذه التركيبة الخاصة ؟) لكي تستوفي بعض الشروط وبعض المميزات سوف اذكر بعض منها .. بعد ان قرأتها في احد المذكرات الالكترونية من الكاتب "الاسيف" جزاه الله الف الف خير وبعض المميزات مايلي :
- عدم تكرار البيانات
- تجانس وتوافق البيانات : أي مهما حدث من تغيير في البيانات لا تتأثر بنية البيانات
- قابلية التطوير : بامكاننا ان نطور قاعدة البيانات بسهولة وبدون ان نحذف القديم
- استقلالية البيانات عن البرامج .
- السرية
- امكانية وصول اكثر من مستخدم لقواعد البيانات
ذكر لنا الاخ أسيف انه يوجد احد الانظمة القديمة التي تسمى بنظام الملفات التقليدية وهو نظام استخدم قبل قواعد البيانات.. كانوا يخزنون البيانات في ملفات مستقلة (مستقلة = لا يوجد بينها علاقة ) وبها عيوب وهي :
- التكرار :
مثلا للطلاب ملف خاص وبهذا الملف معلومات الطلاب . اسم الطالب , رقم الطالب , معدله ......
للمدرسين ملف خاص وبهذا الملف معلومات المدرسين . اسم المدرس , رقم المدرس , راتبه ....
طيب ... لو اردنا اسماء المدرسين الذين الطالب احمد ؟ او اسماء كل الطلبة الذين يدرسون عند المدرس خالد ؟ مالحل ؟ طبعا ملف ثالث وفيه اسماء الطلبة ومدرسيهم .. يعني تكراااااااار ...
سوف يتم كتابة معلومات الطلبة والمدرسين مرة اخرى في هذا الملف الثالث
ولا اعرف ما اذا كان في هذا النظام القديم يتم عمل ملف رابع وفيه اسماء المدرسين وطلبتهم ؟ ولكن لا نستغرب اذا كان هناك ملف رابع .
- عدم توافق البيانات
يجب ان لا نفقد تجانس وتوافق البيانات اذا عدلنا او اضفنا او حذفنا بيانات ,, لكن في مثالنا السابق.. قلنا انه يوجد ملف طلاب .. وملف مدرسين .. وملف الطلاب ومدرسينهم , فلو حذفنا طالب في ملف الطلاب ولم نحذفه في الملف الثالث (الملف المشترك بين الطلاب والمدرسين) فسوف نجد معلوماته في ملف و ولا نجده في الملف الاخر .
فهذه ميزة في قواعد البيانات , وهي عيب في نظام الملفات التقليدية .
- زيادة زمن بناء الانظمة :
لماذا الزمن يزيد مع هذا النظام ؟ لاننا سوف نلجأ الى انشاء ملفات كثيرة لتحقيق المتطلبات المختلفة .
- الحاجة المستمرة لاعادة هيكلة البرامج والملفات : أي ان التطوير صعب جدا .. يفرض علينا ان نغير ونبدل ونضحي عن بعض هيكلة البرامج والملفات القديمة .
==========================================
قواعد البيانات العلائقية ... بتعمق
تحدثنا عن نظام قواعد البيانات العلائقية .. وقلنا بأنه تمثيل البيانات بجداول ثنائية الابعاد (2D- Table ) , صفوفها سجلات , واعمدتها حقول .
الان اريدك ان تعرف مسمى للاعمدة .. لان المسميات مزعجة قليلا .. فمثلا Attribute" " (خصائص .. او صفات ).... فهي تخص الاعمدة .. أي ان الحقول (Field) هي نفسها خصائص هي نفسها صفات هي نفسها الاعمدة .
الان يجب ان نراعي في قاعدة البيانات العلائقية وجود المفاهيم التالية :
- اسم للجدول : مثل جدول الطالب , جدول المواد , جدول ......
- الصفات : المقصود بها الاعمدة .. تسمى صفات الجدول كما ذكرنا ... مثل اسم الطالب , رقم الطالب ..... الخ
- مجال القيم (Domain) :المقصود بها .. القيم الموجودة بداخل اسم الطالب مثلا , كم تأخذ حرف ؟ مثال اخر , رقم الطالب .. ماهو مجاله ؟؟ يعني هل من 0 – 9999 ؟؟ او من 0- 100000 مثلا ؟؟ ويمكننا تحديد مجال القيم لكل صفة على حسب احتياجنا .(لم افهم؟)
مثلا العمود "اسم الطالب" انا افرض انه يأخذ 15 حرف كحد اقصى .. و3 حروف كحد ادنى
والعمود "المعدل " افرضه من صفر الى 5 وان يكون كسري
والعمود "راتب المدرس" مثلا .. افرضه من 3500 ريال الى 9000 ريال ... بالعقل يعني هل من الممكن ان يكون راتب مدرس صفر ريال ؟؟ اذن مجال راتب المدرس هو من 3500 الى 9000
- العلاقة (Relation) : مثلا جدول المواد وجدول الطلاب , بينهما علاقة (Relation) ماهي هذه العلاقة ؟ سوف تعرف ذلك فيما بعد
- المفتاح الرئيسي للجدول (Primary key) : ماهو هذا المفتاح ؟ مجرد عمود , ولكن هذا العمود له شروط لكي يصبح مفتاح رئيسي للجدول .
* المفتاح الاساسي :
الشروط اللازمة لتوفرها في العمود لكي يكون مفتاح اساسي هو :
1- عدم التكرار
2- ان لا يكون خالي
وهذا العمود له غرض مهم جدا . وهو ان نميز الصف من بين الصفوف (لم افهم ؟)
انظر المثال :
يوجد لدينا جدول خاص بالموظفين لاحد الشركات
جدول الموظفين كما يلي : (صورة 12 )
http://www.w6w.net/upload2/21-11-2005/w6w_20051121041216d52dfe51.JPG
مارأيك .. ما هو العمود الذي ترى انه مفتاح اساسي .. أي عمود لم يتكرر او لم يكن خاليا ؟
انا اقول "اسم الموظف الاول " ... هذا العمود هو المفتاح الاساسي !! هل هذا صحيح ؟ طبعا لا ,, لماذا ؟ لانه تكرر فيه صفين .. هما خالد و خالد
هل "اسم الاب " هو المفتاح الاساسي ؟ لا لان سعيد تكرر مرتين .
هل "الراتب " هو المفتاح الاساسي ؟ لا
هل تاريخ الميلاد هو المفتاح الاساسي ؟ لا
هل المكافئة الاضافية هو المفتاح الاساسي ؟ نعم لانه لم يتكرر ... ولكن لحظة !! قلنا انه من صفات المفتاح الاساسي ان لا يتكرر + ان لا يكون فيه قيم خالية
والمكافئة الاضافية .. عمود لا يستحق ان يكون مفتاح اساسي . لان به قيم خالية ... فمثلا محمد سعيد الثاني لا يوجد لديه مكافئة اضافية (قيمة خالية)
(ما الحل ؟) نضيف عمود نجده يصلح بأن يكون مفتاح اساسي
(لماذا نضيف عمود .. ونزيد كمية البيانات بلا داعي؟) بل يوجد هناك سبب مقنع لاضافته ..
من جدول الموظفين (الصورة 12 السابقة ) اريد معلومات خالد منصور بذاته ... سوف تجد ان هناك اثنين ولا استطيع التمييز بينهما يمكن يكون هناك 1000 موظف اسمه خالد منصور ولا نعرف ان نفرق بينهما
انا من ناحيتي ... ارى ان نضيف عمود جديد ويسمى "رقم بطاقة الاحوال المدنية" وهو رقم لا يتكرر ابدا بين المواطنين في دولة ما .. ولا يمكن ان يكون خاليا !!
ماذا تقترح انت ؟ مارأيك ان نضيف مثلا عمود يسمى رقم الموظف كما في الجدول التالي (الصورة22)
http://www.w6w.net/upload2/21-11-2005/w6w_20051121041327c9571bae.JPG
اذن المفتاح الاساسي هو رقم الموظف ... لو أتى موظف جديد نعطيه الرقم 6 ...
مع العلم ان المفتاح الاساسي في الجدول يجب ان يكون تحته خط .. كما تشاهد الخط تحت رقم الموظف
-------------------------------------------------------------------
معلومة اضافية : بعض الشركات تعمل برامج خاصة تولد المفتاح الرئيسي (كيف تولد المفتاح الرئيسي ؟)
مثلا تأخذ اول حرف من اسمه واول حرف من اسم الاب وتأخذ سنة ولادته وتضيف عداد بجانب الرمز الناتج على سبيل المثال وتولد المفتاح الاساسي من هذه المعلومات . على سبيل المثال .. الموظف سامي عبدالرحمن (انظر الصورة 22) ممكن يكون رمزه " سع 1401_01" بدلا من الرقم 5 (في الصورة 22)
ولو فيه موظف اخر اسمه سامي عبدالرحمن ومولود في نفس سنة سامي عبدالرحمن السابق فان رمزه هو
"سع 1401_02"
وهذا مجرد مثال .... على حسب الشركة على حسب الغرض ينتج الرمز .
فاصل اعلاني ,,,
The Coder
09-11-2005, 08:23 AM
تابع الدرس الثاني
العلاقات :
بين كل جدول وجدول علاقة , فمثلا جدول الموظفين و جدول الأقسام بينهما علاقة
العلاقة ما هي يا ترى ؟
العلاقة هي ان الموظف الواحد يعمل تحت قسم واحد
وان القسم الواحد به اكثر من موظف يعمل به
ما رأيك ان نفترض هذا الجدول (الصورة 32) :
http://www.w6w.net/upload2/21-11-2005/w6w_2005112104153831eadbe0.JPG
لاحظ معي هذه المعلومات , انظر الى قسم المحاسبة وهو قسم واحد ويوجد بمكة ويستوعب 60 شخص ...
لاحظ معي ان هذا القسم به 3 موظفين وهم وليد وسعد واحمد ...
لاحظ معي ان القسم به معلومات خاصة تكررت !!
كم مرة ذكرنا ان قسم المحاسبة موقعه في مكة وانه يستوعب 60 موظف ؟؟
ولو هناك 1000000 موظف في هذا القسم على سبيل المثال !! هل لاحظت ان هذا التكرار قد يجعل حجم البيانات ضخم لدرجة الهوس !
نكتشف انه يوجد تكرار للمعلومات !! ويجب ان نتحاشى هذا التكرار . كيف ؟
نصمم جدول خاص بمعلومات الاقسام . وليكن هذا الجدول (صورة 42) "جدول الاقسام "
http://www.w6w.net/upload2/21-11-2005/w6w_200511210425576bea0403.JPG
اين المفتاح الاساسي ؟
رقم القسم هو المفتاح الاساسي (لاحظ الخط الذي تحت رقم القسم )
الان دعنا نتصور الجدول الاساسي وقد صار فيه معلومات الموظفين ونسميه مثلا "جدول الموظفين "
الصورة (52)
http://www.w6w.net/upload2/21-11-2005/w6w_20051121043213fb042e7a.JPG
نريد ان نعرف ان الموظف يوسف مثلا في قسم الرواتب !! كيف ؟؟ نريد ان نربط بين الجدولين ؟؟ كيف نربط بين الجدولين ؟؟
اليك هذا الحل :
نزيد عمود في جدول الموظفين ونسميه "رقم القسم" ونكتب رقم القسم فيه ... اليك الجدول الجديد (الصورة 62)
http://www.w6w.net/upload2/21-11-2005/w6w_20051121043429676c0c9b.JPG
لاحظ هذه الارقام (ارقام القسم ) لم تأتي عبطا !!
فاحمد وسعد ووليد ... جميعهم في القسم رقم واحد ,,, والقسم رقم واحد من أين نأتي به ؟؟ من جدول الاقسام (راجع الصورة 42)
وهو المحاسبة ومقر القسم بمكة ويستوعب 60 شخص ....
يوسف في القسم 2 .. وهو قسم الرواتب الذي يقع في الرياض ويستوعب 40 موظف
(وماذا عن سالم ؟)
(لم افهم حقا ما حصل !! لماذا فصلتهما في جدولين ؟ لماذا فعلت ذلك ؟)
لاحظ يا عزيزي انه في الصورة 62 قد تكرر الرقم "واحد" ثلاث مرات ... (نعم صحيح .. اذن طريقتك خاطئة !)
ليست طريقة خاطئة ولكن كم عمود به تكرار ؟ عمود واحد وهو رقم القسم فقط ... شاهد الصورة 62
واما الجدول القديم (الصورة 32) فقد تكررت المعلومات في ثلاث اعمدة !! وهي اسم القسم ومكانه واستيعابه .
(طيب .. لم تفرق كثيرا ..)
بل تفرق كثيييييييييرا لو فكرت مليا !! ... فكر لو يوجد 1000000 موظف كم من البيانات تتكرر في الجدول السابق (انظر الصورة 32) ؟؟
فكر لو ان جدول الاقسام به 50 عمود ... كم من البيانات سوف تتكرر ؟؟؟
الان ... هل شاهدت العمود الذي اضفته في جدول الموظفين (اقصد عمود رقم القسم ) ؟(انظر الصورة 62)
هذا العمود يدعى المفتاح الاجنبي Foreign Key (ما فائدة هذا المفتاح ؟؟ وكيف اعرف ما اذا كان هذا العمود مفتاح اجنبي او لا ؟؟)
المفتاح الاجنبي :
كما شاهدنا .... غرضه هو ربط جدولين ... وكما في مثالنا السابق .. ربطنا جدول الموظفين بجدول الاقسام ... وجعلنا المفتاح الاجنبي في جدول الموظفين وهو العمود الخاص برقم القسم .
( كيف أميز المفتاح الاجنبي ) المفتاح الاجنبي هو مفتاح اساسي في جدول اخر .. أي انه مفتاح اساسي في جدول الاقسام , وهو في جدول الموظفين اجنبي !!
(استنتجت شيء !! هل يوجد مفتاح اجنبي في جدول الاقسام ؟؟ ) لا لا يوجد (لماذا ؟على أي اساس اضيف المفتاح الاجنبي ؟)
نحن اضفنا عمود في جدول الموظفين وسميناه مفتاح اجنبي ولم نضيف مفتاح اجنبي في جدول الاقسام لسبب .. ستعرفه في الدرس القادم ان شاء الله :
اريدك الان ان تستنتج ذلك عبر درجات العلاقات
درجة العلاقات :
سوف نتكلم نظريا عن مفاهيم هذه الدرجات فهناك ثلاث درجات وهي /
- واحد لواحد : مثل علاقة المسافر بالتذكرة ... فالمسافر الواحد يملك تذكرة واحدة للرحلة الواحدة .. والتذكرة الواحدة يمتلكها مسافر واحد للرحلة الواحدة
هل يمكن لمسافرين ان يمتلكان تذكرة واحدة للرحلة الواحدة ؟؟ لا .... وهل يمكن للمسافر ان يمتلك تذكرتين للرحلة الواحدة ؟ لا طبعا ...
مثال اخر ...
الشخص الواحد لديه روح واحدة .... الروح الواحدة في شخص واحد ...
- واحد لمتعدد أو متعدد لواحد : مثلا ان يعمل الموظف الواحد في قسم واحد .. والقسم الواحد يعمل تحته مجموعة موظفين (موظفين متعددين .. يعني ممكن يكون موظف واحد ويمكن اكثر ) هل استنتجت لماذا اضفنا المفتاح الاجنبي في جدول الموظفين ؟
مثال اخر .. العلاقة بين رجل وامرأة الزواج .. الرجل يتزوج اكثر من امرأة (طالما انهم جميعا احياء) وان المرأة لا تتزوج الا رجل واحد (طالما انهما احياء)....
- متعدد لمتعدد : مثل .. الطالب يدرس تحت مجموعة معلمين ... والمعلم الواحد يدرس اكثر من طالب
مثال اخر .....
الكابتن الواحد يقود اكثر من طائرة ... والطائرة الواحدة يقودها اكثر من كبتن
انتهى الدرس ولله الحمد
الواجب :
نوعه : اعتمادي على الطالب
ملاحظات :
اريد منك شيء واحد .. اقرأ الدرس جيدا ... ثم حل الواجب بدون ان ترجع للدرس ... لان فيه تمرين العقل وقوة استيعابه ... وهو تكنيك رااااااائع
س1 : اضرب لي 3 امثلة لم اذكرها لدرجة العلاقات (واحد لواحد ... و متعدد لمتعدد ... و متعدد لواحد او واحد لمتعدد)
س2:في رأيك ... عندنا جدولين .. ويلزمنا ان نربط بينهما ... هما جدول المدينة وجدول الدولة
اين نضع المفتاح الاجنبي ؟ في أي جدول ؟
س3: اشرح لي مايلي بطريقتك الخاصة وبفهمك .. ولا يهمني اذا كان صحيح ام خاطيء:
- المفتاح الرئيسي ماهو ؟ ولماذا نستخدمه ؟ ومتى نعرف ما اذا كان هذا مفتاح اساسي او لا ؟
- المفتاح الاجنبي ماهو ؟؟ ولماذا نستخدمه ؟ ومتى نعرف ما اذا كان هذا مفتاح اجنبي او لا ؟
- قواعد البيانات ماهي ؟
- نظام قاعدة البيانات العلائقية ما هو ؟
س4 : فكر في جدولين (مثال من عقلك لاي جدولين ) واضف مفتاح اساسي , ولو استطعت اضف مفتاح اجنبي ...
س5: اجلب برنامج الفيزيو .. من شركة مايكروسوفت .... وهو خاص برسم الـنماذج ... حاول ان تحصل عليه ... فهو مفيد جدا جدا جدا ... في دروسنا وغيرها .. وله مأرب أخرى ,,,,
The Coder
12-11-2005, 05:36 PM
السلام عليكم ...
لم يصلني الا 4 واجبات او 5 ....
يالله .. انا انتظر ......
ولا تنسو شكل الرسالة الي بترسلون لي .....
يالله يا هووووه .... الواجب مايستاهل ... (اقول ... والله محد درى عنك ><)
The Coder
21-11-2005, 02:33 PM
6 واجبات !!!
احباااااااط ... فين الناس ؟؟ فين العالم ؟؟
صراحة .. انا قررت اطرح الدروس ..... بدون التقيد بالواجبات ..
شكرا لكل من حل الواجبات ,,,,,
واطلعت عليها ....
جهود مشجعة للاكمال .. ^^
الدرس الثالث اليوم او الغد ان شاء الله .. وما اخرني الا فايروس .. ضرب مخي وجهازي >_<
يالله .. انتظروني
The Coder
22-11-2005, 11:45 PM
بسم الله الرحمن الرحيم
الدرس الثالث
اسم الدرس :نموذج الكيانات والعلاقات ER
نوع الدرس : نظري + رسومي + تحليلي
صعوبة الدرس : ***** من *****
اهميــة الدرس : ***** من *****
الوقت المتوقع منك لفهم الدرس : ساعتين و 30 دقيقة ربما تزيد كثيرا أو تنقص
متطلبات تتوفر فيك : تحمل على قراءة السطور + التأمل
ملاحظات :
- يجب ان تتمرس كثيرا ,,
المتوقع منك في هذا الدرس :
معرفةمشاكل تكرار البيانات بشكل اعمق .
معرفة تحليل نموذج ER .
* المفتاح الاجنبي :
عرفنا ان المفتاح الاجنبي ... عبارة عن عمود موجود في جدول .. ممكن ان يتكرر في هذا الجدول ... وهو مفتاح رئيسي في جدول اخر .. ويستخدم في الربط بين الجداول كحل قوي في مشاكل تكرار البيانات .
(ماهي هذه المشاكل ؟) المشاكل هي :
مشاكل الاضافة
مشاكل الحذف
مشاكل التعديل
سوف اعرض مثال .... على هذه المشاكل ,,
انظر هذا الجدول (صورة 13)
http://www.w6w.net/upload2/22-11-2005/w6w_200511221244121f1e22ba.jpg
جدول خاص بالاطباء والمستشفيات التي يعملون فيها .
تكررت البيانات كما تعرفون .. والحل هو فصله الى جدولين , جدول الاطباء وجدول المستشفيات
سوف استعرض لكم مشاكل تكرار البيانات في هذا الجدول (الصورة السابقة 31)
مشاكل الاضافة : لو اردنا ان نضيف مستشفى جديد ؟؟ ماذا برأيك ان نعمل ؟؟
سوف نضيفه هكذا (الصورة 23)
http://www.w6w.net/upload2/22-11-2005/w6w_2005112212485408aaceed.jpg
لايوجد طبيب ؟؟ ... وقلنا ان المفتاح الاساسي لا يتكرر ولا يكون خالي ؟؟
ولكن رقم الطبيب مفتاح اساسي .. واصبح خالي ؟؟
هنا تكمل المشكلة ... سوف نضطر الى اضافة طبيب جديد مع أي اضافة لمستشفى جديد ... وهذه مشكلة ..
مشاكل الحذف :
في الجدول السابق (صورة 13) احذف لي الطبيب حسن .... مالذي يحدث ؟؟ (انظر الصورة 33)
http://www.w6w.net/upload2/22-11-2005/w6w_200511221254223061670a.jpg
سوف تختفي مع معلومات حسن ... معلومات المستشفى ج والذي يقع بالمدينة الوسطى!!......
(وماذا في ذلك ؟؟ ارى انه طبيعي ) المشكلة .. لو اردت الان معلومات المستشفى ج ... اين هي ؟؟؟
هل فهمت ؟؟
مشاكل التعديل :
وقع زلزال عنيف .. في المدينة الشرقية ... واسفر عن ذلك 3 حالات جروح طفيفة ... ولم يحدث وفاة ولله الحمد ... ولكن ... المستشفى ب في المدينة الشرقية ... تدمر عن بكرة ابيه ...
افتتح مؤخرا مستشفى ب الجديد ... والذي يقع في المدينة الشمالية الشرقية ....
نريد ان نعدل هذه المعلومة في الجدول .. نريد ان نجعل المستشفى ب بالمدينة الشمالية الشرقية .. مالذي يحدث ؟؟
سوف يتم تعديل جميـــــــــــــــــــــــــع السجلات (الصفوف) الموجودة بالجدول والتي تحتوي على القيمة "المدينة الشرقية" ... لاحظ ذلك (الصورة 43)
http://www.w6w.net/upload2/22-11-2005/w6w_20051122125541397522f6.jpg
اضطررنا ان نعدل على 3 صفوف ...(هه .. 3 صفوف فقط .. مالمشكلة)
تخيل معي لو انه يوجد 1000000 طبيب بالمدينة الشمالية الشرقية .... كم صف سوف نعدل ؟؟؟(اوبس ..)
والان .. هذه المشاكل ... وحلها فصل الجدول الى جدولين .. جدول الاطباء وجدول المستشفيات .
كما في الصورة 53 والصورة 63 ..
( الصورة 53 )
http://www.w6w.net/upload2/22-11-2005/w6w_20051122132813c5be056b.jpg
(الصورة 63)
http://www.w6w.net/upload2/22-11-2005/w6w_20051122131212746bfc23.jpg
هل تستطيع ملاحظة المشاكل كيف اختفت ؟؟
هل شاهدت المفتاح الاجنبي ؟؟ اين هو ؟؟
رقم المستشفى الموجود في جدول الاطباء .. هو مفتاح اجنبي ,, ونضع تحته .. خط متقطع لكي يرمز انه مفتاح اجنبي .
لماذا يوجد مفتاح اجنبي في جدول الاطباء .. ولا يوجد في جدول المستشفى ؟
لان العلاقة بين المستشفى والطبيب هي واحد لمتعدد ومتعدد لواحد .
في المستشفى الواحد مجموعة اطباء .... الطبيب الواحد يعمل تحت مستشفى واحد
لاحظ كلمة "مجموعة" .... المستشفى به "مجموعة" اطباء ... ضع المفتاح الاجنبي في جدول الاطباء وانت مغمض العينين .
لو ان العلاقة واحد لواحد ؟؟
هنا بامكانك ان تضع المفتاح في أي جدول .. اختر احدهما .. وضع المفتاح ... ولكن هناك حالات انا شخصيا افضل ان تضعها في جدول دون الاخر .. سوف ندرسها بتعمق ان شاء الله .
لو ان العلاقة متعدد لمتعدد ؟؟
سوف نستعرض حل هذه العلاقة في أمثلة نموذج العلاقات والكيانات .
تابعونا بعد الفاصل ,,,
The Coder
23-11-2005, 12:15 AM
النموذج العلائقي الكياني (Entity Relationship Diagram )
* تصميم قواعد اليبانات :
افترض اننا نريد ان نبني نظام (برنامج ) , فاول ما نفعله هو تحليل هذا النظام , أي معرفة متطلباته ومعرفة ما هو النظام اصلا , وغيرها من الامور والتي تساعدنا على فهم النظام بشكل يجعلنا لتحويله الى برنامج منفذ على ارض الواقع , بعد فهم هذا النظام ... سوف نصمم النظام بشكل افتراضي , أي تصميم رسومي على الورق مثلا , وهي من اختصاص مصمم قواعد البيانات , والذي يفترض شكل قاعدة البيانات ويفترض شكل الشاشات اللازمة التي تظهر ويرسم ويخطط ويصمم كل شيء ولكن .. بشكل افتراضي أي رسومات وتخطيطات على احد البرامج الرسومية المساعدة او حتى على الورق كما اسلفنا .
وما على المبرمج الا ان يأخذ التخطيط ويبرمجه (ينفذه) .
وفي برمجة قاعدة البيانات ... سوف نتوقع من المصمم ان يصمم نموذج يدعى النموذج العلائقي الكياني .
* ماهو النموذج ؟
هو مجرد تمثيل البيانات ووصفها والحقائق بالرسوم .. (وصف الحقائق بالرسم )
أي ان النموذج هو عبارة وصف رسومي (تمثيلي) للحقائق التي لا يمكن ان ترى مباشرة
(ولماذا نوصف البيانات بالرسم ؟)
لانها تعتبر اللغة ما بين المصمم والمبرمج .
مثال :
المهندس المعماري يصمم بالرسم نموذج لمنزل ما .. المقاول ينفذ التصميم (ينفذه بالبناء)
المصمم لقاعدة البيانات يصمم النموذج .. المبرمج يبرمج وينفذ التصميم .
المصمم (المهندس) يرسم ويخطط .. والمبرمج (المقاول) ينفذ ويبني .
* اجزاء هذا النموذج :
النموذج العلائقي الكياني هذا .. هو عبارة عن مجموعة من :
الكيانات
صفات الكيانات
العلاقات بين هذه الكيانات
سوف نشرح بشيء من التفصيل .. عبر هذا المثال لطلاب ومدرسيهم :
انظر الشكل (صورة 73)
http://www.w6w.net/upload2/21-11-2005/w6w_2005112104413736a422cc.jpg
الكيان (Entity) :
سوف تشاهد في الصورة ... مستطيلات .. مستطيل للمعلم .. ومستطيل للطالب
هذه المستطيلات ترمز للكائنات أو الكيانات . والكيان في الاصل هو ما يهمنا في أي نظام .. فمثلا نظام الطلاب يهمنا الكيان "طالب" والكيان "مادة" والكيان "معلم" والكيان "قاعة" ..... الخ
وعلى حسب النظام ... تظهر هذه الكيانات ... ولا يخفى علينا ان ايجاد الكيانات تخصص بحد ذاته .
من الممكن ان يكون الكيان مايلي :
شخص : مثل الزبون , المبرمج , المدير......
مكان : موقع , مدينة , حي ....
شيء : قطعة غيار , سيارة , بيت ......
حدث : طلب , تسجيل , تجديد .......
مفهوم : رحلة , مشروع , تكلفة .....
قد تجدها صعبة الفهم في هذه المرحلة .. وقد تجدها مفهومة جدا , ولكن أشيرإلى أن الكيان يمثل عادة الجدول في منهجنا هذا .
الصفة :
تشاهد في الصورة أن كل كيان ينبعث منه أشكال بيضاوية .... وهي تمثل صفات الكيان
فالكيان المعلم له صفاته وهي الاسم والرقم ... والكيان الطالب له صفاته وهو الاسم والمعدل والرقم .
والصفة تمثل عادة بحقول أو أعمدة الجدول .
العلاقة :
المعين .. يرمز لنوع العلاقة بين الكيانات .. وفي الصورة نلاحظ ان العلاقة بين المعلم والطالب وهي علاقة "تدريس"
نشير ان الطالب الواحد يتعلم من مجموعة معلمين
وان المعلم الواحد يعلم مجموعة طلبة أي نوع العلاقة متعدد لمتعدد ... ستشاهد في الصورة حرفي M و N
نمثل العلاقة واحد لواحد بالشكل التالي (الصورة 83) :
http://www.w6w.net/upload2/21-11-2005/w6w_200511210444307ec48955.jpg
العقل الواحد بالشخص الواحد .. والشخص الواحد يملك عقل واحد ... العلاقة هي الملكية .. لاحظ الرقم واحد عند العقل وعند الشخص
نمثل العلاقة واحد لمتعدد ومتعدد لواحد بالشكل التالي (الصورة 93) :
http://www.w6w.net/upload2/21-11-2005/w6w_20051121050327f888782c.jpg
لاحظ في الصورة 93 ... ان المدير الواحد يدير مجموعة موظفين .. وان الموظف الواحد تحت إدارة مدير واحد !!..
انظر أين علامة المجموعة ... انها بالقرب من الكائن "موظف " ورمزنا لها بالرمز M
نضع الرمز الخاص بالتعدد (M) بالقرب من الكائن موظف لاننا قلنا مجموعة موظفين (بالمنطق تفهمها )
امثلة لنماذج اخرى :
الكيان الضعيف (Weak Entity) :
الكيان كما قلنا هو شيء يهمنا في النظام , بعض هذه الكيانات لا تظهر الا بظهور كيانات اخرى وتسمى الكيانات الضعيفة .. وهي التي تعتمد على الكيانات الاخرى ..سأعطيك امثلة معنوية لهذا المفهوم :
لا يوجد العقل البشري الحي والذي يفكر طالما انه لا يوجد انسان اصلا (العقل هنا كيان ضعيف )
لا يوجد معدل طالما انه لا يوجد درجات اصلا (المعدل هنا كيان ضعيف)
لا يوجد خادم طالما انه لا يوجد سيد اصلا (الخادم هنا كيان ضعيف)
لا يوجد نظر طالما انه لا توجد العينين اصلا (النظر كيان ضعيف يعتمد وجوده على وجود العينين)
لا يوجد ابن طالما انه لا يوجد اب اصلا (الابن كيان ضعيف وجوده يعتمد على وجود كيان الاب)
طيب ...
مارأيك في هذه الجملة ..
لا توجد برامج طالما انه لا يوجد كمبيوتر ...
هنا من الممكن ان يكون لدينا برامج ... بالرغم من اننا لا نملك كمبيوتر ... وهنا البرامج ليست كيان ضعيف ...
انظر الى الجملة حينما تكون بالشكل التالي :
لا توجد برامج طالما انه لا يوجد كمبيوتر اصلا (اصلا أي على ارض الواقع )
فهنا اصبحت البرامج كيان ضعيف .. لانه لو لم يكن هناك شيء اسمه كمبيوتر .. ولم يخترعه الانسان .. فلا وجود لبرنامج الـ Real Player مثلا !! ... ارجو ان تتعمق في التأمل ,,
نمثل الكيان الضعيف على نموذج ER بهذا الشكل ....(انظر الصورة 103)
http://www.w6w.net/upload2/21-11-2005/w6w_200511210505528868a25f.jpg
فالابن يعتمد وجودة على وجود الاب اصلا ... اذن الابن كيان ضعيف .. وتمثيله بنفس المستطيل الخاص بالكيان ولكن باطار ذو خطين ..... لاحظ الخطين الذان يمتدان من الكيان الابن الى العلاقة .... يجب وضعها خطين عند الكيان الضعيف ...
الصفات البسيطة والمركبة (Simple And Composite Attributes ) :
ان الصفات الخاصة باي كيان .. تكون عادة بسيطة ... مثل صفة رقم الطالب للكيان الطالب او صفة تاريح الميلاد للكيان المعلم .... وكلها صفات بسيطة ...
الصفة المركبة .. هي صفة بامكاننا ان نقسمها .... فمثلا رقم الطالب لا يمكننا ان نقسمه .. ولكن اسم الطالب نقسمه للاسم الاول .. والاسم الثاني ... واللقب .. انظر (الصورة 113 )
http://www.w6w.net/upload2/21-11-2005/w6w_200511210510534c804670.jpg
الصفات المتعددة القيم ... والصفات الوحيدة القيم (Single-Value and Multiple-Value Attributes) :
الاغلبية من الصفات تكون وحيدة القيم , فمثلا تاريخ صنع السيارة قيمة واحدة فقط ..لا يوجد بجانبها قيمة اخرى ,, ولكن لو قلنا رقم الجوال الخاص بالموظف , فمن الممكن ان يملك 3 ارقام جوالات , نشير هنا ان رقم الجوال في هذه الحالة صفة ذو قيمة متعددة .
انظر شكل الصفات المتعددة القيم (صورة 123) :
http://www.w6w.net/upload2/22-11-2005/w6w_2005112213534947eca54e.jpg
كما تشاهد في الصورة , الطالب لديه ارقام تلفون متعددة .
الصفات المشتقة (Derived Attribute ) :
الصفات التي بامكاننا ان نجد قيمتها من الصفات المجاورة الاخرى .. مثل عمر الشخص نجده من طرح التاريخ الحالي من تاريخ الميلاد .
انظر شكل الصفات المشتقة (الصورة 133)
http://www.w6w.net/upload2/22-11-2005/w6w_20051122134848793e53d5.jpg
أي ان معدل الطالب بامكاننا ان نوجده من صفات اخرى مثل الدرجات وعدد الساعات المدروسة .... الخ
اشير الى نقطة في الصفات المشتقة انها لا تخزن عادة ... بل نوجدها في كل مرة نريدها , ولكن اذا كان ايجادها صعب ومعقد وتأخذ وقت طويل فيفضل ان نخزنها .. فمثلا معدل الطالب , اذا كنا نطلبه كثيرا ..فيجب ان نخزنه.
5- الانواع الرئيسية والانواع الفرعية (Super-type and Sub-type ) :
نقصد بها الكيانات الرئيسية والكيانات الفرعية , مثال :
الكتب , منها نوعين ..
كتب الكترونية وكتب ورقية .
صحيح ان النوعين كتب .. ولكن لكل منها صفات خاصة بها .
الكتب الالكترونية تقاس بالحجم الالكتروني .
الكتب الورقية تقاس بالوزن .
كلا النوعين كتب , وتتكلم عن تخصص معين .
انظر الشكل كما يلي : (الصورة 143 )
http://www.w6w.net/upload2/22-11-2005/w6w_20051122135244d66d0d00.jpg
لاحظ المثلث المقلوب , حيث انه يشير الى تفرع النوع الرئيسي للانواع الفرعية ,
ولا تغفل عن امكانية انقسام الكيانات الى اكثر من قسمين ,,,
6- تمثيل علاقة الكيان مع نفسه :
كما شاهدنا العلاقات بين كيان واخر , فمن الممكن ان نشاهد علاقة كيان مع نفسه , امثلة :
الانسان (ونقصد به أي انسان سواء ذكر او انثى ) يتزوج انسان اخر .
الموظف يدير موظف او مجموعة موظفين اخرين .
المواد تتطلب مواد اخرى سابقة .
انظر الى شكل العلاقة في الصورتين (لا تسألني لماذا لم اجعلهما في صورة واحدة , يوجد سبب ^_^): (الصورة 153)
http://www.w6w.net/upload2/22-11-2005/w6w_20051122135347b32d54ed.jpg
لاحظ ان الموظف الواحد يدير مجموعة من الموظفين ... علاقة واحد لمتعدد ومتعدد لواحد
(الصورة 163)
http://www.w6w.net/upload2/22-11-2005/w6w_20051122135556b98fe105.jpg
لو كنت جامعي .. فسوف تعرف انك لا تستطيع تسجيل بعض المواد حتى تأخذ مواد اخرى قبلها .. أي ان المادة الواحدة تتطلب مجموعة مواد اخرى سابقة , وان المادة السابقة الواحدة من الممكن ان تكون مطلوبة من مجموعة مواد اخرى , أي ان علاقة التطلب هذه متعدد لمتعدد .
فاصل اخر ^^
The Coder
23-11-2005, 12:23 AM
انتهى الدرس ولله الحمد ,,, وسوف تطرق في الدرس القادم ان شاء الله لبعض الامثلة للنموذج وحالات للدراسة ..
و لا اخفيك انني لا املك هذه الامثلة بشكل كافي .. ولكن لا تخف ,سوف ابحث عنها , سوف اجدها , سوف
اخترعها ... وستحصل على امثلة حقيقية فعلية تتخيل بواسطتها العالم الواقعي !!
التحديات
اتحداك 3 تحديات ... اعتقد انك لا تستطيع ان تعرف أي منها ....
التحدي الاول : اذكر لي مالفرق بين الصفات ذات القيم المتعددة والصفات المركبة ؟
التحدي الثاني : ارسم نموذج واحد انت تختاره (غير ما ذكرت ) وارجو ان تراعي فيه وجود مايلي :
- صفات مركبة وصفات مشتقة .
- اكثر من كيان و بينهم علاقات .
- علاقة كيان بنفسه .
- كيانات رئيسية وفرعية .
أريد في هذا السؤال أن يكون نموذج واحد لنظام (أي نظام مثل نظام الطلبة , نظام مستشفيات , نظام من رأسك ....)
التحدي الثالث : في الصورتين 53 و 63 ... قلنا انه اختفت مشاكل ... ما هي هذه المشاكل ؟ أقنعني .... هل اختفت فعلا ام لا ....
-----------------------
المهام
اليك هذه المهام ,,
المهمة الاولى : معرفة برنامج الفيزيو .. وكيفية الرسم عليه , اذا لم تعرف فراسلني .
المهمة الثانية : اذا كان لديك انتقاد .. سؤال عبيط ... نقطة لم تفهمها .... راسلني او اطرح مشاركتك ..
المهمة الاخيرة : اسرع و جهز برنامج الاوراكل و حاول ان تركبه في جهازك .
The Coder
25-11-2005, 08:17 AM
السلام عليكم ,,,,,
شباااااااااااااب ,,,
- ارسلو التحديات الثلاث على الخاص او على الايميل ,,,, وارجو ان ترسلها بعنوان "؟؟؟؟؟؟؟؟؟؟؟؟" وان تذكر اسمك او كنيتك + عمرك + حل اسالتك ,,,
- اي سوال او استفسار اطرحه هنا في الموضوع .
- بامكانك تراسلني لو عندك اي استفسار ....
- لو تبيني على الماسنجر ... ساكون متواجد يوميا ان شاء الله بعد صلاة الصبح الى الحادية عشر ان شاء الله ...
طارق ذياب محمد
30-11-2005, 10:22 PM
السلام عليكم ورحمة الله وبركاتة
اما بعد
ارجو منك التكرم بالمزيد من هذة اللغه (sql)وماهى الفائدة وكيف تعمل بها فى حياتك العملية
طارق ذياب محمد
30-11-2005, 10:29 PM
السلام عليكم ورحمة الله وبركاتة
اما بعد
ارجو منك التكرم بالمزيد من هذة اللغه (sql)وماهى الفائدة وكيف تعمل بها فى حياتك العملية
The Coder
01-12-2005, 07:36 AM
السلام عليكم ورحمة الله وبركاتة
اما بعد
ارجو منك التكرم بالمزيد من هذة اللغه (sql)وماهى الفائدة وكيف تعمل بها فى حياتك العملية
وعليكم السلام ورحمة الله وبركاته
يقول الشاعر "كل شي بوقته حلوووو " ...
صح ^^
سوف اتكلم كثيرا في الاس كيو ال حتى اجعلك تملني .. وتمل الاس كيو ال ... وتمل الاوراكل ^^
هذا وعد ^^
The Coder
03-12-2005, 01:49 PM
السلام عليكم ,,
عدنا ثانية .. ولكن بدون درس ... بطلت اعطي دروس .....
امزح ,
سوف اتأخر في طرح الدرس الرابع ليومين او ثلاثة لاسباب كثيرة ...
المهم اشير الى نقاط مهمة ,,,
1- لم يأتني الا شخصين حلو التحديات ... وكما توقعت انها صعبة جدا .. لدرجة انكم لم تعرفو , الذكاء مطلوب لحلها :mad22: :mad22: :mad22: :mad22: ,,,,
2- دروسي مملة جدا .. لذا .. باغير الطريقة للافضل ان شاء الله ,,
3- الصور كلها او معظمها اختفت ... سوف ارفعها غدا ان شاء الله ,
4- ... انا لم استفد من اعطائكم الدروس .... ولم اتعلم زيادة على علمي .. ففكر ليش باقي اعطيكم دروس ؟؟
لاني اريد الاجر هذا اولا .. ولاني اريد الاجر هذا السبب الثاني .. والسبب الثالث .. انني اريد الاجر ...
5- واخيرا ... عارف انه ... لا يوجد شخص .. يقرأ الان ... هلوووو اني بودي هير ؟؟ نو ون ؟؟؟
سو بي ات ,,,
احلامو ادوماتو
03-12-2005, 06:36 PM
انا حقدت خلاص >_<
كيف لشخص واحد يكتب مواضيع مبدعة مثل هذي ما شاء الله لا اله الا الله
ينطيك العافيه استاذي وداوم على هذا
p.s: باحفظ الدروس بجهازي ، شكلك حاط واجبات XD
باحاول احلهن و اعلمك ^_^
The Coder
04-12-2005, 08:51 AM
انا حقدت خلاص >_<
كيف لشخص واحد يكتب مواضيع مبدعة مثل هذي ما شاء الله لا اله الا الله
ينطيك العافيه استاذي وداوم على هذا
p.s: باحفظ الدروس بجهازي ، شكلك حاط واجبات XD
باحاول احلهن و اعلمك ^_^
اهلا .,,
كنت بامسح مشاركتك ... ولكن ,,,, جاتني فكرة ....
الا وهي ...
اي استفسار اي سوال اي نقد ... اي مناقشة ,, تريدون ان تطرحوها ...
على رابط استفسارات هذه الدورة ....
http://www.montada.com/showthread.php?p=4304677#post4304677
وانت يا سيد ... حل الاسئلة .. والتحديات .. ولا تتأخر
The Coder
07-12-2005, 12:12 PM
بسم الله الرحمن الرحيم
الدرس الرابع :
اسم الدرس :نموذج الكيانات والعلاقات ER
نوع الدرس : نظري + رسومي + تحليلي
صعوبة الدرس : **** من *****
اهميــة الدرس : ****** من ***** (Over)
الوقت المتوقع منك لفهم الدرس : 4 ساعات ربما تزيد كثيرا أو تنقص
متطلبات تتوفر فيك : التركيز و الصبر والتحليل الصوري ,,
المتوقع منك في هذا الدرس :
- القدرة على التحليل المنطقي .
- معرفة اين يوضع المفتاح الاجنبي عادة .
- القدرة على تحويل أي نظام الى نموذج العلائقي الكياني( ER )
هيا لنؤركل ^^
قبل البدأ بالدرس .. احب ان اشير لنقطة مهمة جدا جدا جدا ,,
نحن لا نصمم قواعد البيانات ولا نصمم الجداول على كيفنا .... لا يا حبيبي ...
نحن نمشي على وصف .. على متطلبات من الزبون .. نمشي على هذه المتطلبات ولا نبرمج ونصمم متطلبات لا يريدها الزبون .. ولا أن نترك متطلبات يريدها الزبون !!
أي انك انت مبرمج ... تنتظر خرائط رسومية ونماذج من المصمم , وتمشي عليها وتبرمج عليها ولا تزيد ولا تنقص شيء !! هل فهمت ...
قاااعدة مهمة (قاعدة رقم 1): على حسب المتطلبات .. نبرمج .. اوكيه ..
حتى المصمم ... يصمم على حسب ما جائه من محلل النظم ..
حتى المحلل ... يحلل النظام على حسب ما جائه من معلومات من الزبون نفسه ...
نحن نعمل كفريق عمل ... وانت مكانك في هذا الكورس هو المبرمج .... والذي يتلقى النماذج والرسوميات من المصمم ...
نتطرق لموضوع المفتاح الاجنبي ...
The Coder
07-12-2005, 12:20 PM
تابع الدرس الرابع
* ماهي حقيقة المفتاح الاجنبي (Foreign Key) :
سابقا درسنا مشكلة التكرار ... وحليناها بطريقة ربط الجداول ... ووضع المفتاح الأجنبي في احد هذه الجداول ..
المفتاح الأجنبي مرة ثانية هو عمود يتكرر ولا يمكن ان يكون خاليا ... وهو مفتاح رئيسي في جدول اخر ..
المصيبة انه لا علاقة له بالجدول .. والمصيبة الأعظم انه يشبه شكليا المفتاح رئيسي في الجدول الاخراليك مثال : لجدولين .. وتركيبهما صحيح (لاحظ .. صحيح ...)
جدول الموظفين (صورة 134)
http://img8.picsplace.to/img8/2/134_002.jpg
وجدول الاقسام (صورة 144)
http://img4.picsplace.to/img4/14/144.jpg
في جدول الموظفين يوجد مفتاح اجنبي .. وهو رقم القسم ( Dept_no ) لونته باللون الاحمر ...
المفتاح الرئيسي هو عمود لايتكرر ولا يمكن ان يكون خاليا ...وهو رقم الموظف واعطيناه الاختصار (Eno)
على فكرة .... لماذا يلزمنا المفتاح الرئيسي ؟؟
تخيل معي ان صاحبك يدعى سعد Saad .... وهو موظف
سعد .. كذب عليك وقال " راتبي 4000 دولار وانا في القسم A " ... وانت تريد ان تتجسس وتطلع على راتب سعد وعلى معلوماته ... تخيل ان عدد الموظفين ضخم جدا ... تخيل عددهم 1000000 موظف (يعني 1000000 صف في الجدول الخاص بالموظفين (في صورة 134) ) ... 250000 موظف منهم ... يدعون بـسعد (Saad) بالله عليك قول لي ... كيف نعرف اين معلومات سعد صاحبك ؟؟
عشان نميز بين الصفوف .. نضع المفتاح الرئيسي .... انظر الصورة 134 .... فالموظف Saad صاحب الرقم 123333 ليس نفسه Saad صاحب الرقم 123334 ......
لاحظ المفتاح الاجنبي (صورة 134 .. عمود باللون الاحمر)
الان اريدك ان ترى جدول الاقسام (الصورة 144) ,, وان ترى المفتاح الرئيسي (رقم القسم Dept_no) .
اكيـــــــد انك استنتجت عدة نقاط ... اليك هذه النقاط ....
1- المفتاح الاجنبي في جدول الموظفين .. يشبه المفتاح الرئيسي في جدول الاقسام
2- لاحظ ان المفتاح الاجنبي في جدول الموظفين .. رقم ... مثله مثل المفتاح الرئيسي .. وليس كلمة !!
3- هل تلاحظ ان المفتاح الاجنبي لا يمكن ان يكون خالي ؟؟ وايضا المفتاح الرئيسي لا يكون خاليا ؟
4-هل تلاحظ ان المفتاح الاجنبي ... تكون قيمه في هذا النطاق (1 , 2 , 3) ؟ هل شاهدت اعداد غير هذه ؟؟
وهي الاعداد نفسها الموجودة في المفتاح الاساسي .... أي ان نطاقه هو نفس نطاق المفتاح الرئيسي في الجدول الاخر ....
5- هل تلاحظ ان المفتاح الاجنبي يتكرر .. بينما المفتاح الرئيسي لا يتكرر
6- هل تلاحظ ان المفتاح الاجنبي .. لا يمت صلة بالجدول .. يعني بالله عليك .. هل رقم القسم صفة للموظف ؟؟ لاحظ ان رقم القسم وهو مفتاح اجنبي ... ليس صفة تابعة لجدول الموظفين ...
هذه ملاحظات مهمة جدا .... وهي قوانين المفتاح الاجنبي
يتكرر .. لا يكون خالي .. لا يكون مفتاح رئيسي .. يشبه للمفتاح الرئيسي في الجدول الاخر كثيرا .. لا تخرج نطاق قيمه عن نطاق قيم المفتاح الرئيسي في الجدول الاخر ...
سوف ندرس في الدرس القادم ان شاء الله .... بعض مفاهيم قواعد البيانات المتماسكة .. والتي تجعلك تتجنب خلخلة موازين قوانين المفتاح الاجنبي .. وبعض القوانين الاخرى .... وسوف ندرس مالذي سيحصل لو خلخلنا هذه القوانين ان شاء الله ,,
لماذا نضع المفتاح الاجنبي في جدول دون جدول اخر ؟
يعتمد على نوع العلاقة .. هل هي واحد لمتعدد .. ام متعدد لمتعدد .. ام واحد لواحد ....
لنجرب ثلاث امثلة .. مارايك ؟؟
لنفكر معا .. ونستنتج هذه القواعد ...
عن اذنكم بروح اشرب موية ...
The Coder
07-12-2005, 12:34 PM
تابع الدرس الرابع
المثال الاول : علاقة واحد لواحد (One to One)
مممممم .. مثال مثال مثال على هذه العلاقة .... أأأأه ... افتكرت ..الموظف الواحد .. يدير قسم واحد فقط ..
والقسم الواحد .. يدار (بضم الياء وفتح الدال فعل مبني للمجهول) من قبل موظف واحد ..
وعلى فكرة ... الي ما بيقولها بهالصيغة ... يجيه تلطيش .. اوكيه !!
بعضهم ارسل لي الواجب على هالصيغة ... "الموظف الواحد يدير قسم واحد .... " وسكت ..
اريدك تذكرها من الجهتين ..." الطبيب الواحد لديه مكتب واحد .. والمكتب الواحد يملكه طبيب واحد"
انتبهوووووو .... لا اريد الاخطاء هذه .. ابدا ,,,
المهم ... العلاقة واحد لواحد نادرا ما تكون موجودة ... وسوف تعرف فيما بعد ... لماذا هذه العلاقة ؟ ولماذا نستخدمها اصلا ,,
.. هيـــــــــــــــه ...وش فيك ؟؟ شايفك متضايق ... قلتفيما بعد بتعرف .. ما تقدر تصبر !!!!
الان انظر جدول الموظفين (الصورة 154)
http://img7.picsplace.to/img7/4/154.jpg
ثم انظر جدول الاقسام ... (الصورة 164)
http://img8.picsplace.to/img8/2/164.jpg
في جدول الاقسام يوجد متهم (عمود) يدعى "it's Manager" ولونه ازرق .... وهو المفتاح الاجنبي في علاقة الواحد لواحد ...
لماذا وضعناها في جدول الاقسام .. ولم نضعها في جدول الموظفين ؟
يالله نجرب ... ونضعها في جدول الموظفين ..
الان انظر الى جدول الموظفين التالي (الصورة 174)
http://img4.picsplace.to/img4/14/174.jpg
ثم انظر الى جدول الاقسام التالي (الصورة 144 السابقة ^^)
http://img4.picsplace.to/img4/14/144.jpg
مالذي حدث ؟؟
قمنا ووضعنا المفتاح الاجنبي في جدول الموظفين ... هذا كل شيء ^^
هل اثر ذلك في العلاقة ؟؟ ...
مممممم ... مارأيك انت ؟؟؟ انا من ناحيتي ماشفت أي تغيير معنوي .... صحيح قلبنا الامور ... ولكن ... لم يؤثر في تماسك الجدولين ... صح ^^ ؟
طيب .. مارأيك لو مزجنا الجدولين ^^ ... همممم .. نمزجهما .. ام لا ؟؟
لا ؟؟ لماذا لا نمزجهما ؟؟ عشان التكرار ؟؟ طيب ... نجرب ونمزجهما .. (الصورة 184)
http://img4.picsplace.to/img4/14/184.jpg
وااااه ... حذفنا عمودين ... عمودرقم القسم (dept_no) الذي كان مفتاح اساسي في جدول الاقسام وعمود His_dept والذي كان مفتاح اجنبي في جدول الموظفين ...كلا العمودين لم نحتاجهما في المزج الجديد (صورة 184) ....
مارأيك .. كأن التكرار خف ولو قليلا .... حذفنا عمودين باكملهما (المفتاح الاساسي والاجنبي وهما رقم القسم) ... وصار الجدول مختصر بشكل اكثر,
لا تقول اختصرنا قليلا... تخيل بالله عليك ... انه لدينا 1000000000 قسم ... و 9999999999 موظف ..... كم من البايتات نختصره ؟؟ كثييييييير ^^ ....
نستنتج ان علاقة واحد لواحد ... مالها داعي ... تزيد علينا شقى وتعب ... وزيادة عمودين بأكملهما ...
لييييييييييييش نستخدمها من الاول ؟؟
يقول لك يا سيدي ... لاسباب امنية ^^ ... (اسباب امنية ؟؟ ) ايه اسباب امنية !!!
اذا بغينا نحمي البيانات (لاحظ البيانات .. وليست قاعدة البيانات !!!) نفصل الجدول الى جدولين ونربط بينهما بعلاقة واحد لواحد ^^ ... وهذا على حسب المتطلبات .... (افففففف.. مافهمت شي !)
طيب ... انا لا اريد ان اجعل احد يعرف معلومات الاقسام وله الحق في ان يرى معلومات الموظف ... مالذي اعمله ؟؟؟
انظر الى الجدول في الصورة 174 ... وهو جدول الموظفين ... تخيل ما تقدر تشوف الا هذا الجدول تخيل اني انا مديرك وقلت لك "هيــــه انت .. ايها الموظف .. اين يقع القسم رقم واحد ؟؟"
فترد انت "ما بعرفياسيدي " ... فاقول لك: "هه .. مطرود يا حبيبي ... " (تكنيك رائع للتخلص من الغير مرغوب فيهم بالعمل ^^)
.. تعرف ليش ما بتعرف يا موظف ؟ لاني حجبت عنك جدول الاقسام الي هو الصورة رقم 144 !!!عرفت ليش اسباب امنية ؟؟ ^^
يالله ... باخذ لفتين .. واجي ...
طفشششششششت
The Coder
07-12-2005, 12:51 PM
الدرس الرابع تابع
المثال الثاني : العلاقة واحد لمتعدد ومتعدد لواحد :
مممممممم ... مثال مثال مثال ... أأأه افتكرت ^^
اش رايك بهالمثال ؟
الموظف الواحد يعمل تحت قسم واحد ,,, والقسم الواحد يعمل تحته اكثر من موظف
ياسلام ^^ ... علاقة اخرى بين الموظف والاقسام وهي "عمل" .... هل تذكر العلاقة "ادارة" ؟؟
قلنا ان نضع المفتاح الاجنبي .. من جهة الكيان المتعدد .. والكيان المتعدد هو "موظف " وليس "قسم" ...
انظر جدول الموظفين (صورة 134 السابقة)
http://img8.picsplace.to/img8/2/134_002.jpg
وجدول الاقسام (صورة 144السابقة )
http://img4.picsplace.to/img4/14/144.jpg
ممممم ... مارأيك نجرب ونجعل مكان المفتاح الاجنبي ... في جدول الاقسام ... ^^ .... مثل ما فعلنا في علاقة الواحد للواحد .... ؟؟ انا بنفسي مابعرف .. وش بيصير ...
نجرب ؟؟ هاه ؟؟ اعتقد ان بعضكم ذكي جدا ... واكتشفها قبل ان اعرض المثال .... اما البعض الاخر .. لا يريد التفكير ..
اذا كنت من البعض الاخر الذي لا يريد التفكير ... فالله يعينني عليك .. خذ خذ المثال :
انظر جدول الموظفين (صورة 194)
http://img6.picsplace.to/img6/8/194.jpg
وانظر جدول الأقسام ^^ (صورة 204)
http://img8.picsplace.to/img8/2/204.jpg
اوبس .... أين الباقين ؟؟ كيف نضيفهم .. لو أضفناهم .. حتصير مشاكل تكرار للمفتاح الرئيسي .. وتكرار للبيانات أصلا .. وحتصير مشاكل ليــــــن الليل ..
مممممم .. هل لاحظت المشكلة ... لا لا لا ... انسى الموضوع ^^
اجعل دائما المفتاح الأجنبي .. من جهة الكيان المتعدد ^^ ... وصلت ؟
المثال الثالث : العلاقة متعدد لمتعدد :
مثال على العلاقة هذه .... خليني استمد من واجباتكم ^^
يقول احدهم في حل الواجب الاول ....
الموظف الواحد يتعامل اكثر من زبون .. والزبون الواحد يتعامل مع أكثر من موظف
واعدكم ان قال احدكم "الموظف يتعامل مع اكثر من زبون " وسكت .. اعطيه هدية مني (فيروس VCL)
يالله نرسم جدولهما .. جدول الموظفين (Employee Table) (صورة 194 السابقة ...)
وجدول الزبون (Customer Table) (صورة 214) :
http://img4.picsplace.to/img4/14/214_000.jpg
عذرا على هذا الجدول الصغير .. تخيلوووو .. أن لدينا 200 عمود ... و100000 صف .... اوكيه ,,,
مارأيك .. اين نضع مفتاح الاجنبي .. ؟؟
مممممم .... مارأيك لنجرب .. انا منذ زمن اريد ان اجرب .. مالذي يحدث اذا وضعت المفتاح في جدول الزبون ؟؟ يالله ؟؟؟
مثلا .. الزبون أبراهام (اعتقد ان أبراهام هو إبراهيم بس بالغربي ^^) صاحب الرقم 106 ... تعامل مع الموظف احمد و والموظف خالد
والزبون جاسم ... تعامل مع الموظف اكرم فقط ... ثم تعامل مع اكرم مرة ثانية ...
ومثلا ... الزبائن كلهم الباقين.. لم يتعاملوا مع أي موظف ...
.... كيف نكتبها ذي ؟؟ نجرب ؟؟ يالله نجرب ^^ (صورة 224)
http://img8.picsplace.to/img8/2/224.jpg
ياسلام ... المفتاح الاجنبي بامكانه ان يتكرر ... تكرر مرتين رقم الموظف اكرم .. ^^
ومن خصائص المفتاح الاجنبي ... ايضا هو ان لا يكون خاليا ^^ ....
لحظة ... هناك قيم خالية ..... في المفتاح الاجنبي ..
وهناك تكرار في المفتاح الاساسي ... الخاص بابراهام والجاسم ..!!
وهناك تكرار للبيانات الخاصة بابراهام وجاسم .... !!
لا لا لا ... وضع المفتاح الاجنبي .. في جدول الزبون ... غباء .. انسى الموضوع ^^"
طيب ... لو وضعته في جدول الموظفين ...
مين ذكي ؟؟ هل توجد مشكلة ؟؟
تالله انها نفس المشكلة ... جربوها وشوفو .... يمكن اكون غلطان .. هيا جربها الان ...
دقيقة و اثنان واربعون ثانية ... لا تكلفك شيء .. جربها الان ...
جربتها ؟؟
ممتاز ^^ عظيم ^^ (والله اني عارف انه لا احد جربها ,,,)
المهم ...
مالعمل ... ؟؟؟
العمل يا سيد ... هو انشاء جدول جديد !! ....
نسميه ... جدول (موظفين- زبائن ) (Emp_Cust Table)
نستلف من الجدول الاول مفتاح اجنبي .. ونستلف من الجدول الثاني .. مفتاح اجنبي ..
وووو ... بس ^^ §
يسمى هذا النوع من الجداول بـ Junction Table )) الجدول التقاطعي
يالله ... مرة ثانية ... نشوف الي يصير ....
الزبون أبراهام صاحب الرقم 106 ... تعامل مع الموظف احمد و والموظف خالد
والزبون جاسم ... تعامل مع الموظف اكرم فقط ... ثم تعامل مع اكرم مرة ثانية ...
انظر جدول زبائن_موظفين (صورة 234)
http://img6.picsplace.to/img6/8/234_000.jpg
سبحان الله .. كأن هذا الجدول يرصد تاريخ لقاء الزبون صاحب الرقم 105 (جاسم) مع الموظف 123336 الي هو .... انتظر اشوف جدول الموظفين .......
ايه اكرم ^^ ..
شايفك الان متضايق من الارقام هذه الكبيرة (123336 ... 123335 ... الخخخ) .. ولكن في الحياة العملية ... حتشوف ارقام اكبر واعقد
يمكن تلاقيها ارقام واحرف ..... تدرب من الان ^^
هل شاهدت الان الجدول وكيف يرصد تاريخ علاقة الموظفين بالزبائن ؟؟ (علاقة = التعامل)
او بمعنى اخر .. يرصد تعامل الموظفين مع الزبائن ؟؟
لو مثلا الزبون رقم 102 تعامل مع الموظف صاحب الرقم 123333 .... نضيف صف في الجدول السابق ...
انظر الصورة (244)
http://img8.picsplace.to/img8/2/244.jpg
لو طلبت منك ان تضيف تاريخ للعلاقة بين الموظفين والزبائن ... ماذا تعمل ؟
نضيف حقل .. وهو تاريخ تعامل الموظف مع الزبون ..
لو طلبت منك أين المفتاح الأجنبي .... ؟؟ صح .... ممتاز .... انه رقم الموظف ورقم الزبون كلاهما مفتاحان أجنبيان ^^ ...
لو طلبت منك (ياخي فكنا ياااااخي كل شوي تطلب.. اففف مدير مسوي زحمة ) << طيب .. آخر طلب ^^"
لو طلبت منك .. أن تخبرني .. أين المفتاح الأساسي ؟؟
مفيش ؟؟
والعمل ؟
نضيف مفتاح أساسي .. ونسميه .. مممممم ... أي شي ... وليكن "handle_no" رقم التعامل ...
انظر الجدول (صورة 254)
http://img6.picsplace.to/img6/8/254_000.jpg
الان انظر لهذا الجدول (الصورة 264)
http://img6.picsplace.to/img6/8/264.jpg
لو طلب منك المدير حمزة .. على فكرة .. تخيل المدير حمزة انسان معقد جدا .. ورأسه متصلب كالصخرة ... تقول ايه يقول لا .. تقول لا .. يقول ايه.... فاذا بغيت شي منه .. قول ما ابغى ^^ .. المهم المهم
لو طلب منك المدير حمزة .. ان لا تضع حقل جديد .. ولا يريد ان تضيف حقل وتجعله مفتاح أساسي للجدول ... مالعمل ؟ (تخيل ان المدير حمزة .. معاه حساسية من المفتاح الاساسي ^^)
مستحيل صح ؟ لازم نضيف عمود جديد صح ؟؟؟
خطأ !!!!
بامكاننا ان نخترع من هذان الحقلان مفتاح اساسي ^^ ....
يعني لو مزجنا الحقلان هذان ... ينتج عندنا المفتاح الاساسي ...
خذها قاعدة .. لو لم تجد عمود يستحق ان يكون مفتاح أساسي .... بإمكانك ان تجعل أكثر من عمود مفتاح اساسي ..
يمكن يكون عمودين زي مثالنا ... يمكن ثلاث .... وهلم جر ,,,
ماذا بكم ... ماذا دهاكم ...
كأني أرى الطير فوق رؤوسكم .... أنا عارف معظمكم ما فهم نقطة مزج أكثر من عمود ليصبح مفتاح أساسي ...
إليك شرح مفصل .. أحذرك قبل أن تقرأ ... قد تمل من هذا الشرح .. ولكن .. طريقك الوعر والوحيد في الفهم أكثر وأكثر ...
سنعود بعد قليل :09:
The Coder
07-12-2005, 01:20 PM
شايف الجدول السابق ؟(الصورة 264 السابقة )
http://img6.picsplace.to/img6/8/264.jpg
أول صف .. ضم القيمتين .... وش يصير الناتج ؟
يعني 123336 نضمها مع 105 يصبح لدينا .... 123336105 واو .... هذا المفتاح الاساسي لأول صف !! والمفتاح الأساسي لا يمكن ان يكون خالي او أن يكون مكرر .... صح ؟؟
طيب ... ضم الصف الثاني ..
يصير الناتج ... 123331106 همممممم .... مختلف تماما عن السابق .. ^^ .. لا يوجد قيمة خالية .. ولا يوجد قيمة مكررة ^^ ,,,
لأنه اختلف رقم الزبون ومعاملته مع الموظف عن رقم الزبون الأخر عن الموظف الأخر ...
طيب ضم الصف الثالث ... أوه .. رقم الزبون نفس رقم الزبون في الصف السابق !!
بعد أن ضمينا ... 123335106 ..... رقم مخالف عن 123331106 في الصف الثاني ...
بالرغم من أن رقم الزبون تكرر مرتين .. ولكن اختلف رقم الموظف !!
الزبون 106 تعامل مع موظفين مختلفين ^^
ونتج قيمتين مختلفتين حل رائع صح ^^ !!
الصف الرابع .. تكرر رقم الموظف ثانية !! ... هل سيؤثر ؟؟ هل تعتقد انه سوف يكرر المفتاح الاساسي ؟
الناتج من ضم الصف الرابع هو 123335102 يشبه (من ناحية رقم الموظف ) ناتج الصف الثالث 123335106
ولكن يشبهه قليلا ^^ ..
تعامل الموظف 123335 مع الزبون 106 ومع الزبون 102 ومافيه أي اشكال ^^
هذا حل قوي جدا .... ولكن ... لا نستخدمه في كل الاحيان .. ليييييييش ؟ هناك حالة لو صارت ... لا تستخدم هذا الحل ... ماهي الحالة الجديدة ؟؟
حالة جديدة على حسب المتطلبات :
نتماشى مع القاعدة رقم واحد .. أي جاءتك متطلبات جديدة من مديرك حمزة ...ويخبرك بأنه يريد عدد المرات التي تقابل او تعامل فيها الموظفون مع الزبائن ولا اريد ان تضيف مفتاح اساسي .. ماذا تفعل ... ؟؟
هل تذكر الصورة 244 ؟؟
http://img8.picsplace.to/img8/2/244.jpg
قال لك المدير حمزة ... ان لا تضيف مفتاح أساسي .. وأنت اقترحت أن يكون العمودين معا... مفتاح أساسي صح ؟
انظر الصورة 244 ... لو تعامل الزبون 105 مع الموظف 123336 (الصف الاول ) ثم تعامل الزبون نفسه مع الموظف نفسه !! ( الصف الثاني).. مالذي يحدث !!
ضم الصف الأول .. وضم الصف الثاني وتطلع نتيجة متساوية وهي ... 123336105
مصيبة .... تكرر المفتاح الأساسي ... والعمل ؟؟ مالعمل ؟؟ المدير سوف يطردك لو قلت له انك تريد ان تضيف عمود جديد كمفتاح أساسي ... ولاحظ انه لا يريد المفتاح الأساسي ... (أي بمعنى آخر بإمكانك إضافة حقول ولكن لا يجب ان تكون مفتاح أساسي)
لهذه الحالة يجب ان نضيف حقل ويدعى ..عدد المرات"no_of_time" ... وهو اقتراح ليس الا ......
انظر الجدول (الصورة رقم 274)
http://img8.picsplace.to/img8/2/274.jpg
كم مرة تقابل الموظف 123336 مع الزبون 105 ؟؟ مرتين ^^ ...
لو تعامل الموظف 123336 مع الزبون 105 مرة ثالثة ؟؟ يصبح عدد المرات ثلاثة .... وهلم جر ,,,,
لخبطت راسك صح ^^ ... أنا أعلمك الآن شيء .. لم أتعلمه من كتاب .. بل من خبير قواعد بيانات ..
(سوف أتطرق إليه في الدروس القادمة إن شاء الله ) وبعض من خبرتي المتواضعة جدا ,,
انتهينا من الثلاث الامثلة للعلاقات .. وانتهينا من دراسة المفتاح الاجنبي .. وبقي سوال .. لماذا المفتاح الاجنبي لا يكون خاليا ؟؟ لو جعلناه خاليا .. مالذي يحصل ؟؟ اتحداك ان تعرف ,, (التحدي الاول )
* تحويل الوصف الى نماذج :
في هذا الدرس سوف تتعلم تحويل أي وصف الى نموذج ER
وجدت بعض الأمثلة و إليك هذه الأمثلة وأرجو أن تتبع كل كلمة فيها (تذكر القاعدة رقم 1)... وسوف نحولها الى نموذج ER , وبكل دقة , سوف افصل لك الحل .. واعلمك مادة لن تجد لها شرح كشرحي !! لاني وجدت حلول بدون شرح كيفية التحويل , وستعرف طريقة التحويل , بسيطة للغاااااية , ولكن المشكلة لا تتعلق بتعليمك اياها او لا ... المشكلة انها بالمنطق ,, ولا اعتقد انها صعبة لدى المعظم من الناس .
مثــال 1 :
* تحويل من وصف الى نموذج ER :
شركة تهتم بتسجيل معلومات عن الاقسام والمشاريع التي تنفذها الشركة وكذلك عن الموظفين العاملين فيها والتابعين لهؤلاء الموظفين ,
1- تقسم الشركة الى عدة اقسام ولكل قسم اسم واحد ورقم ولا يجوز ان يكون هناك اكثر من قسم بنفس الاسم او الرقم , لكل قسم موظف يدير هذا القسم ويجب معرفة التاريخ الذي بدأ فيه هذا الموظف بادارة القسم , ولكل قسم موقع واحد فقط .
2- القسم يمكن ان يدير عدة مشاريع , ولكل مشروع رقم واسم , ومكان تنفيذ .
3- يمكن ان يعمل في القسم موظف او اكثر ولكن الموظف يجب ان يتبع لقسم واحد فقط ,ونحتفظ بالمعلومات التالية عن الموظف الرقم ( لكل موظف رقم يميزه عن بقية الموظفين ) , الاسم (الاسم الاول , الثاني ,العائلة ) ,الجنس , الراتب , العنوان
4- الموظف يمكن ان يعمل في عدة مشاريع (ليس بالضرورة ان يدار المشروع من نفس القسم الذي يتبع اليه الموظف ) ونحتفظ بعدد الساعات التي عملها الموظف في كل مشروع .
5- تحتفظ الشركة بمعلومات عن التابعين لكل موظف (التابعين هم الأشخاص الذين يتبعون الموظف مثل الزوجة , الأبناء .... ) هذه المعلومات هي الاسم , تاريخ الميلاد , الجنس , صلة القرابة .
6- تهتم الشركة لمعرفة عدد الموظفين في القسم الواحد
7-المدير لكل قسم يدير جميع الموظفين تحت قسمه .
8- الموظفين نوعين , موظف ثابت ويأخذ راتب ثابت , وموظف يعمل بنظام الساعات ويأخذ نسبة عدد الساعات التي عمل بها .
الحـــــــــــــل :
الاحمر= علاقة
البني = كيان
الازرق = صفات
بالنظر في التحليل استطعنا ان نستخرج العلاقات + الكيانات + الصفات
اشير الى انه عادة (لاحظ .. عادة وليست دائما ) ..... الاسماء تكون صفات او كيانات ,, والافعال تكون علاقات ^^
استخدم هذه بذكاء ,,
الان نأتي للشرح المفصل ,,,
1- تقسم الشركة الى عدة اقسام ولكل قسم اسم واحد ورقم ولا يجوز ان يكون هناك اكثر من قسم بنفس الاسم او الرقم , لكل قسم موظف يدير هذا القسم ويجب معرفة التاريخ الذي بدأ فيه هذا الموظف بادارة القسم , ولكل قسم موقع واحد فقط .
استخرجنا الاقسام ككيان , واستخرجنا الموظف ككيان , لماذا لا تكون الشركة مثلا كيان ؟
لاحظ انه قال "لكل قسم اسم ورقم " وان الكيانات لديها صفات .... اسم قسم , رقم قسم .. صفات للقسم .. اذن القسم كيان , وصفاته اسم القسم ورقم القسم وموقعه .
لم يقل "الشركة لها أسماء الأقسام , أسماء الموظفين ..." ولكن قال "الشركة تنقسم الى عدة اقسام ...."
لاحظ انه لم يركز في صفات للشركة ... لذا استبعدنا كون الشركة كيان ,,,
استخرجنا موظف ككيان ... هنا لا توجد صفات للموظف ... لماذا استخرجناه ككيان ؟ لانه يوجد علاقة بين الموظف والقسم , وهي الفعل "يدير" , أي ان الموظف الواحد يدير قسم واحد , وان القسم الواحد يدار من موظف واحد , انتبه الى نقطة مهمة ... ذكر " التاريخ الذي بدأ فيه هذا الموظف بادارة القسم " , هذه صفة غريبة بعض الشيء , لانها لا توجد في القسم لوحده , ولا توجد في الموظف لوحدة , أي اذا اجتمع الموظف والقسم وصار بينهما علاقة الادارة , فتنتج هذه الصفة الغريبة !! فلنسميها صفة مشتركة لانها لا يمكن ان تكون موجودة الا بوجود علاقة الكيانين ... كيان القسم وكيان الموظف , ونضعها على العلاقة نفسها اليك النموذج الذي استنتجناه ولا تنسى ان تلاحظ الصفة الغريـبة (الصفة المشتركة ) ( الصورة 14)
http://img7.picsplace.to/img7/4/14_004.jpg
سوف اركز قليلا على اللغة الانجليزية في النماذج لانها لغة standard ,,,
Manage = يدير
Start_date = التاريخ الذي بدأ فيه الموظف بادارة القسم
Dept_no = رقم القسم وهو مفتاح اساسي ( Primary Key )Dept_name = اسم القسم
Loc = اختصار لـ location واعني بها الموقع
ملاحظة مهمة جدا : لاحظ الصفات جميعها بسيطة ,, وليست مركبة او ماشابه !!!.
2- القسم يمكن ان يدير عدة مشاريع , ولكل مشروع رقم واسم , ومكان تنفيذ .
هنا استنتجنا الكيان "مشروع " لان له صفات وله علاقة بالقسم وهي علاقة تحكم وإدارة , القسم الواحد يتحكم في عدة مشاريع , المشروع الواحد يتحكم (بضم الياء فعل مضارع مبني للمجهول) من قبل قسم واحد .
3- يمكن ان يعمل في القسم موظف او اكثر ولكن الموظف يجب ان يتبع لقسم واحد فقط ,ونحتفظ بالمعلومات التالية عن الموظف الرقم ( لكل موظف رقم يميزه عن بقية الموظفين ) , الاسم (الاسم الاول , الثاني ,العائلة ) ,الجنس , الراتب , العنوان
هنا ظهر صفات للكيان موظف ... ولكن ظهرت لنا علاقة جديدة بين القسم والموظف .. لاحظ انها كانت علاقة ادارة .. والان علاقة عمل !!
صفات الموظف هي : الرقم وهو مفتاح اجنبي كما يظهر لانه قال "لكل موظف رقم يميزه"
الاسم ... صفة مركبة , الجنس والراتب والعنوان .. صفات بسيطة ...
4- الموظف يمكن ان يعمل في عدة مشاريع (ليس بالضرورة ان يدار المشروع من نفس القسم الذي يتبع اليه الموظف ) ونحتفظ بعدد الساعات التي عملها الموظف في كل مشروع .
توجد علاقة بين كيان الموظف وكيان المشروع ... وهي علاقة العمل (يعمل في ) , وهنا يوجد صفة مشتركة بين الموظف وبين المشروع , وهي عدد الساعات التي عملها الموظف في كل مشروع , وكما قلنا لولا هذان الكيانان لما وجدت (بضم الواو وكسر الجيم ) هذه الصفة ,,, اذن نضع هذه الصفة المشتركة على العلاقة نفسها ..
اليك النموذج الذي استنتجناه (الصورة 24)
http://img8.picsplace.to/img8/2/24_011.jpg
لاحظ الصفة عدد الساعات "Hours" الموجودة في العلاقة "works on" , وهي علاقة مشتركة ,,
5- تحتفظ الشركة بمعلومات عن التابعين لكل موظف (التابعين هم الأشخاص الذين يتبعون الموظف مثل الزوجة , الأبناء .... ) هذه المعلومات هي الاسم , تاريخ الميلاد , الجنس , صلة القرابة .
تابعين هم بشر ... وهم كيان لهم الصفات اسم , تاريخ الميلاد , جنس , وصلة القرابة ,,
هؤلاء التابعين للموظف في الشركة , لو ان الموظف غير موجود بالشركة ... هل تهتم الشركة بمعلومات التابعين لهذا الموظف ؟
كيان التابعين لن يكون له وجود في النظام طالما ان كيان الموظف لا يكون له وجود في النظام ,
لذا فكيان التابعين هو كيان ضعيف "weak entity "
6- تهتم الشركة لمعرفة عدد الموظفين في القسم الواحد
هذه صفة لاي كيان ؟
هل للكيان موظف ام للكيان القسم ؟
هذه الصفة بامكاننا ان نجعلها بسيطة , ولكنها في الحقيقة ... مشتقة لانه بامكاننا ان نوجدها من عدد الموظفين في أي قسم , هذه الصفة تخص الكيان القسم وليس الكيان موظف , تخيل معي :
قسم أ وبه 50 موظف , قسم ب وبه 60 موظف .... اذن صفة مشتقة وخاصة بالكيان "قسم"
7-المدير لكل قسم يدير جميع الموظفين تحت قسمه .
هنا علاقة كيان الموظف مع كيان الموظف نفسه وهي الادارة (سوبر_فيزر )
8- الموظفين نوعين , موظف ثابت ويأخذ راتب ثابت , وموظف يعمل بنظام الساعات ويأخذ نسبة عدد الساعات التي عمل بها .
كيان الموظف له اكثر من نوع , موظف ثابت وموظف يعمل بنظام الساعات !!
اذن فكيان الموظف كيان رئيسي , سنضطر الى حذف الصفة "راتب " ونضيف صفة راتب ثابت الى الكيان الموظف الثابت , وصفة راتب بنسبة الساعات الى الموظف الذي يعمل بنظام الساعات .
الان انظر النموذج النهائي .. ولا تنسى ان تلاحظ علاقة السوبر فيزر بين الكيان الموظف مع نفسه ,,
... واي سوال أي استفسار احنا حاضرين ( الصورة 34 )
http://img6.picsplace.to/img6/8/34_005.jpg
The Coder
07-12-2005, 01:42 PM
* تحويل من نموذج العلائقي الكياني الى نموذج علائقي :
لماذا هذا التحويل ؟
تسهيل علينا تحويل التصميم الى قاعدة بيانات فعلية .
- الان كل كيان سوف يمثل جدول .
- وكل صفة تمثل حقل في هذا الجدول .
- وكل علاقة ينتج عنها مفتاح اجنبي ... ومن الممكن ينتج جدول .
اولا : الان خذ كل كيان على حدة , مع العلم ان كل كيان يمثل جدول .. اوكيه !!
- كيان الموظف : (الصورة 44)
http://img4.picsplace.to/img4/14/44_001.jpg
سنقوم بتجاهل الصفات المركبة الأصل , وفي كيان الموظف توجد صفة "الاسم" والتي تكون اسم اول , اسم ثاني , العائلة , تجاهل صفة "الاسم " وسوف ينتج لدينا ما يلي : (الصورة 54)
http://img7.picsplace.to/img7/4/54.jpg
والان لدينا جدول موظفين وهذه حقوله , لاحظ تجاهلنا للصفة المركبة "الاسم " واخذنا الصفات البسيطة التي تتكون منها هذه الصفة المتركبة ... الصفات البسيطة هي ..الاسم الأول + الاسم الثاني + العائلة .
- كيان القسم : (الصورة 64)
http://img6.picsplace.to/img6/8/64_000.jpg
وبعد تحويله : (الصورة 74)
http://img6.picsplace.to/img6/8/74_000.jpg
لاحظ اننا تجاهلنا الصفة المشتقة في تحويلنا من نموذج ER الى النموذج العلائقي ....
اذا واجهتك صفة مشتقة .. تجاهلها تماما .. عند هذا التحويل ,,
وسوف تعرف ان شاء الله فيما بعد ... الصفات المشتقة و كيفية ايجادها ,,,,
- كيان المشروع : (الصورة 84)
http://img6.picsplace.to/img6/8/84_000.jpg
وبعد تحويله : (الصورة 94)
http://img7.picsplace.to/img7/4/94.jpg
- كيان التابعين وهو كيان ضعيف (الصورة 104)
http://img8.picsplace.to/img8/2/104.jpg
بعد تحويله : (الصورة 114)
http://img7.picsplace.to/img7/4/114.jpg
بقي كيانين اثنين ... هما كيان الموظف رسمي , وكيان الموظف الذي يعمل بعدد الساعات ,سنشرحهما بعد قليل !!
ثانيا : جاء وقت العلاقات ,, نفصفصها حبة حبة ^^" (يفصفص = يمحص )
- علاقة السوبر فيزر ... مابين كيان الموظف مع كيان الموظف نفسه ...
شوف الصورة 294 (امتحنتكم بالصور ... )
http://img4.picsplace.to/img4/14/294.jpg
مانوع العلاقة ؟
واحد لمتعدد ومتعدد لواحد
نضيف المفتاح الاساسي ... من جهة الكيان المتعدد ... وهنا العلاقة مع الكيان نفسه !!
اذن ... نضيفه في نفس الجدول ^^ وهي حالة خاصة جدا ,, الصورة304
http://img7.picsplace.to/img7/4/304.jpg
Mgr هو رقم المدير .. وهو مفتاح اجنبي ولكن في نفس الجدول ^^ ... وزي مانتو عارفين ان المفتاح الاجنبي يشبه المفتاح الرئيسي المصدر له صح ؟ هذا يعني Mgr يشبه كثيرا Eno في المضمون .
هنا مسئلة تحيرني ... انظر الجدول للموظفين الآن : (صورة 314)
http://img7.picsplace.to/img7/4/314.jpg
لاحظ ان Mgr هو رقم مدير الموظف , لاحظ الفراغ ... لو ان محمد هو المدير , فماذا نكتب في حقل Mgr الخاص به ؟؟ من مديره ؟؟
لو تركناه فارغ . فلن يصبح مفتاح اجنبي ... انا شاهدت امثلة كثيرة يجعلونه فارغ , لماذا يا ترى ؟؟ هل لانه ليس مفتاح اجنبي ؟ لا اعرف لماذا يعملون هذا ...
انا اقول ... ان نضع قيمة 10022 في الفراغ ... وهذا رأيي الشخصي , واعتقد انه صحيح .
هل يوجد صفة مشتركة ؟
لا ..
- علاقة العمل بين الموظف وبين القسم ,, الصورة 324
http://img6.picsplace.to/img6/8/324_000.jpg
مانوع العلاقة ؟
واحد لمتعدد و متعدد لواحد , وانت مغمض عيونك تحط المفتاح الاجنبي في الجدول المتعدد وهو جدول الموظفين . لا يجي واحد ويقول ليش وضعناه في جدول الموظفين .. حح ححححح .... حأجزره جزر!!!
والان يظهر لدينا جدول الموظفين المحسن انظر الصورة 334
http://img8.picsplace.to/img8/2/334_001.jpg
هل شاهدت مالذي حصل ^^ ؟ اضفنا رقم القسم D_no كمفتاح اجنبي ,,,
هل يوجد صفة مشتركة ؟
لا ...
- علاقة الإدارة مابين كيان الموظف و كيان القسم .. انظر الصورة 124
http://img8.picsplace.to/img8/2/124_000.jpg
هذه علاقة أخرى بين الكيانين .. مممممم .. محير صح ^^ .. تعودنا بين الكيانين علاقة .. وهنا تظهر علاقتين .. العمل + الإدارة ... وهذا معناه ماذا ؟ معناه انه بالإمكان تكون أكثر من علاقتين !!
مانوع العلاقة ؟
واحد لواحد (one to one). أي ضع في أي الجدولين مفتاح اجنبي (Foreign Key) .
طيب ... فين وليش نضيف مفتاح اجنبي ؟
انا أقول .... في جدول الاقسام وانت ماذا تقول ؟؟ اتحداك ان تعرف !! (التحدي رقم 2)
هل توجد صفة مشتركة ؟
نعم .. توجد صفة مشتركة وهي .. تاريخ بداية الإدارة ...
انا شخصيا لا ادري اين تضع الصفات المشتركة ... لان المنهج لم يشرح النقطة هذه .. سوف ابحث فيها اكثر ..
المنهج وضعها في جدول الاقسام ... والغالب في الامر انك تستطيع ان تضعها اينما شئت , وعلى حسب الصفة ,,, والله اعلم !!
الان انظر الى جدول الاقسام ( الصورة 284)
http://img7.picsplace.to/img7/4/284.jpg
واو ... انظر الى جدول الاقسام كيف تطور ^^ هل شاهدت رقم المدير (Mgr_no) وهو مفتاح اجنبي ,,,
لاحظ للمرة المليون ان المفتاح الاجنبي يرمز بالخط المقطع تحت عنوانه .
ممممممم ... باروح استريح ^^
The Coder
07-12-2005, 01:47 PM
- العلاقة "ادارة" بين المشروع والقسم :
انظر الصورة 344
http://img4.picsplace.to/img4/14/344.jpg
مانوع العلاقة ؟
واحد لمتعدد ومتعدد لواحد , القسم الواحد يتحكم او يدير اكثر من مشروع .. والمشروع الواحد يدار من قسم واحد بسسسسسسسس .... يعني المفتاح الاجنبي في جدول المشاريع .
الصورة 354
http://img7.picsplace.to/img7/4/354.jpg
يوجد صفة مشتركة ؟
لا
- علاقة "العمل" بين الموظف والمشروع : الصورة 364
http://img8.picsplace.to/img8/2/364.jpg
نوع العلاقة متعدد لمتعدد !!
اوبس !! مالعمل ؟؟... اين نضع المفتاح الاجنبي ؟؟ مين يذكرني ؟
الحل هو الجدول التقاطعي (هل تذكرت فكرة هذا الجدول؟) , ونسميه Proj_Emp table
هل يوجد صفة مشتركة ؟
نعم يوجد .. وهذه الصفة نضعها في ... الجدول Proj_Emp
والان لاحظ حقول الجدول Proj_Emp الصورة 374
http://img8.picsplace.to/img8/2/374_001.jpg
المفتاح الرئيسي لهذا الجدول هو رقم الموظف ورقم المشروع معا !!
وهذه المسئلة لحسن الحظ لا يوجد ذلك المدير اللكدة حمزة ..(اللكدة= الغثة = معقد الامور)
حيث بامكانك تضيف حقل وتجعله مفتاح اساسي .. ومثلا تسميه ماشئت مثلا ...Proj_emp_no او أي اسم اخر ,, ^^
انتهينا من العلاقات ...
هل تذكر منذ زمن بعيد في العصر الحجري تقريبا .... لما قلت لك اترك كيان الموظف رسمي , وكيان الموظف الذي يعمل بعدد الساعات ؟؟
مممم ... ذاكرتك قوية ^^ ... اذن يا صاحب الذاكرة ... فضلتها في الدرس القادم اشرحها ^^ لانه صراحة المسئلة هذه .. لم تمر علي قط , والمنهج العربي الذي استمد منه الدروس اعتبره قديم جدا , وسيء للغاية , ولكن يفي بالغرض ... في بعض الاحيان .
اعتقد انني سوف ابحث عن مناهج اخرى , وليست عربية . هذا المنهج سيء للغاية عن هذه المسئلة .
بامكاني ان اسرد ما ذكره المنهج , ولكن فضلت انني أقف هنا على اساس انني ابحث في تصميم قواعد البيانات الحديثة ... فترقبوا ^^
التحديات :
اتحداك ان تحل احد هذه التحديات او كلها :
التحدي الاول : لماذا المفتاح الاجنبي لا يكون خاليا ؟؟
التحدي الثاني : مارأيك ... لماذا انا اقترحت عليك ان تضع المفتاح الاجنبي في جدول الاقسام ؟؟ وما رأيك انت ؟
المهام : اريد منك ثلاث مهام تعملها ....
- قرائة الدرس .
- قرائة الدرس .
- قرائة الدرس .
انتـــــــــــهى الدرس الرابـــــــــع
The Coder
08-12-2005, 08:03 PM
الدرس الخامس :مفاهيم قواعد البيانات ..
السلام عليكم
بداية الدرس الخامس ... انني لست من سوف يشرحه ... بل .. احد السادة في احد المواقع ..
في هذا الدرس ... سوف تسرد لكم مفاهيم قواعد البيانات الهامة , وبعدها تخش قليلا في العميق , هناك رجل يدعى بـ InternetMaster .... والله يا ناس اسم على مسمى ,,,
كان يعطي في احد المنتديات مفاهيم وخبرة عشرين سنة .... صراحة اعجبت بطريقته واعجبت بتشويقه واعجبت بعلمه و اصراره .....
ستجد كل شي ... عن كلامه .. وجميع الحقوق محفوظة لانترنت ماستر .... فجزاه الله الف الف خير ....صحيح انه لم يكمل دورته .... ولكن صحح الكثير من المفاهيم الخاطئة .. بطريقة عجيبة جدا ....
هذا الرابط .. اذا اردت ان تقرأ كل مقالاته
http://www.arabteam2000-forum.com/index.php?showtopic=35237&st=0 (http://www.arabteam2000-forum.com/index.php?showtopic=35237&st=0)
فهو الدرس الخامس .... واجبرك ان تقرأ جميع كتاباته المتعلقة بـقواعد البيانات ....
3 ساعات كفيلة بان تنسخ خبرة 20 سنة !!! ..... فكر فيها .... هل تضيع 10 سنوات او 20 سنة ؟؟ ام 3 ساعات ..؟؟
الخيار لك !!!
لقد تطرق الى لغة الـHTML ... ولست مطالب بذلك ,,,
ولقد تطرق الى جمل الـ SQL اقرأها بشكل سريع لاني سوف اشرحها بشكل كافي ووافي ... فلا تخف ^^
اهم شي .. في دروس جمل الـ SQL هي ان تعرف معنى استعلام !!
ايضا تطرق الى الاكسس .... فحاول ان لا تطبق معه لاننا هنا اوراكل ^^ ...... ولان البعض لا يعرف الاكسس جيدا
لا تطبق ... ولكن تخيل اوكيه ^^
سوف يتطرق الى قوانين قواعد البيانات والى تماسكها ....
هل تذكر التحدي ... مالذي ينتج من جعل المفتاح الاجنبي فارغ ؟ ستجد حله في هذه المقالات ....
توقع ان الدرس السادس .. امثلة لتصميم قواعد البيانات ....
والدرس السابع هو بداية لغة الـ SQL , اوكيه ؟؟
يالله سلااام ,,
The Coder
08-12-2005, 08:09 PM
السلام عليكم ,,,
"احدهم" ارسل لي التحديات , اشكره على حلها , وصراحة وجدت عنده خطأ بسيط في مفهوم الكيانات الاساسية .. والكيانات الفرعية .
قلنا ان الكيان اذا كان يوجد منه اكثر من نوع متشابهين.. ولكن مختلفين في الصفات .. فاننا نقسم هذا الكيان بعدد الانواع
http://img4.picsplace.to/img4/14/__1582___1591___1571_.jpg
لاحظ هذا النموذج وهو الذي ارسله "احدهم" , قسم كيان القسم الى ثلاث انواع !!!
المشكلة ان الانواع الثلاثة .. صفاتها متشابهة , أي يوجد تكرار
قسم كيان الموظف الى نوعين , الفترة الصباحية والفترة المسائية ,
المشكلة تكمن في ان النوعين متشابهين تماما في الصفات .. ليش التكرار ؟
انا اقترح عليك يا "احدهم" مايلي :
http://img5.picsplace.to/img5/15/__1578___1589___1581___1610___1581_.jpg
انا قسمت الموظف الى قسمين .. موظف يعمل بالساعات H-Employee وموظف رسمي براتب ثابت S_Employee
شايف اقتراحي كيف جعلت الصفات المتشابهه في الكيان "الموظف " ؟ والصفات المختلفة والتي هي "الراتب الثابت Salary" و "الراتب بنسب الساعات hour_rate_salary"
هل فهمت احد اخطائك ؟
شايف الصفات ذو اللون الاحمر ؟
The_interval .. أي الفترة ..
يمكن ان تكن صباحية او مسائية
انا جعلتها صفة للكيان موظف .. افضل من ان اجعله كيان فرعي صح ؟ لا يوجد الان تكرار ^^
شايف الصفة الحمراء الثانية ؟
Dept_name ... صفة للكيان قسم ..
يعني اسم القسم .. ممكن يكون حسابات , او صيانة , او علاقات ....... الخ
ولا يوجد تكرار ولا هم يحزنون ...
وصلت ^^ ؟؟
حاولت يا "احدهم" واخطأت , والان تستفيد من خطأك ان شاء الله .. راسلني اذا لم تفهم .. سوف اعيد واعيد واعيد ,,, انا من النوع الذي لا يمل الاجوبة ^^ .. صدقني
شكرا لك يا "احدهم" على ارسال التحديات جميعها .. شكرا لك ^^
يا سادة .. تالله لن تفهمو طالما لايوجد تمرس + قرائة + رغبة
حلو الواجبات والتحديات ,, حلوها يا بشر ,,
The Coder
11-12-2005, 11:51 AM
السلام عليكم ...
سأضطر الغياب لمدة اقل من اسبوع ...
فا .... المعذرة :D << سفر
وعلى فكرة .. كنت ناوي انتهي من الدورة لمدة شهرين ..
بس ... ما بتشجعو ... على طرح المواضيع بسرعة ..
فالافضل .. لي ولكم .. عدم الاسراع ..
وانا حسوي تكنيك .. قوي جدا .. لتعليمكم من الصفر الى اللانهائية ^^ ..
والقاعدة رقم اثنين تقول ....
"تعلم كل شي .. او لا تتعلم "
لذا ... حأجعلكم تعملو .. مشروع يفيدكم ..
وسأجعلكم ان شاء الله تتعلمون البرمجة .. حتى ولو لم تتعلمو سطرا واحدا فيها ,,,
تتتتتتتررررررقبوووووووو
The Coder
13-12-2005, 09:58 PM
السلام عليكم
احدهم ارسل لي هذه الرسالة :
"شكرا لك أخي درسك هذا كان رائع و طريقتك في الطرح تعجبتني جدا لكن الموضوع بدأ يصعب شوية فالنموذج كان كبيييييير و يتووووه .
و على فكرة أنت قلت أن وضع المفتاح الأجنبي في جدول الموظفين لن يجربه أحد ، لكن أنا جربته لا تكن بهذا التشاؤم ! "
وارد عليه واقول .. لم يجرب غيرك يا "احدهم " ^^ .... ولم يرسل لي احد التحديات الا انت وأخر فقط ...
وانا اعرف متى اتشائم .. ومتى اتفائل ^^ ,,,, لا تخف علي ^^
ومن ناحية ... ان النموذج كبير ويتوه ..
قصدت ذلك .. وكنت ناوي اضع نموذج اعقد واعقد ... لكي تتدرب بشكل قاسي وقوي ..
وتواجه اي نموذج تجده امامك في المستقبل .. مهما بلغت صعوبته ,,,
شكرا لك يا "احدهم" ... وشكرا لكم ^^
The Coder
18-12-2005, 11:12 AM
الدرس السادس
السلام عليكم ,,,
هذا الدرس ..اعتبره من اهم الدروس .. ويشكل احد الاعمدة الاربعة التي نتكيء عليها في منهجنا هذه ...
ومن ناحية البرنامج الخاص بلغة الـ SQL فسوف اشرحه لاحقا ... لذا اريدك ان تفهم الدرس بدونه الان ,,,,
توقع انني لن اكثر عليك تحديات في هذا الدرس ... اعرف انك سعيد بهذا ,,,
بسم الله الرحمن الرحيم
اسم الدرس : لغة الاستعلامات SQL
نوع الدرس : تطبيقي + فكري
صعوبة الدرس : *** من *****
اهميــة الدرس : ****** من ***** (Over)
الوقت المتوقع منك لفهم الدرس : 8 ساعات (ساعتين فهم و 6 ساعات تطبيق )
متطلبات تتوفر فيك : التطبيق
المتوقع منك في هذا الدرس :
- اتقان جزء كبير من هذه اللغة 100 %
هيا لنؤركل ^^
* لغة الاستعلامات (او الاستفسارات) والتي تدعى بـ SQL :
احب ان اشير الى قاعدة مهمة ... وهي القاعدة رقم 3
(البيانات + معالجة = معلومات)
وكما عرفت في الدرس الخامس .. هذه القاعدة , لذا يفترض انك تعرف مالبيانات .. ومالمعلومات ..
ولماذا البيانات .. ولماذا المعلومات . وما هي اصلا المعالجة , ولماذا نحصل على المعلومات ..
اعرف ان ثلاث ارباعكم ما قرأوا ولا بيعرفوا الاجوبة ....
لكن ... الله المستعان ,,,
اذا لم تقرأ الدرس الخامس ... اذهب ولا تقرأ ....
SQL تعني Structured Query Language أي لغة الاستفسارات وهي لغة برمجة قواعد البيانات ....
وعلى قول انترنت ماستر (الدرس الخـامس) مايلي : (ما بين القوسين كلامي انا )
" Query تعني إستعلام إستفسار إستفهام إستنباط إستنبطاااح ---- وصلت الفكرة؟؟؟
السؤال البديهي والتقليدي هو ما الفرق بين الجدول والإستعلام؟
(الجدول الي هو الملفات الموجودة والمخزنة لدينا والتي تمثل جداول .. الاستعلام هو الحصول على المعلومات من هالجداول وعرضها كجدول ... وايضا تغيير القيم فيه .... مافهمت ؟؟ طيب طيب ... حتعرف بعدين .. نكمل كلامه .. ونعرف الفرق )
الجدول هيكل خرساني شديد التماسك والتكامل يعمل مع بقية الجداول مع محافظته على إستقلاله وشخصيته. الجدول هو رجل ببدلة رسمية منتصب الطول عابس الوجه لا يمزح ويسير في الشارع بجدية مفرطة وإلتزام كبير.
لا تمزح مع الجدول... الجدول لا يقبل المزاح ول لا العبث ويغلب عليه التماسك والشدة والعبوس والتجهم.
(ملف مخزن ... شكله واحد موحد .. ولا يتغير مع الزمن ^^ )
الإستعلام (ولد صايع) على رأي الأخوة في مصر ... حبوب، لذيذ، يحب المزاح، سهل التعامل معه، يقبل كل أنواع المزاح والعبث ولكن إذا مزحت معه من (اليمين)، إذا مزحت معه من (اليسار) --- نسف قاعدة البيانات من جذورها. هل سمعت بمثل إتق شر الحليم اذا غضب --- هذا هو الإستعلام !!!
لأن السيد Codd مزق حقولنا ووزعها في جداول مختلفة كان لا بد من طريقة ما لتجميع هذه الحقول مع بعضها البعض !!!
(تفتكرون ليش قسمنا الجداول ... وتفتكرون ليش طلعت حاجة اسمها المفتاح الاجنبي ... )
الجدول هو الإستعلام، والإستعلام هو الجدول !! مع مرونة عالية جدا جدا جدا في كيفية تشكيل الإستعلام.
(الاستعلام ينتج لنا جدول ... يعني حيصير جدول بس بالطريقة الي احنا نبيها .... )
SQL هي لغة تستخدم علم (المصفوفات) من الرياضيات للوصول إلى الحلول --- ولا يهمك حقيقة ماذا تستخدم ولكن للعلم بالشىء فقط لمحبي هذا العلم الرائع المسمى المصفوفات Matrices ومفردها مصفوفة Matrix.
الغريب في SQL أنها عميقة الجذور وفي غاية التعقيد الشديد جدا، ولكن الممتع في الموضوع أن كامل اللغة بكل أبعادها تتكون من أقل من 10 أوامر -- صدق أولا تصدق أو حتى أقل من 5 أوامر على ما أذكر !!!
قلنا أن SQL تمزح من الجهة اليمين --- وتغضب من الجهة اليسار، ما معنى هذا؟
هناك إستخدامين إثنين فقط للغة SQL واحد أسميه مزاح من اليمين والآخر مزاح من اليسار:
الإستخدام الأول (مزاح من اليمين): هو الحصول على البيانات بأي شكل وبأي كيفية (لكي ينتج البيانات التي طلبناها على شكل جدول )
الإستخدام الثني (مزاح من اليسار) : هو تحديث Skeleton او الهيكل الخرساني لقاعدة البيانات أي تغيير وتعديل الجداول والحقول والروابط ---- اااووو خطير جدا !!!
"
ويضيف " النوع الثاني من المزاح ينقسم إلى شقين:
الأول: تعديل في البيانات داخل الجداول " في السجلات" -- وينبغي الحذر
الثاني: تعديل في الجداول والحقول والروابط بينها --- وهو الخطير -- وينبغي الحذر الشديد جدا
تعدل بيانات الجداول يتم من خلال:
إضافة سجلات جديدة
تعديل سجلات موجودة
حذف سجلات موجودة
"
انتهى كلامه ......
اضيف انا انه في تعديل الجداول والحقول والروابط بينها ... يعني مثل اضافة عمود او حذفه او تعديل اسمه ..
اضافة جدول او حذفه او تعديله ... اضافة علاقة ...... الخ
اذن ... لغة الـSQL تلعب في الجداول لعب .... ولها غرضين ,, غرض استفسار عن معلومات ... يعني نطلب عرض معلومات ,, وغرض تعديل بيانات وتعديل تركيب الجدول .
افهم جيدا .. اذا لم تقم بتركيب الاوراكل .... دبر نفسك .... حمله .. ركبه .. اشتريه .. اسرقه ... يجب ان تمتلك أي اصدار من الاوراكل .. لجمل الـ SQL .. أي اصدار .. قديم حديث لا يهم الان .... دبر نفسك فيما بعد في الاصدارات ,,,
الان سوف اعرض عليك تكنيك قوي جدا جدا جدا ....
وهو ان ... تقرأ ... وتطبق على الورق وتستنتج ... ثم ........................ تطبق على الحاسب ....
التطبيق على الحاسب اجعله اخر ما تفكر فيه الان ...
* اقسام لغة الـ SQL :
خمس اقسام فقط .... حنأخذها بتعمق ... طبعا انا لا اعرف ترجمتها معنويا ..لكن حاولت ذلك ...
نحفظها انجليزي ونفهم عملها .. ركز في المصطلح الانجليزي ,,,,
1- استرجاع البيانات (Data Retrieval) :
تخص الاستعلام عن البيانات من جدول ما ....
مثلا الموظف احمد يبي يعرض جميع الموظفين الي راتبهم اقل من 7500 ريال سعودي (7500 ريال سعودي = 2000 دولار امريكي ... وذلك بقسمة 3.75 .... )
فين وصلنا ؟؟ ايه ايه ... احمد يبي يعرض على الشاشة جميع الموظفين الي راتبهم اقل من 7500 ريال ... ايش يعمل ؟
على طول ... يدخل احد اوامر الاستعلام واسترجاع البيانات ,,
2- لغة التلاعب بالبيانات (Data Manipulation Language) اختصارها DML
وهي تخص بتعديل , حذف , او اضافة البيانات والسجلات في جدول ما .... (المزاح من اليسار ^^)
ممم .. احمد (نفس ذلك الموظف المغلوب على امره ) كان يفكر في البزورة وام العيال , وهو يفكر .. استخدم امر الاضافة و ادخل قيمة 9000 ريال في سجل المدير حمزة ...
في اخر الشهر لما استلم المدير الراتب ... جن جنونه .. ناقص من راتبه 9000 ريال ....
راح لاحمد .. وخذ سب وشتم انواع ....
احمد الان يريد ان يعدل هالمعلومة الخطأ في الجدول .... يعمل ايش ؟
يستخدم امر التعديل ....
3- لغة تعريف البيانات (Data Definition Language) اختصارها DDL
وهي التي تخص بتعديل , حذف او اضافة وانشاء الجداول وخصائصها (الاعمدة) وعلاقاتها ..
احمد (نفس ذلك الموظف .. بس في اليوم الثاني ) استخدم احد اوامر DDL وهو امر انشاء جدول جديد , بعد ما انشئه ماعجبه اسم عمود .. واستخدم احد اوامر الـ DDL وهو امر خاص بتعديل اسم عمود , لو يبي يحذف الجدول كله .... يستخدم امر خاص لحذف الجدول .
4- التحكم بالعمليات (Transaction Control)
هذه خاصة بتثبيت وحفظ العمليات ... يعني لو مثلا (مجرد مثال) عدل احمد اسم جدول الموظف الى "الموظفين"... ويبي يقفل الجهاز , لازم يستخدم امر خاص بحفظ هذه العملية ...
.. ندم احمد انه غير اسم الجدول .... ويبي يتراجع عن هذه العملية (قبل ما يكفشه المدير) وش يعمل ؟
على طول ... يستخدم امر التراجع ... ولا من شاف .. ولا من دري (صراحة ... من الممكن ان المدير عامل برنامج تجسس يعني يعرف حماقات احمد من "طقطق" الى "سلام عليكم " لذا انتبهوا ^^ .. سوف نبرمج هذا البرنامج فيما بعد )
5- لغة التحكم بالبيانات (Data Control Language) اختصارها DCL
خاصة بالصلاحيات .. يعني لو مثلا طنت في راس المدير الغثة (حمزة) في اخر الليل ... انه ما يبي احمد (الموظف المسكين) يعدل على الجدول الموظفين ... ولا يبي اصلا يعطيه صلاحية الوصول الى هذا الجدول , اش يسوي المدير ؟؟
يقوم بدري في الصبح .. قبل ما يجي المسكين احمد .... ويستخدم احد اوامر الـ DCL ,, ويلغي صلاحية المسكين للوصول الى الجدول ... فهمت ؟؟؟
سوف اركز كثيرا على الاختصارات .... لذا احفظها جيدا
اعرف انك تبي تقتلني عشان المصطلحات هذه ... ولكن تحمل قليلا ^^"
لن اشرح الان البرنامج المستخدم لتنفيذ جمل الـSQL لذا حاول تفهم الان بدونه .
The Coder
18-12-2005, 11:27 AM
القسم الاول ( ( Data Retrieval :
في استرجاع البيانات .. نستخدم امر واحد .. وهو الأمر Select
اذا لم يكن لديك برنامج SQL Plus فلا بأس ... انا سوف اشرح الان على اساس انك لا تملكه الان ...
سوف نتخيل ان لدينا هذا البرنامج ...
الان تخيل انه لدينا جدول الموظفين EMP ... وبه الحقول التالية الصورة (16):
http://img7.picsplace.to/img7/4/16_015.jpg
Empno هو رقم الموظف (مفتاح اساسي)
Ename هو اسم الموظف
Job هو وظيفة الموظف
MGR هو رقم مدير الموظف
Hiredate هو تاريخ توظيف الموظف
Sal راتب الموظف الاساسي
Comm الزيادات .. أي الرواتب الاضافية على الراتب الاساسي sal
Deptno رقم القسم الذي يعمل فيه ... (مفتاح اجبي (مفتاج غريب) )
الان تخيل انه ممتليء بهذه البيانات :
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
------ ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17/12/80 800 20
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7566 JONES MANAGER 7839 02/04/81 2975 20
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7698 BLAKE MANAGER 7839 01/05/81 2850 30
7782 CLARK MANAGER 7839 09/06/81 2450 10
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7839 KING PRESIDENT 17/11/81 5000 10
7844 TURNER SALESMAN 7698 08/09/81 1500 0 30
7876 ADAMS CLERK 7788 23/05/87 1100 20
7900 JAMES CLERK 7698 03/12/81 950 30
7902 FORD ANALYST 7566 03/12/81 3000 20
7934 MILLER CLERK 7782 23/01/82 1300 10
وتخيل انه لدينا جدول الاقسام DEPT وبه الحقول التالية (الصورة 26) :
http://img7.picsplace.to/img7/4/26_008.jpg
Deptno رقم القسم (مفتاح اساسي)
Dname اسم القسم (او نوعه)
Loc موقع هذا القسم
تخيل ان به هذه البيانات :
DEPTNO DNAME LOC
------ -------------- ---------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
الان انظر هذا التركيب البسيط للامر Select
Select * from dept ;
معنى هذا السطر هو ....
Select = اختر
* = جميع الحقول
From = من
Dept = الجدول dept
اختر جميع الحقول من الجدول dept ؟؟
لاحظ الفاصلة المنقوطة (;) في آخرالأمر ..... ومعناه نفذ الجملة ...
لو كتبنا الأمر السابق وضغطنا Enter
سوف ينتج لنا مايلي (بافتراض أن جدول الأقسام به هذه السجلات أصلا ) :
DEPTNO DNAME LOC
------ -------------- ---------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
ممممم.. عرض جميع السجلات الموجودة بهذا الجدول
نجرب الان هذا الامر ...
SELECT * FROM EMP ;
مالذي تغير ؟؟
وضعت اسم جدول اخر .... وهو جدول الموظفين وكأني اقول اختر جميع حقول الجدول EMP
وضعت جميع الحروف capital وليست small؟؟ هل تتوقع ان هذا خطأ ؟؟ لحسن الحظ انه ليس من الخطأ فعل ذلك
بعد ضغط زر الـEnter هل ستعرف مالذي سيعرض لنا ؟؟ شاهد ....
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
------ ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17/12/80 800 20
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7566 JONES MANAGER 7839 02/04/81 2975 20
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7698 BLAKE MANAGER 7839 01/05/81 2850 30
7782 CLARK MANAGER 7839 09/06/81 2450 10
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7839 KING PRESIDENT 17/11/81 5000 10
7844 TURNER SALESMAN 7698 08/09/81 1500 0 30
7876 ADAMS CLERK 7788 23/05/87 1100 20
7900 JAMES CLERK 7698 03/12/81 950 30
7902 FORD ANALYST 7566 03/12/81 3000 20
7934 MILLER CLERK 7782 23/01/82 1300 10
عرض جميع السجلات الموجودة بالجدول الخاص بالموظفين ...
جرب الان هذا الامر ...
SeLeCt * FrOm EmP ;
سوف تعرض نفس النتيجة السابقة ... أي ان لغة الـ SQL ليست حساسة من ناحية الاحرف ,,,
طيب ... اريد ان اعرض رواتب (Salary) الموظفين جميعهم ... كيف ؟
Select sal from emp ;
ونتيجة التنفيذ هي :
SAL
----
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
اوبس ... ظهر عمود الرواتب فقط ؟؟؟ مالذي حدث بالضبط ؟
Select sal from emp;
معنى هذا الامر هو اعرض لي القيم في العمود sal من الجدول emp
طيب .. اريد عرض عمودي الرواتب والاسماء الخاصة بالموظفين ؟؟
Select sal,ename from emp ;
SAL ENAME
---- ------
800 SMITH
1600 ALLEN
1250 WARD
2975 JONES
1250 MARTIN
2850 BLAKE
2450 CLARK
3000 SCOTT
5000 KING
1500 TURNER
1100 ADAMS
950 JAMES
3000 FORD
1300 MILLER
عرض لي سجلات العمودين الرواتب و الاسماء الخاصة بالموظفين
.....
مممممم ... علامة النجمة تعني "كل الاعمدة " ,,
طيب لو كتبنا الامر السابق بهذه الصيغة ..
Select *
From emp
;
وضغطنا Enter .... فسوف ينفذها من دون أي مشاكل ... يعني انه لا مشكلة من تجزئة وضع الامر ^^ الى عدة اسطر ... بل بالعكس , تجزئة الامر الى عدة سطور يسهل علينا الفهم اكثر ... سوف تلاحظ في الامثلة القادمة هذا الشيء .
- اريد ان اعرض جميع بيانات الموظف الذي يدعى بـ KING
اليك الامر :
Select * from emp
Where ename ='KING'
;
Where أي عندما يكون او الذي...
يعني اعرض لي بيانات جميع الحقول للموظف الذي اسمه = King
اضفنا الشرط .... where ename='KING'
سوف يعرض معلومات الموظف كنق فقط :
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
------ ---------- --------- ---------- -------- ---------- ---------- ----------
7839 KING PRESIDENT 17/11/81 5000 10
ممممم جميل جدا ,,,
نستطيع التحكم في عدد الاعمدة , وفي السجلات التي نريد عرضها .
اذا اردنا عرض راتب الموظف King مالذي نعمله ؟
Select sal from emp
Where ename='KING' ;
سوف يعرض :
SAL
-----
5000
اوبس ... أين اسم الموظف KING ؟؟ لقد كتبنا اسمه في الامر ..!! لماذا لم يعرض اسمه ؟؟
في الأمر السابق .. نحن قلنا اعرض الراتب فقط ... عندما يكون اسم الموظف King
بدأت الأمور تتعقد ... وبدأ في وجهك احمرار الغضب والغيظ مني ,,
اعذرني ... أنا سادي قليلا في شرح الأمور (سادي = هو الذي يتلذذ بالتعذيب )
سوف اعقد لكالآنالأمورأكثروأكثر ....
الان مارأيك في الامر التالي :
Select * from emp
Where ename ='king';
مالذي تتوقع من هذا الامر ... تخيل انك الان ضغطت Enter ... فسوف يعرض لك هذه النتيجة :
no rows selected
ومعناها ... لاتوجد صفوف مختارة ؟؟
أي لا توجد سجلات للعرض ؟؟
أي لا توجد بيانات للموظف الذي يدعى بـ king
أي لايوجد اصلا موظف يدعى بـ king
قبل قليل ... عرفنا انه يوجد موظف يدعى KING
ونحن قلنا انه KING او king لا مشكلة ...
لماذا ظهرت هنا مشكلة ؟؟
الم نقل ان لغة SQL ليست حساسة لحالة الاحرف ؟
في الحقيقة ان لغة الـ SQL ليست حساسة لحالة الاحرف .. ولكن في قواعد البيانات ... في جدول الموظفين تحديدا خزنا اسم الموظف بـ KING ... وليس king !!
فرق بين البيانات المخزنة في الجدول وبين اوامر الـ SQL فهذه في وادي والاخرى في وادي اخر ...
ان الحاسب جهاز غبي جدا ... ولا يملك الحس الانساني طبعا , ولا يعرف ان KING هو نفسه king
طيب ... هذه تعتبر مشكلة .. بل مصيبة ...
سوف تعرف حلها لاحقا
- اريد ان اعرض الراتب الاساسي ورقم واسم الموظف KING مارأيك ؟؟
Select empno , ename , sal from emp
Where ename = 'KING' ;
سوف يعرض لنا هذا الناتج
EMPNO ENAME SAL
------ ---------- ----------
7839 KING 5000
جميل جدا ...
الان .. مارأيك بالامر التالي :
select * from emp
where ename="KING";
مالذي سوف يحدث ؟؟ سوف تعرض لك مشكلة ...
ORA-00904: "KING": invalid identifier
لماذا ؟؟ مالمشكلة ؟؟ هل لاحظت تغيرا عن الأوامر السابقة ؟؟
بدل 'KING' وضعنا "KING"
ممممم .. يعني انه يجب ان تكون علامة تنصيص الاحادية...
هيا ... لنجرب معا هذه العلامة التنصيص الاحادية ...
اريد ان اعرض الان بيانات الموظف الذي رقمه 7521 ... الامر كالتالي :
Select * from emp
Where empno ='7521'
;
والناتج سوف يكون ..
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
------ ---------- --------- ---------- -------- ---------- ---------- ----------
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
طيب .. جرب هذا الامر :
Select * from emp
Where empno = 7521
;
لقد حذفنا علامة التنصيص الاحادية ... وسوف يعرض لنا نفس النتيجة السابقة ...
لماذا نستخدم علامة التنصيص اذن ؟؟
جرب هذا الامر ... بعد نزع علامة التنصيص الاحادية :
Select * from emp
Where ename=KING
;
سوف يعرض لك هذا الخطأ
ORA-00904: "KING": invalid identifier
ممممم ..
استنتاج : يجب استخدام علامة التنصيص الاحادية مع الحقول (حقول=أعمدة=صفات) التي من نوع الاحرف ....ولا يوجد أي خطأ اذا استخدمناها مع الأرقامأو حذفناها .... ^^ وصلت ؟؟
The Coder
18-12-2005, 11:37 AM
- عرض الحقول باسماء مستعارة :
مممم .. المدير حمزة (نفس ذاك المدير) يريد تعقيد الامور على الموظف احمد (نفس ذاك الموظف المسكين)
يريد عرض هذه النتيجة .... ويريد من احمد استنتاج الامر ..
النتيجة :
SALARY THE_NAME
------- --------
1250 WARD
1250 MARTIN
من الجدول Emp !!!
احمد يقول انه لا توجد حقول بالمسميات SALARY و THE_NAME ؟؟
كيف ظهرت هذه المسميات ؟؟؟؟
احمد يعرف جيدا انه انعرض رواتب و اسماء الموظفين والذين رواتبهم = 1250
ولكن لا يعرف هذه المسميات من الحقول
اليك الحل يا احمد ....
بامكانك يا احمد ... ان تسمي الحقول ما شئت في العرض فقط ... لم تفهم ؟؟
طيب ...
select sal SALARY , ename THE_NAME from emp
where sal = 1250;
مارأيك ؟؟
قلنا اعرض الحقل sal وسميه salary (لاحظ المسافة بين sal و salary)
واعرض الحقل ename وسميه the_name (لاحظ المسافة بين اسم الحقل وتسميته)
برافو يا احمد ... حللتها يا احمد ...
مطط المدير شعره .. حقدن وحنقن على احمد ... يريد تعجيزه باي طريقة ..
يقول المدير انه يريد اسم الحقل sal بهذا الاسم "salary" .. وليس "SALARY"
ويريد ename بـهذا الاسم "the_name" ... وليس "THE_NAME"
واحمد ماشاء الله عليه .... ذكي وفهمها على الطاير واقترح الامر التالي :
select sal salary , ename the_name from emp
where sal = 1250;
وظهرت النتيجة التالية :
SALARY THE_NAME
------ --------
1250 WARD
1250 MARTIN
اوبس .. لم يجدي نفعا ؟؟
مالعمل ؟ كل شيء يتحول الى احرف كبيرة (Capital) ؟؟
اليك الحل يا سيدي ,,
select sal "salary" , ename "the_name" from emp
where sal = 1250;
والناتج :
salary the_name
------- ---------
1250 WARD
1250 MARTIN
يعني بوضع علامتي تنصيص ثنائية للعنوان (العنوان الخاص بالحقل).. سوف تعرض لنا كما نريدها ...
لما كنت ادرسها منذ زمن ...كان اكثر شيء يعقدني ... علامات التنصيص ..
فمرة اقول ان علامة التنصيص الاحادية للعناوين .. والثنائية للمتغيرات الحرفية (القيم النصية كما فعلنا في اسم الموظف KING)....
ومرة اقول العكس ...
انتبه جيدا ... الثنائية للعناوين .. والاحادية للقيم النصية
انظر جيدا ... لهذا المثال :
select sal "SaLaRy Of ThIs eMpLoYeE" from emp
where sal=1250;
شكلنا من الحروف الكبيرة والصغيرة ... ووضعناها في علامة التنصيص باسم مستعار للعمود sal
سوف يكون الناتج مايلي :
SaLaRy Of ThIs eMpLoYeE
-----------------------
1250
1250
كما توقعنا ... ظهر بنفس الصيغة التي اردناها ,,, لاحظ وجود مسافات ... وهي لم تضر بشيء .. ولا مشكلة فيها .. انما المشكلة لو لم يكن هناك علامة التنصيص .. فيجب ان لا تضع مسافات في التسمية ,,
انظر هذا المثال الاخير :
Select ename as "Name" , sal as salary , deptno department_number
From emp
Where deptno=30;
Name SALARY DEPARTMENT_NUMBER
---------- ---------- -----------------
ALLEN 1600 30
WARD 1250 30
MARTIN 1250 30
BLAKE 2850 30
TURNER 1500 30
JAMES 950 30
ممممم ... زدنا كلمة as ... وهي كلمة زائدة في عرض الأسماء المستعارة ... سواء وضعناها .. او لم نضعها .. لا فرق ....( لماذا عرضتها في هذا المثال )؟؟ لكي لا تتفاجأ اذا شاهدتها في احد الكتب .. وتقول أنني لم أطلعك عليها ^^ .. بس
- عرض العمليات الحسابية :
انتبه !!! توجد نقاط مهمة جدا ..... يجب عدم اغفالها ,,,
نريد عرض رواتب الموظفين الشهرية بالقسم رقم 30 ... ونريد عرض رواتبهم السنوية .... مالذي نعمله ؟
اولا كيف نوجد الرواتب السنوية ؟
12 * الراتب الشهري = الراتب السنوي(annual salary ) ...
معادلة بسيطة ....
نحن نملك حقل خاص بالرواتب الشهرية .. صح ؟ وهو الحقل sal
ولكن لا نملك حقل خاص بالرواتب السنوية ...
هل تذكر في تصميم نموذج ER .. الصفات المشتقة ؟
وهي الصفات التي يمكننا ان نوجدها من صفات أخرى للكيان ...
مثل المعدل , او الربح السنوي ... او ماشابه ,,
قلنا ان لا تضع الصفات المشتقة كحقل في الجدول صح ؟
في القاعدة رقم واحد والتي تنص على "على حسب المتطلبات نعمل النظام او نبرمجه او حتى نصممه "
لو كانت المتطلبات في نظام الموظفين .. إيجاد الراتب السنوي (وهو صفة مشتقة.. ونوجدها من الصفة "الراتب") ... مالذي سوف يحصل ؟
لدينا خيارين لا ثالث لهما ..
اما ان نجعله حقل في الجدول بالرغم انه صفة مشتقة ...
أو اما ان نهمله , ولا نجعله حقل في الجدول , وفي الاستفسار نوجده ...
لماذا الخيار الأول .. ولماذا الخيار الثاني ؟؟
الخيار الاول ... وهو ان نجعل هذه الصفة المشتقة (الراتب السنوي ) كحقل في الجدول .. ويكون جاهز ..
تخيل معي هذا الامر .. اعرف انه لا يوجد حقل باسم الراتب السنوي (annual salary ) ولكن تخيل انه يوجد هذا الحقل ,,,
Select annual_sal ,sal from emp where ename='KING';
والناتج :
SAL ANNUAL_SAL
---- ----------
5000 60000
كل ما حصل هو اننا حصلنا على معلومة ثابتة من جدول الموظفين ...
لو ان راتب الموظف king زاد ... مثلا صار 5500 دولار .. فما العمل .. هل يبقى الراتب السنوي 60000 ؟؟
سوف نضطر الى تعديله هو الاخر .. وندخل القيمة 66000 ...
هذا اذا وضعناه كحقل جاهز في الجدول ...
اذا لم نضعه حقل ... كيف نوجده ..؟؟؟ أنا أخبرك الآن ..
select sal , 12*sal from emp ;
وسوف يكون الناتج .. ما يلي :
SAL 12*SAL
------ ----------
800 9600
1600 19200
1250 15000
2975 35700
1250 15000
2850 34200
2450 29400
3000 36000
5000 60000
1500 18000
1100 13200
950 11400
3000 36000
1300 15600
لاحظ العملية الحسابية .... أين عملناها ؟ في نفس الاستعلام ,,,
يا سلام .. لغة مرنة بشكل كبير , سواء اضفنا ضرب .. قسمة .. جمع .. طرح .. فسوف تنفذها ,,,
كل ما عملناه هو ... اننا قلنا sal*12 فقط .. وهو بشكل أوتوماتيكي .. عرف انها عملية حسابية ,,
الان دعنا نتفنن قليلا ونغير مسمى الحقل باسم مستعار ..
select sal , 12*sal as "Annual_Salary" from emp ;
انظر الى الناتج الان ,,
SAL Annual_Salary
----- -------------
800 9600
1600 19200
1250 15000
2975 35700
1250 15000
2850 34200
2450 29400
3000 36000
5000 60000
1500 18000
1100 13200
950 11400
3000 36000
1300 15600
هل تذكر الحقل comm ؟؟؟ وهو الخاص بالرواتب الاضافية ... بعض الموظفين لديهم رواتب اضافية والبعض الاخر لا يملك رواتب اضافية .. الموظف MARTIN .. لديه زيادة 1400 دولار .. مارأيك لو نحسب راتبه الاجمالي .. والراتب السنوي الاجمالي ؟؟ هل تعرف ؟؟
Select sal+comm "salary" , (sal+comm)*12 "annual_sal"
from emp
where ename='MARTIN' ;
سوف ينتج لدينا ...
salary annual_sal
------- ----------
2650 31800
معقدة قليلا هاه ؟؟ لماذا اضفنا الاقوس ؟؟ انسى امر الاقواس الان .. وركز في sal+comm ... وهي اضافة الراتب الشهري مع الراتب الاضافي للموظف MARTIN
- الأولويات الحسابية :
اولويات ؟؟ ما قصدنا بهذا ؟ اليك درس بسيط في الرياضيات ولكن مهم جدا في التطبيقات البرمجية .. لا يستحب ان تعرفه .. ولا يفضل ان تعرفه .. بل يجب ان تعرف هذا الدرس ...
لاحظ (لاحظ = فعل امر.. وهو اجباري) المعادلتين الحسابيتين التاليتين :
10+20*5 = ؟؟؟؟
لو قلنا 10+20 = 30
ثم ..
30*5 = 150
اذن الجواب هو 150
طيب ...
انا اعرف ان احدكم حسبها بهذه الطريقة ..
5*20=100
100 + 10 = 110
أي الطريقين اصح ؟؟ هل 150 .. او 110 ؟؟
لماذا بدأنا بالجمع ثم الضرب ...
ولماذا بدأنا الضرب ثم الجمع ؟؟؟
لماذا حصلنا على قيم مختلفة ؟؟
اريدك ان تحفظ الاولويات التالية الان ...
1- الاقواس
2- الاسس
3- الضرب او القسمة ..
4- الجمع او الطرح
احفظها صم ... يالله دقيقة حفظ ثم ارجع واقرأ ....
اليك المسألة التالية ...
(1+2)*3=???
هل الجواب هنا 9 ... او 7 ؟؟؟
الاولوية تقول الاقواس اولا ... يعني 1+2 = 3 ... ثم .... 3*3=9 ....
مسئلة اخرى
1+2*3=??
هل 7 ام 9 ؟؟
الاولوية تقول .. الاقواس .. ولكن لا يوجد اقواس .. اذن الاسس .. لا توجد اسس .. اذن ... الضرب او القسمة ..
3*2=6 ..
ثم الجمع او الطرح .. 6+1=7
مسئلة ثالثة ..
2*8/4 =??
لا اقواس ... لا اسس .. فقط الضرب و القسمة .. ايهما نبدأ ؟؟
لاحظ اننا كتبناها بالانجليزي ... ومسائلنا بالانجليزي ..
خذ اول عملية تواجهك عندما تقرأ من اليسار الى اليمين (لو عربي .. فاننا نقرأ من اليمين الى اليسار طبعا ,,)
اقرأ ... 2 ..... ثم ... ضرب ..... ثم 8 ... اذن الضرب له الاولوية ..
2*8 = 16
16/4 = 4
المسئلة ما قبل الاخيرة ..
(3*4)+5*(4-2)/2
هيا .. حلها في ورقة .. او في رأسك اذا كنت كألبرت انشتاين ...
الان حلها ...
,,,
,,
,
انتهيت ؟؟؟
الحل كالتالي ...
= (12 ) + 5 * (2 ) / 2
= (12) + 10 / 2
= (12) + 5
= 17
المسئلة الاخيرة :
1+2-3*5/5
مارأيك لو جربت ^^ ؟؟
....
...
..
.
الحل :
= 1+2-15/5
= 1+2-3
= 3-3
0=
اليك اول تحدي .. صعب لدرجة تجعلك تقف مشدوقا ... مستغربا مني .. لماذا أحب ان أعقدك ,,
((1+2)*(5-3) + 2 )/(1+2/2) = ???
وهو التحدي الاول في الدرس ,,, سواء حللت ام لم تحل التحديات... لن ينقص مني شيء ..
اذا تجاهلت التحديات .. فانت تتجاهل نفسك لا اكثر ولا اقل .. ولا اهتم ما اذا كنت حللت ام لا ,, كل شيء لمصلحتك انت ...
اذا لم تعرف راسلني . اطرح مشاركتك ... افعل أي شي .. وانا تحت خدمتك ,,
The Coder
18-12-2005, 12:12 PM
الان ... اريد عرض الرواتب للموظفين السنوية .. مضاف اليها 100 دولار اعاشة سنوية لجميع الموظفين ...
هل هذا الامر صحيح ؟
Select sal*12+100 from emp ;
هل تعتقد ان هذا الامر صحيح ؟
Select (sal*12)+100 from emp ;
وهل تعتقد ان هذا الامر صحيح ؟
Select sal * (12+100) from emp ;
أي الاومر اصح ؟؟
الامر الاول والثاني هما الصحيحان ...
اعتقد ان الاولويات بسيطة جدا ,, سوف تحتاجها كثيرا فيما بعد ... لذا لا تنسى ,,
- اداة ضم الحقول :
مارأيك بهذه النتيجة ... هل تستطيع ان تعمل مثلها ؟؟
ename and sal
---------------
SMITH800
ALLEN1600
WARD1250
JONES2975
MARTIN1250
BLAKE2850
CLARK2450
SCOTT3000
KING5000
TURNER1500
ADAMS1100
JAMES950
FORD3000
MILLER1300
هل تستطيع ان تجعل عمود اسم الموظف مدموج مع عمود الرواتب ؟
اليك الامر ...
select ename||sal as "ename and sal" from emp ;
سوف تعرض النتيجة السابقة ..
لاحظ هذه العلامة ||
وهي الخاصة بعملية ضم اكثر من حقل .. وعرضها بشكل مضموم ....
اليك مثال اخر
select ename||' and '||sal from emp ;
اضفنا نص ..
يعني ضمينا ename مع النص ' and ' مع sal
وسوف تظهر هذه النتيجة ...
ENAME||'AND'||SAL
------------------
SMITH and 800
ALLEN and 1600
WARD and 1250
JONES and 2975
MARTIN and 1250
BLAKE and 2850
CLARK and 2450
SCOTT and 3000
KING and 5000
TURNER and 1500
ADAMS and 1100
JAMES and 950
FORD and 3000
MILLER and 1300
هل لاحظت كيف عرض العمود ؟؟
لاحظ عنوان العمود ... عنوانه هو : ENAME||'AND'||SAL
صحيح ؟
طيب .. اريد ان اعرض عمود بهذا الشكل ...
" الموظف KING يأخذ راتب 5000 "
"الموظف SMITH يأخذ راتب 800 "
..... الخخخخخ
يعني اريد النتيجة مثل هذه النتيجة ....
The_Information
--------------------------------------------------
the emp_name is : SMITH and his salary is =800
the emp_name is : ALLEN and his salary is =1600
the emp_name is : WARD and his salary is =1250
the emp_name is : JONES and his salary is =2975
the emp_name is : MARTIN and his salary is =1250
the emp_name is : BLAKE and his salary is =2850
the emp_name is : CLARK and his salary is =2450
the emp_name is : SCOTT and his salary is =3000
the emp_name is : KING and his salary is =5000
the emp_name is : TURNER and his salary is =1500
the emp_name is : ADAMS and his salary is =1100
the emp_name is : JAMES and his salary is =950
the emp_name is : FORD and his salary is =3000
the emp_name is : MILLER and his salary is =1300
كنت اريد ان اجعله تحدي ولكن .... تراجعت ...
وكلي ثقة انك سوف تفكر فيه قبل ان تشاهد الاجابة ...
ممممممم ... خذ راحتك ... دقيقتين .. ثلاث ... خمس ... اعتقد انه يستحق خمس دقائق بالكثير ...
لا تريد ان تفكر فيه ...
طيب .....
انت حر .... اليك الامر ...
select 'the emp_name is : '||ename||' and his salary is ='||sal as "The_Information" from emp ;
معقد قليلا ... ولكن بسيط ,,,
- الغاء التكرار :
لو طلبت منك ان تعرض لي ارقام الاقسام الموجودة في جدول الموظفين ...
فسوف تقول ...
Select deptno from emp ;
وسوف يعرض هذه النتيجة ...
DEPTNO
-------
20
30
30
20
30
30
10
20
10
30
20
30
20
10
لو سألتك ما هي الاقسام الموجودة لدينا ؟؟
فستجيب ... مممم ... 20 ... و 30 ..... و 30... و 20 .... و 10 .....
بالله عليك .. فيه قسم له الرقم 10 .. وقسم له الرقم 10 ؟؟
ام انه هنالك قسم واحد يدعى 10 .. ولكن تكرر لاكثر من موظف ؟؟؟
لو نظرت في النتيجة السابقة ... لوجدت انها 14 سجل فقط ...
فكر لو كانو 14 مليار سجل .. وانه لا يوجد الا القسم 10 .. و 20 ... و 30 .... هل ستعرف ان عدد الاقسام قليل ؟؟
طبعا شبه مستحيل ...
نريد في هذه الحالة ان نلغي التكرار ...
اليك الامر ...
select distinct deptno from emp ;
كلمة distinct هي المسؤولة عن الغاء التكرار ,,
وكأني اقول .. اعرض لي ارقام القسم الموجودة بجدول الموظفين ... وبدون تكرار ,,
النتيجة ستكون ....
DEPTNO
-------
10
20
30
بدون تكرار ...
لا تقل انها غير مفيدة ... لو ان لدينا جداول كثيرة ومعلومات وبيانات ضخمة ... فسوف تعرف فائدتها ...
طبعا هذه الكلمة .. الخاصة بإلغاء التكرار .. لا تصلح إلا لـعمود واحد ...
ولا تصلح لاكثر من عمود ... نادرا ما تحدث .. واعتقد انها صدفة انها ستصلح لاكثر من عمود ,,
هل تريد ان تعرف مالذي سيحدث لو الغيت تكرار عمودين ؟؟
تخيل اننا نريد ان نلغي تكرار الرواتب و ارقام الاقسام .. اليك الامر ..
select distinct sal , deptno from emp ;
واليك النتيجة :
SAL DEPTNO
----- ----------
800 20
950 30
1100 20
1250 30
1300 10
1500 30
1600 30
2450 10
2850 30
2975 20
3000 20
5000 10
ستلاحظ ان الرواتب التغى تكرارها ... ولكن هل التغى تكرار ارقام الاقسام ؟
سوف تحدث مشاكل نحن بغنى عنها وعن شرحها ... ,,,, لذا ... استخدمها الان لعمود واحد ,,
- ماهي القيمة NULL
هي قيمة خالية ...
لا قيمة لها ...
ليست بصفر ...
وليست برقم ...
وليست مسافة ..
ولا حتى بشيء ...
لا احد يعلم ما قيمتها ... غير انها مجرد .. خالية ...
هي فراغ .... ولا شيء غير الفراغ ,,
هل تذكر العمود comm. من جدول الموظفين emp ؟؟؟؟
select sal , comm from emp;
النتيجة المتوقعة ... هي ...
SAL COMM
----- ----------
800
1600 300
1250 500
2975
1250 1400
2850
2450
3000
5000
1500 0
1100
950
3000
1300
هل شاهدت فراغات في العمود comm. ؟؟ اعرف انك لم تشاهدها , ولكن نكمل
بعض الموظفين لا توجد لديه بدلات (بدلات رواتب اضافية ..)
لاحظ ان احدهم لديه القيمة صفر والصفر ليست القيمة الخالية NULL .. ولاحظ ان بعضهم لديه القيمة الخالية NULL
والبعض الاخر يوجد عنده رواتب اضافية ,,
القيمة الخالية ... تسبب بعض الاحيان مشاكل ... و امراض معدية .. من تلبك معدي .. الى انفيولنزا ..
من هذه المشاكل مايلي ..
نريد حساب الراتب الكامل وهو يساوي .. الراتب الاساسي sal + الراتب الاضافي comm.
select ename , sal+comm from emp ;
والنتيجة هي :
ENAME SAL+COMM
---------- ----------
SMITH
ALLEN 1900
WARD 1750
JONES
MARTIN 2650
BLAKE
CLARK
SCOTT
KING
TURNER 1500
ADAMS
JAMES
FORD
MILLER
اوبس .. سميث راتبه 800 دولار ... ولا يملك أي رواتب اضافية .. أي قيمة الرواتب الاضافية هي NULL
بالله عليك .. قلي ..
800 + NULL = ؟؟؟
تساوي كم ؟؟
هل 800 ؟؟
قلنا ان NULL قيمة لا نستطيع تحديدها .. وهي خالية ,, وليست صفرا ...
اذن .. فناتج المعادلة ..
800+NULL=NULL
قاعدة اساسية ... يجب ان لا تغفلها .....
" اذا ضربنا ... جمعنا .. قسمنا ... طرحنا .. من القيمة NULL .. فالناتج هو NULL "
طيب ... مالعمل اذا اردنا ان نعرف الراتب الكامل ... لسميث المسكين ؟؟
سوف نحل هذه المشكلة فيما بعد ... ترقب ^^
* جملة الشرط where :
سوف ندرس جملة الشرط هذه بتوسع اكثر ..
سأقوم بتغطية هذه الجملة من جهتين ... من عمليات (معاملات) المقارنة ... ومن عمليات اخرى ,,
- اولا : عمليات المقارنة في جملة الشرط :
اخذت في السنة الاولى ابتدائي .. في الرياضيات ... المقارنة .. (اكبر من .. اصغر من .. يساوي )
... أصعب درس رياضيات ^^"
ممممم ... مثلا ,,
ايهما اكبر 1 او 1000 ؟؟
اعرف انك لا تستطيع التفكير ,,, او بالأحرى لا تعرف الاجابة لذا ..
ال 1000 اكبر من 1
يعني تنكتب 1000 > 1
وطبعا الـ 1 اصغر من 1000
طيب ... نعقد الأمور اكثر ...
ونقول ..
س اكبر من عشرة ... ما قيمة س ؟
س ممكن ان تكون سالب مليون ... ممكن تكون واحد ... ممكن اثنين .. ممكن ان تكون تسعة .. ولكن لا يمكن ان تكون عشرة ...
هي اصغر من العشرة ولو بشعرة ....
ممكن ان تكون 9.99999999
يعني باختصار ...س .... من سالب مالا نهاية .. الى التسعة
س= {- مالا نهاية ........... 9 }
طيب .. نعقد أكثروأكثر ,,
- س اكبر من او تساوي عشرة ...
يعني س من سالب مالا نهاية ... الى العشرة ,,
طيب ماقبل اخر مسألة بهذا الخصوص ...
- س اصغر من او تساوي ثلاثة ... واكبر من واحد ..
ما قيم س الحقيقية ؟ (حقيقية = هي أرقام بدون كسور ...)
س={2 , 3}
طيب اخر مسألة :
- س اصغر من 3 ... واكبر من او تساوي 3
قيم س الحقيقية هي ....
مممممممم ...
س= {-مالا نهاية .......... + مالا نهاية }
يعني جميع الأعدادبما فيهم الثلاثة ,,
الان انظر الصورة 36 :
http://img7.picsplace.to/img7/4/36_004.jpg
....
مممم ...
انتظرني ,,,
The Coder
18-12-2005, 12:18 PM
- مثال :
اريد عرض اسماء ورواتب جميع من رواتبهم اقل من او تساوي 1250 دولار ,,
يعني النتيجة تكون هكذا :
ENAME SAL
---------- ----------
SMITH 800
WARD 1250
MARTIN 1250
ADAMS 1100
JAMES 950
ماهي الجملة ؟
فكر ....
الحل :
select ename,sal
from emp
where sal <= 1250 ;
- مثال :
اريد عرض اسماء ورواتب الموظفين الذين لهم رواتب اكبر من او تساوي 1250 واصغر من او تساوي 3000
؟؟؟ كيف هذه ؟
ستعرف لها طريقين .. تذكرها جيدا .... احد هذه الطرق ... تجده في معاملات جملة الشرط where الاخرى ,
ثانيا : معاملات اخرى لجملة الشرط where
عرفنا المقارنة ..
الان تعرف بعض المعاملات الاخرى والتي يجب ان نتعمق فيها جيدا ..
1) المعامل Between
اذا كنت تشكو من اللغة الانجليزية مثلي .. فـكلمة "between" معناها "بين"
- مثال :
اريد عرض اسماء ورواتب الموظفين الذين لهم رواتب اكبر من او تساوي 1250 واصغر من او تساوي 3000
؟؟؟ كيف هذه ؟
اليك الجملة :
select ename , sal from emp
where sal between 1250 and 3000 ;
ومعنى الجملة السابقة ..
اعرض لي اسماء ورواتب .. الموظفين والذين رواتبهم ... مابين 1250 و 3000 دولار ,,
هل لاحظت تركيب المعامل between ؟؟ وهل لاحظت زيادة كلمة 'and' ؟
انا متأكد انك ذكي .. ولاحظت ان معنى الجملة السابقة ... مايلي :
اعرض لي اسماء ورواتب .. الموظفين والذين رواتبهم ...اكبر من او تساوي 1250 و اقل من او تساوي 3000 دولار ,,
ممممم ,,,,
انا شخصيا لم اكتفي .. اريد تجربة شيء ...
لو قلبنا القيمة الصغرى مع القيمة الكبرى ؟؟ يعني كتبنا الجملة كما يلي :
select ename , sal from emp
where sal between 3000 and 1250 ;
لاحظ انني بدأت بالكبير ثم الصغير ... هل تتوقع ان المعامل between ذكي ؟؟ ام لا ؟؟
ستكون النتيجة ..
no rows selected
... كما توقعت ... هذا المعامل غبي جدا .... يجب ان تبدأ من الصغير الى الكبير ..
لو وضعنا .... مابين 3000 .. و 3000 ؟؟؟
select ename , sal from emp
where sal between 3000 and 3000 ;
لقد جربت .. ونجح المعامل .... أي عرض لي من لهم رواتب 3000 دولار ,,
ENAME SAL
---------- ----------
SCOTT 3000
FORD 3000
جميل جدا ... معامل بسيط ... ولا داعي لشرحه اكثر من هذا ,,
2) المعامل IN
لماذا هذا المعامل ؟
لـ .... ممممم ... اعطيك مثال ,,
لو طلبت منك ان تعرض لي من رواتبهم 1100 ... و 1250 ... و 3000 ... فقط ..
مالذي تعمله ؟؟
هل تستطيع بالمعامل between ؟؟ لماذا ؟
طبعا لا .. لا تستطيع ..
لانه وبكل بساطة هنا اكثر من قيمتين .. هذا سبب ..
اسمع احدكم يقول لي ... طيب .... سوف اعرض من رواتبهم ما بين 1100 و 3000
واقول له ... برافو يا ذكي ...
غغغغغغغغغغلطططططططططططط !! ... مع مرتبة الشرف ,,,,
يوجد سبب.. ماهو ؟؟ فكر قليلا ...
...
..
.
فكرت ؟؟ لا اعتقد .... نكمل ,,,
انا اخبرك ... لو كتبنا هذه الجملة ..
select ename , sal from emp
where sal between 1100 and 3000 ;
انظر النتيجة ...
ENAME SAL
---------- ----------
ALLEN 1600
WARD 1250
JONES 2975
MARTIN 1250
BLAKE 2850
CLARK 2450
SCOTT 3000
TURNER 1500
ADAMS 1100
FORD 3000
MILLER 1300
لا تعليق !!!
لن اشرحها ...
اذن .... لاحظنا المشكلة السابقة ...
انا اريد فقط ثلاث قيم ... اريد من هم رواتبهم تساوي ... 1100 او 1250 او 3000 دولار ..
لا اريد غيرهم ... هل استطيع بالمعامل between ؟؟ لا طبعا ..
اليك الحل :
select ename , sal from emp
where sal in (1100,1250,3000) ;
وهذه النتيجة ..
ENAME SAL
---------- ----------
WARD 1250
MARTIN 1250
SCOTT 3000
ADAMS 1100
FORD 3000
هل لاحظت المعامل IN ؟؟؟
الان سوف اخبرك سرا .... اريدك ان تتذكره جيدا .. سوف اذكرك فيما بعد ...
هل قلت في السوال " اريد عرض الذين رواتبهم تساوي 1100 او 1250 او 3000 "
أو قلت "اريد عرض الذين رواتبهم تساوي 1100 و 1250 و 3000" ؟؟
ركز .. هناك فرق بين "و" ... وبين "أو"
ركز جيدا ... هل من المعقول ان نقول .. 1100 و 1250 و 3000 ؟؟
بالله عليك .. قلي أي موظف على مر العصور ... من عصر المكاتب والشركات الحجرية .. الى عصر المكاتب والشركات الحديثة ... هل يوجد موظف من الممكن ان يكون راتبه 1250 .. و 3000 .. و 1100 في نفس الوقت ؟؟؟
بالله كيف تجي ؟؟ لا عقل يقبل .. ولا منطق ,,
طيب ... الموظف احمد من الممكن ان يكون راتبه 1250 او 3000 او 1100 .... بالعقل تفهم ان الجملة صحيحة .... ممكن 1100 ... أو ......... 3000 ؟؟ أو 1250 ؟؟؟؟
يعني معقولة ومنطقية ,,,
طيب ..
- اريد ان اعرض رواتب وأسماء و أرقام كل من اسمه سميث أو كنق أو سكوت ...
ماهي الجملة ؟؟
بسيطة ... تستطيع ذلك ,,
....
...
..
.
هذه الجملة ..
select empno , ename , sal from emp
where ename in ('KING' , 'SMITH' , 'SCOTT' ) ;
انتهينا ..
لن اعرض النتائج ,,
ولكن ...
سوف نتطرق الى المعاملات االاخرى ...
توقع ان الدرس السابع .... من اصعب الدروس التي ستواجهك ...
وسوف اضع كل طاقاتي فيه .. لكي تفهمه ان شاء الله
وسوف تتعلم فيه كل شيء ... عن هذه اللغة ..
يوجد احتمال انني سوف اضع الدرس الثامن ايضا عن لغة الـSQL
ترقبو .. وحلو التحدي ,,,
الى اللقاء ,,,
The Coder
24-12-2005, 02:16 PM
بسم الله الرحمن الرحيم
الدرس السابع
اسم الدرس :جملة الاستعلام select ومعاملات الجملة الشرطية (الجزء الثاني)
نوع الدرس : تطبيقي
صعوبة الدرس : *** من *****
اهميــة الدرس : ****** من ***** (Over)
درجة احتراف لغة الـ SQL المتوقعة بعد هذا الدرس : * من ***** (مبتدئ)
الوقت المتوقع منك لفهم الدرس : 10 ساعة (ساعتين فهم و 8 ساعات تطبيق )
متطلبات تتوفر فيك : التطبيق
المتوقع منك في هذا الدرس :
- اتقان جزء من هذه اللغة 100 % .
- معرفة جميع معاملات الجملة الشرطية Where .
- تقوية منطقك .
هيا لنؤركل ^^
السلام عليكم ,,
اخذنا معاملات جملة الشرط where في الدرس السابق ,,
واريد ان اوضح مسألتين مهمتين جدا جدا جدا !! نسيت ذكرهما في الدرس السابق
الأولى :
لما قلنا جملة الاستعلام التالية :
select * from emp
where ename='KING' ;
سوف يعرض لي بيانات الموظف KING
لو هناك موظف اخر يدعى بـ King فهل ستعرض بياناته ؟؟ طبعا لا .... لان البيانات الموجودة في الجدول ثابتة الشكل كما عرفت من قبل ..
يعني بإلإمكان ان يكون هناك الموظفين التاليين :
KING , King,KiNg,KiNG,KinG , KINg,KInG,KIng
kING , king,kiNg,kiNG,kinG , kINg,kInG,kIng
هل شاهدت انه نفس الحروف ولكن تتغير حالة الاحرف من احرف كبيرة واحرف صغيرة ؟؟انت تعرف انه موظف واحد ويدعى بـ كنق ... لا يهم .. حروف كبيرة حروف صغيرة ..
ولكن الحاسب الذي يعتقد معظم البشر انه اذكى من البشر ... لن يكتشف هذا الشيء ..
ذلك الشيء الغبي (الحاسب) .. لا يعرف ان يفرق ... بينهم .. سوف يعتبرهم 16 موظف مختلف عن الاخر ..
لو اردت البحث عن KING وكتبت king فسوف تعرض بيانات king وليس KING الذي انت اردته !!
سوف نتطرق إن شاء الله لطرق كثيرة ومحددة لذاك الشيء الغبي ... كي يفهم ما نريده تماما ..
الثانية :
قلنا انه توجد معاملات المقارنة ... ومعاملات اخرى ,,
انا اخطأت في قولي اننا سوف ندرس معاملات جملة الشرط where
وقلت انها من جهتين فقط ... جهة عمليات او معاملات المقارنة ...
ومعاملات اخرى ..
والحقيقة انه يوجد عمليات ثالثة مهمة جدا ..وهي العمليات المنطقية !!
المعاملات الاخرى التي غطيناها هي ..
- المعامل Between
- المعامل IN
اخر امر وضعناه هو :
select empno , ename , sal from emp
where ename in ('KING' , 'SMITH' , 'SCOTT' ) ;
والناتج كان :
EMPNO ENAME SAL
------ ---------- ----------
7369 SMITH 800
7788 SCOTT 3000
7839 KING 5000
اعرف ان العرض سيء .. ولكن .. افهموها >< .....
The Coder
24-12-2005, 02:30 PM
الان اليك المعامل الثالث :
3) المعامل LIKE
وكالعادة ... الذي يجد صعوبة في لغة الانجليزي (مثلي طبعا ^^) فكلمة like تعني ... "تشبه" او تعني ..."مثل"
This Man is Like Me
ومعنى الجملة السابقة .. هذا الرجل يشبهني ... او هذا الرجل مثلي ,,
خلينا نتفلسف قليلا ...
طبعا الشبه ليس مثل نفس ... يعني هذا الرجل يشبهني .. وهو مثلي .. ولكنه ليس انا .. اذ انه يشبهني جزئيا وليس كليا ....
اعتقد انها وصلت ,,
المهم المهم
هذا المعامل خاص بالنصوص والتواريخ ... تواريخ ؟؟ لم نتطرق الى التواريخ ..
سوف اخصص درس كامل عن التواريخ ... لا تقلق ,,
اشير الى ان التواريخ تشبه النصوص ..... قليلا ^^
أي ان :
The dates is like the text
اوكيه .. ملينا من درس الانجليزي ...
نبدأ في الدرس الاساسي ^^
اريد منك حفظ هذان الرمزان ... ولا تسألني لماذا .. الان احفظهما عن ظهر قلب ,
العلامة %
من منا لا يعرف العلامة الخاصة بالنسبة المئوية ؟؟؟... ومعناها هنا صفر حرف او اكثر ... بمعنى اخر .. ممكن ان تكون ولا حرف .. وممكن ان تكون حرف .. حرفين .... مليون حرف ... يعني أي عدد من الاحرف.. حتى الصفر ,,
العلامة _
وهي العلامة الشرطة التحتية .. هل عرفتها ,,
معناه حرف واحد فقط .... ليس حرفين ولا ثلاثة .. بل حرف واحد فقط ...
بينما كنت تتمتع باحلام اليقظة في مكتبك ....
جاءك احدهم وقال لك .. اريد ان اعرف كم موظف لدينا اسمه يبدأ بحرف الS
مالعمل ؟؟؟
جاءك اخر .. وقال اريد كل الموظفين الذين أسمائهم مكونة من أربعة أحرف ...
مالحل ؟؟
جاءك ثالث .. وقال اريد ان اعرف الموظفين الذين يوجد حرفين t في اسمه
مالذي يجب فعله ؟؟
جاءك رابع ... وقال اريد ان اعرف اسماء الموظفين والتي حرفها الثاني M
ماذا تفعل ؟؟
جاءك الذي ارسل الاربعة السابقين (المدير)لتعجيزك .. واراد منك كل الموظفين الذين توظفوا في الشركة في اليوم الثالث من أي شهر ,,
مالذي سوف تستخدمه ؟؟
اليك بعض الحلول والامثلة للمعامل like ,,
- اريد اسماء الموظفين والتي تبدأ بحرف الـ S
select ename from emp
where ename like 'S%' ;
والناتج هو اسماء الموظفين والتي تبدأ بحرف الـ S
ENAME
------
SMITH
SCOTT
هل شاهدت المعامل like ؟؟
كأنه يساوي . ولكنه ليس كاليساوي ...
يقول اعرض اسماء الموظفين الذين اسمائهم كأنها على الشكل التالي :
اول حرف هو S ... وثاني الحروف (وهي العلامة %) هو ... أي حرف واي عدد من الاحرف ... حتى لو لم يكن هناك احرف
انتبه ... ركز ....
لو كان هناك موظف اسمه S ,,, وكتبنا الكود السابق ... هل يعرضه ؟؟ ام لا ؟؟
طبعا سوف يعرضه .. لانه اول حرف من اسمه هو الـS وبعدها صفر حرف .. هل فهمت ؟؟
طيب لو كان هناك موظف اسمه OSAMA هل تعتقد انه سوف يعرضه ؟؟
طبعا لا .. ليييييش ؟؟؟؟
لان حرف الـS ثاني حرف وليس اول حرف ...
طيب اليك هذا الامر ... واخبرني مالناتج ؟؟
select * from emp
where ename like 's%' ;
مالناتج ؟؟
ولماذا ؟؟
صح ,, الناتج هو نفس الناتج السابق ^^ .,,,
سوف يعرض هذه النتيجة .. ^^
ENAME
------
SMITH
SCOTT
بالله عليك .. هل s هي نفسها S ؟؟؟
قلنا اعرض اسماء الاشخاص التي تبدأ بحرف الـ s وليس الـ S !!
يعني اذا كان الامر السابق /
select * from emp
where ename like 's%' ;
فالنتيجة تقول ...
no rows selected
لانه لا يوجد احد يبدأ اسمه بحرف الـ s (small s not capital S!!)
يعني ان النتيجة :
ENAME
------
SMITH
SCOTT
خاطئة ...
يجب التنبه على حالة الاحرف !
يجب ان تتنبه جيدا لهذا الامر !!
الان نريد ان نعرف اسماء الموظفين والتي حرفها الثاني M
اليك الامر ...
select ename from emp
where ename like '_M%' ;
والناتج هو اسماء الموظفين التي ثاني حرف فيها هو الحرف M
ENAME
-------
SMITH
ظهرت لنا هذه العلامة _ (الناقص التحتية )
ومعناها أي حرف لكنه حرف واحد فقط ...
ما معنى الامر السابق ؟؟
معناه اعرض لي اسماء الموظفين من جدول الموطفين ...
والذين اسمائهم تشبه مايلي :
أي حرف .. ثم حرف الـ M .... ثم أي عدد من الحروف .. ايا كانت هذه الحروف ,,
الان نحل مسألة المدير ....
ولكن اولا .. هل تعرف تركيبة الشهر في هذا الجدول ؟؟
لو ادخلنا الامر التالي ...
select hiredate from emp ;
فسوف يكون الناتج .... مايلي :
HIREDATE
--------
17/12/80
20/02/81
22/02/81
02/04/81
28/09/81
01/05/81
09/06/81
19/04/87
17/11/81
08/09/81
23/05/87
03/12/81
03/12/81
23/01/82
هل شاهدت تركيب التاريخ في الجدول ... غريبة !!
خانتين يوم / خانتين شهر/خانتين سنة
مثلا
23/01/82
أي انه توظف في يوم 23 .. شهر واحد في السنة 1982
تم تجاهل الـ 19 .....
الان اراد منك المدير كل الموظفين الذين توظفوا في الشركة في اليوم الثالث من أي شهر ومن أي سنة .. لا يهم الشهر ولا السنة .. المهم هو اليوم ,,
اليوم الثالث ... يعني بهذا الشكل .. "03" وليس "3" فقط !!
انتبه جيدا لهذا الشكل ...
يعني
03/؟؟/؟؟
ممممم ... كيف نكتبها هذه ؟؟
نجرب ..
select ename , hiredate from emp
where hiredate like '03%' ;
و النتيجة هي كل الموظفين الذين توظفوا في اليوم الثالث .. من أي شهر .. ومن أي سنة :
ENAME HIREDATE
---------- --------
JAMES 03/12/81
FORD 03/12/81
اريد الان كل الموظفين الذين اسمائهم مكونة من اربعة احرف مالعمل ؟؟...
هذه العلامة _ .... للحرف الواحد .. ايا كان هذا الحرف ...
طيب .. هذه العلامتين __ ... معناه حرفين اثنين .. ايا كانا هذان الحرفان ,,
اليك الامر يا فتى ...
select ename from emp
where ename like '____' ;
مع مراعاة انها اربع علامات خطوط تحتية هكذا ____
والنتيجة هي اسماء كل الموظفين التي تحتوي على اربع احرف ..
ENAME
-----
WARD
KING
FORD
الآن أريد عرض كل أسماء الموظفين التي تحتوي على حرف الـ T مرتين .. يعني لو أن احدهم يدعى بـ SCOTT فسوف يعرض ... فهو اسم يحتوي على الحرف T مرتين ..
ولو ان احدهم يدعى TRRRRRRRRT فسوف يعرض أيضا لأنه يحتوي على الحرف T مرتين وهكذا ,,,,,,
ممممم ... انا اعتمدت طريقة الاحتمالات في تدريسك الدورة ....
يعني باختصار أنت لا تفكر ... سوف أجعلك تواجه هذه المشكلة .. أتحداك ان تحلها ... وهذا هو التحدي الاول ,,
...
ذاهب وراجع ^^
The Coder
24-12-2005, 02:37 PM
4) المعامل الاخير في المعاملات الاخرى ..الخاصة بجملة الشرط .. وهو المعامل IS NULL
هل تذكر الحقل comm. ؟؟
وهو الخاص بالرواتب الإضافية ...اعرف إني أقلقتك بهالحقل .... بس التذكير جميل ^^
بعض الموظفين ليس لديهم رواتب اضافية .. لذا وضعنا القيمة NULL صح ؟
طيب ... اريد ان اعرض اسماء كل الموظفين الذين لا يملكون رواتب اضافية ... كيف ؟
بهذا الامر ..
select ename from emp
where comm =NULL ;
صح ؟
صح ^^ ... اذن النتيجة هي ...
no rows selected
اوبس ...
لا احد ؟؟
يعني كلهم يأخذون رواتب اضافية ؟ مستحيل ...
اكيد الامر السابق خطأ ...
مالعمل ؟مالحل؟؟؟
انه المعامل IS NULL
يقول لك خطأ ياسيدي ان تقول comm=null
عملية المساواة مع الـقيمة الخالية مستحيلة ..
وشيء اكيد عمليات "اكبر من" و "اصغر من" و "اكبر من او تساوي "... و "اصغر من او تساوي "... "ولا تساوي "
هي ايضا لا تعمل مع القيمة الخالية null
هل ما زلت تريد عرض جميع من ليس لديهم رواتب اضافية .؟؟ طيـــــــــــــــب ... الحل هو :
select ename from emp
where comm is null ;
والنتيجة
ENAME
-------
SMITH
JONES
BLAKE
CLARK
SCOTT
KING
ADAMS
JAMES
FORD
MILLER
هؤلاء هم الذين لا يملكون رواتب اضافية ,,
اذا لم تصدق ,, تأكد بنفسك وسوف تجدهم هم ^^
بسيط صح ^^ ؟؟
سوف اصعب عليك واعقد الموضوع اكثر .... لاني بكل بساطة ^^ ..... سادي في هذه الامور ,,
ثالثا : المعاملات المنطقية ...
- المنطق :
مالمنطق ؟؟
اهم موضوع في البرمجة اعتبره المنطق ... اليك درس قواعد ^^
احب ان احذرك ... ان السطور القادمة مملة مملة مملة لدرجة الموت ... لذا ...
اذا قرأتها فسوف تحسن كثيـــــــــــــرا من قوة عقليتك البرمجية .. والتي سوف تنفعك فيما بعد .. في البرمجة خصوصا ...
واذا لم تقرأها ... فأنت حر .. وحتفوت عليك فرصة ^^
المشكلة انك اذا قرأتها لا تعرف هل تحسنت ام لا ...
فلا تستغرب اذا انتهيت منها .. انك تقول في نفسك ... "لقد كذب علي حمزة وقال انني سوف اتحسن .. لم اتحسن"
انا اقول لك وبكل ثقة .. سوف تتحسن كثيــــــــــــــرا (لاحظ كثيرا )
اليك الدرس :
ذهب احمد و محمد الى السوق ...
لن اعرب الجملة السابقة ولكن .. اريد تحليلها منطقيا ...
اولا .... مين ذهب ؟؟ احمد + محمد صح ؟؟ يعني احمد و محمد ذهبا ,,
هل ذهب احمد ولم يذهب محمد ؟؟ لا
هل لم يذهب احمد وذهب محمد ؟؟ لا
هل لم يذهب محمد ولم يذهب احمد ؟؟ لا
هل ذهب احمد وذهب محمد ؟؟ نعــــــــم
طيب ما رأيك في الجملة التالية ؟؟
ذهب احمد او محمد الى السوق ....
ممم
من الذي ذهب ؟؟ يا احمد ؟؟ او محمد ؟؟ لا احد يعرف ...
كل ما نعرفه ان حمزة قال لنا "احمد او محمد ... ذهب احدهما او كلاهما السوق ..."
كأن حمزة هذا .. لايعرف أي منهما ذهب .. ولكن هو متأكد انه ذهب احدهما او كلاهما !
هل ذهب احمد وذهب محمد الى السوق ؟؟ نعم
هل ذهب احمد ولم يذهب محمد الى السوق ؟؟ نعم
هل لم يذهب احمد وذهب محمد الى السوق ؟؟ نعم
هل لم يذهب احمد ولم يذهب محمد الى السوق ؟؟ لا .... مستحيل .. يعني مين راح ؟؟ الجني الأزرق ؟؟؟
لاحظنا في الجملتين الاثنتين .. اختلاف بسيط وهو .. "و" ... "او"
اذا لم تفهم المغزى ... فتابع .,,
اولا ... ( و ):
تخيل لو فيه اختبار من سؤالين ... وضعهما لك رجل معقد يدعى حمزة ... لن ينجحك الا اذا حللت السؤالين الاثنين بشكل صحيح ... يعني كأن حمزة هذا يقول ...
اذا حللت السؤال الأول صح .. و (لاحظ الحرف و).... حللت السؤال الثاني صح ... فسوف تنجح ... وتكون إنسان صحيح
طيب نأتي للاحتمالات التي من الممكن ان تقع انت فيها
السؤال الاول صحيح و السؤال الثاني صحيح ... أنت صحيح
السؤال الاول صحيح و السؤال الثاني خاطئ .. أنت خاطئ
السؤال الاول خاطئ و السؤال الثاني صحيح .. أنت خاطئ
السؤال الاول خاطئ و السؤال الثاني خاطئ .. أنت خاطئ
الملخص هو ...
صح و صح .. صح
صح و خطأ .. خطأ
خطأ وصح .. خطأ
خطأ وخطأ .. خطأ
يا سلام ... على المنطق الرائع .. هل تصدق ان منطقك الان قوي جدا وسليم ؟؟ اعرف ان هذه الحقائق موجودة في رأسك .. لكن بعضكم لم يعلم عن وجودها .. وأولكم محدثكم (انا ^^" )
ثانيا ( أو ) :
تخيل لو فيه اختبار من سؤالين ... وضعهما لك رجل لين ... طيب .. حنون ... يقبل بأي اجابة صحيحة ... لكنه لا يدعى حمزة ... ينجحك اذا حللت احد السؤالين الاثنين بشكل صحيح (السوال الاول او السوال الثاني ... احد السوالين )... يعني كأن الذي ليس اسمه حمزة يقول ...
اذا حللت السؤال الأول صح .. أو (لاحظ الحرف و).... حللت السؤال الثاني صح ... فسوف تنجح ... وتكون إنسان صحيح
طيب نأتي للاحتمالات التي من الممكن ان تقع أنت فيها في هذا الاختبار
السؤال الاول صحيح أو السؤال الثاني صحيح ... أنت صحيح (لاحظ انها أو وليست و)
السؤال الاول صحيح أو السؤال الثاني خاطئ .. أنت صحيح
السؤال الاول خاطئ أو السؤال الثاني صحيح .. أنت صحيح
السؤال الاول خاطئ أو السؤال الثاني خاطئ .. أنت خاطئ .. وللأسف (لاحظ وللأسف ..شفت كيف الليونة ؟)
الملخص هو ...
صح أو صح .. صح (لاحظ انها أو وليست و)
صح أو خطأ .. صح
خطأ أو صح .. صح
خطأ أو خطأ .. خطأ
يا سلام ... على المنطق الرائع الان منطقك 90% سليم ...
لا تسألني اين الـ 10% المتبقية ...
لانها من الصعب جدا الحصول عليها ...
اذا اردت الحصول عليها فركز جيــــــــــــدا ..
هناك شيء يدعى النفي .. يعني عكس الشيء ..
يلعب .. نفيها لا يلعب
جوع .. نفيها لا جوع ...
جوع ... نفيها ايضا الشبع ...
الآن تخيل اختبار غريب جدا ...
من مختبر ومعلم غريب جدا ..
يدعى بحمزة ..
يقول لك هذا الغريب ..
اذا حللت السؤال الاول ولم تحل السؤال الثاني ... فانت ناجح .. يعني انت صحيح !!!
غريب ؟؟ هل لاحظت "لم" ؟؟؟ هل لاحظت حرف الواو ... في "و لم تحل السؤال الثاني" ؟؟؟
ركز!! .... هنا يوجد نفي ... يعني لا تحل السؤال الثاني ...
انت سوف تقع في هذه الاحتمالات ...
السؤال الاول صحيح و السؤال الثاني صحيح ... أنت خاطئ !!!
السؤال الاول صحيح و السؤال الثاني خاطئ .. أنت صحيح !!!
السؤال الاول خاطئ و السؤال الثاني صحيح .. أنت خاطئ
السؤال الاول خاطئ و السؤال الثاني خاطئ .. أنت خاطئ
واو ... معقد بعض الشيء هاه ؟؟
اليك الاحتمالات بشكلها المحسن ..
اذا السؤال الاول الذي يجيب ان يكون صحيح حليته صح و السؤال الثاني الذي يجيب ان يكون خاطيء حليته صح ... أنت خاطئ !!!
اذا السؤال الاول الذي يجيب ان يكون صحيح حليته صح و السؤال الثاني الذي يجيب ان يكون خاطيء حليته خطأ ... أنت صحيح !!!
اذا السؤال الاول الذي يجيب ان يكون صحيح حليته خطأ و السؤال الثاني الذي يجيب ان يكون خاطيء حليته صح ... أنت خاطئ !!!
اذا السؤال الاول الذي يجيب ان يكون صحيح حليته خطأ و السؤال الثاني الذي يجيب ان يكون خاطيء حليته صح ... أنت خاطئ !!!
اليك الاحتمالات بشكل ملخص .. لكي تتفهم الوضع سريعا
صح و صح الخطأ .. خطأ
صح و خطأ الخطأ .. صح
خطأ و صح الخطأ .. خطأ
خطأ و خطأ الخطأ .. خطأ
واو .. المسئلة تعقدت اكثر واكثر للبعض .. وصارت بسيطة للبعض الاخر
نفس المنوال مع أو .. ولكن بهذه النتائج :
صح أو صح الخطأ .. صح
صح أو خطأ الخطأ .. صح
خطأ أو صح الخطأ .. خطأ
خطأ أو خطأ الخطأ .. صح
... لا تنتف شعرك يا هذا .. ولا تتعقد ... قلت لك انها صعبة .. قليلا .. وممكن ان تكون كثيرا ...
ركز واقرأ ثانية ..,,,
اذا لم تعرف بالمرة.. او انك طفشت ولا تريد ان تفهم ..
سوف تفهمها فيما بعد ... لا تخف .. سوف اجد الطريقة التي تناسبك ان شاء الله ,,
الان ..
عرفنا "و" ..."أو" ... واخيرا النفي .. اذا لم تفهمها احفظها الان .... اليك تلخصيها ...
الـ "و"
صح و صح = صح
صح و خطأ = خطأ
خطأ وصح = خطأ
خطأ وخطأ = خطأ
الـ"أو"
صح أو صح = صح
صح أو خطأ = صح
خطأ أو صح = صح
خطأ أو خطأ = خطأ
الـنفي
نفي الصح = خطأ
نفي الخطأ = صح
اشير الى نقطة مهمة جدا جدا جدا ... من الممكن ان تكون اكثر من قيمتين فمثلا ...
صح أو صح = صح
طيب ..
صح أو صح أو صح = صح ....
صح أو خطأ أو خطأ = صح ...
يعني في النهاية نستنتج ان الـ "أو" ... يجب ان يكون فيها على الاقل .. قيمة واحدة صحيحة لكي تكون صحيحة.
طيب ...
صح و صح و صح = صح ...
صح و صح و خطأ = خطأ ...
يعني في النهاية نستنتج ان الـ "و" ... يجب ان يكون فيها على الاقل .. قيمة واحدة خاطئة لكي تكون خاطئة .
طيب ...
نفي نفي الصح = صح
نفي نفي الخطأ = خطأ
نفي نفي نفي الصح = خطأ
اعرف الآن انك تقول دعك من الفلسفة الزائدة .. ولكن ,,, اليك تحدي ...
صح و صح و صح و صح و خطأ = ؟؟؟
خطأ أو صح أو خطأ أو صح = ؟؟؟
نفي نفي نفي نفي نفي الخطأ = ؟؟؟
وهو التحدي الثاني ,,,
لنكمل المعاملات ,,
The Coder
24-12-2005, 02:42 PM
1) المعامل المنطقي AND
للمتعسر في فهم الانجليزي .. مثلي ...
And معناها "و"
نريد عرض اسماء ورواتب الموظفين الذين راتبهم فوق الـ 1000 دولار .. و لا يملكون راتب اضافي ..
لاحظ "و"
اليك الحل ...
select ename,sal from emp
where sal>1000 and comm is null ;
ياسلام .. هل شاهدت كيف تعمل and ؟؟
اليك النتيجة .. وهي اسماء ورواتب الذين يأخذون راتب اكثر من 1000 دولار .. و لا يملكون راتب اضافي :
ENAME SAL
---------- ----------
JONES 2975
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
ADAMS 1100
FORD 3000
MILLER 1300
لماذا النتيجة هذه ؟؟
لا اريد ان أخبرك الآن ... اريدك ان تقول لنفسك لماذا ؟؟WHY ؟؟ ليش ؟؟
اريد ان اعقد الامور اكثر ... وأقول ..
اريد ان اعرض اسماء ورواتب الموظفين الذين راتبهم فوق الـ1000 دولار .. و لا يملكون راتب اضافي .. والذين أسمائهم أربع حروف فقط ...
select ename,sal from emp
where sal>1000
and comm is null
and ename like'____' ;
واو ... لاحظ كم and أضفناها ... وكأننا نقول
اعرض الحقول اسماء ورواتب من جدول الموظفين
اذا كان الراتب اكبر من 1000
و الراتب الإضافي قيمة خالية
والاسم مكون من اربع احرف
استخدمنا بعض المعاملات الاخرى في هذا الامر ... رائع ..
سوف يعرض لي اسماء ورواتب كل من اسمه مكون من اربع احرف ويأخذ فوق 1000 دولار ولا يملك راتب اضافي :
ENAME SAL
---------- ----------
KING 5000
FORD 3000
لماذا هذه النتيجة ؟؟
KING رجل عملي .. ويحب الحياة ... ولكنه يكره التخاذل في العمل ,,
لاحظ ان اسمه مكون من 4 احرف .. في نفس الوقت .. راتبه اكثر من 1000 ... في نفس الوقت راتبه الإضافي فارغ أي لا يملك راتب اضافي ,,
يا سلام ...
نفس الشيء مع فورد FORD
هنالك موظف مسكين .. يدعى SCOTT يتقاضى راتب 3000 دولار و لا يملك راتب إضافي , رجال طيب وفيه خير ..
لم يعرض اسمه هنا لماذا ؟
لأننا قلنا راتب فوق 1000 و (لاحظ الـ "و") راتبه الإضافي قيمة خالية و اسمه مكون من أربع أحرف
سكوت راتبه فوق 1000 (صحيح) و راتبه الإضافي خالي (صحيح) و لكن اسمه ليس من اربع احرف (خاطئ)
اذن ...
صحيح و صحيح و خاطئ = خاطئ ,,
إذن من الخطأ عرضه ...
اذا لم تفهم .. اليك مثال اخر ...
اذا كتبنا الامر التالي وهو عرض اسماء الموظفين الذين رواتبهم اقل من 1600 :
select ename from emp
where sal < 1600 ;
فسيكون الناتج
ENAME
-------
SMITH
WARD
MARTIN
TURNER
ADAMS
JAMES
MILLER
امر الخاص بعرض اسماء الموظفين الذين يملكون راتب اضافي ....
select ename from emp
where comm is not null ;
وهم ...
ENAME
-------
ALLEN
WARD
MARTIN
TURNER
انظر الصورة 17
http://img6.picsplace.to/img6/10/17.jpg
في الصورة ...
تخيل أن المربع الأيمن هو الشرط الخاص بمن هم رواتبهم اقل من 1600
والمربع الأيسر هو شرط من يملكون رواتب إضافية ,,
لو قلنا إننا نريد عرض أسماء الذين رواتبهم اقل من 1600 ويملكون رواتب إضافية ..
بالله عليك ... ركز في الصورة السابقة ... من في الموظفين الذي راتبه اقل من 1600 وفي نفس الوقت لديه راتب إضافي ؟؟
من من الموظفين تتوفر فيه الشرطين الاثنين في نفس الوقت ؟؟
هل تريد الحل ؟؟
اليك الامر .. التالي والذي يقول .. اعرض الموظفين الذين رواتبهم اقل من 1600 و لديهم راتب اضافي :
select ename from emp
where comm is not null
and sal <1600 ;
هذا هو الناتج ...
ENAME
-------
WARD
MARTIN
TURNER
اذا لم تفهم لماذا الناتج هذا ,, انظر الصورة 27
http://img6.picsplace.to/img6/10/27.jpg
هل تشاهد اين تقاطع الشرطين ؟؟ انا اقصد بالتقاطع يعني .. التشابه ... الشرطين متشابهين في ثلاث موظفين ..
هل عرفت الان فكرة and ؟؟
وهي ناتج تقاطع الشروط ... يعني هنا شرطين ... تقاطعهما يعني بينهما and
2) المعامل المنطقي OR
اذا كنت متعقد من الانجليزية .. مثلي فإن OR تعني "أو"
الان اريد عرض اسماء كل الذين راتبهم اصغر من 1600 ... أو عرض من لديهم راتب اضافي ...
من الصورة السابقة 17 .... ستشاهد الشرط الاول من هم .. والشرط الثاني من هم ...
اليك الامر الذي يبين كل اسماء من هم اصغر من 1600 أو من لديهم رواتب اضافية :
select ename from emp
where comm is not null
or sal <1600 ;
النتيجة هم ....
ENAME
-------
SMITH
ALLEN
WARD
MARTIN
TURNER
ADAMS
JAMES
MILLER
اذا قلنا ان الـ and هي ناتج تقاطع الشروط ... فما رأيك في الـ or ؟؟
هو جمع النواتج جميعها بدون تكرار ... هل فهمت ؟ لم تفهم ؟؟ اذن انظر الصورة 37
http://img6.picsplace.to/img6/10/37_000.jpg
هل تشاهد جميع الاسماء ؟؟
اجمعهم جميعا ... والغي أي تكرار .. فسوف تحصل على ناتج الشرط ,, وهذا معنى OR الحقيقي ,,, كأنه الجمع ...
نعقد المسئلة .. قليلا ..
اريد عرض اسماء ورواتب كل من رواتبهم فوق الـ 3000 دولار .. أو .. عرض اسماء ورواتب كل من لا يملكون راتب اضافي أو أسمائهم مكونة من اربع احرف ..
اليك جملة الاستعلام التالية :
select ename,sal from emp
where sal>3000
or comm is null
or ename like '____' ;
وهذه هي النتيجة :
ENAME SAL
---------- ----------
SMITH 800
WARD 1250
JONES 2975
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
ADAMS 1100
JAMES 950
FORD 3000
MILLER 1300
لا تحتاج لعقل مدمر حتى تفهم مالذي حدث .. صح ؟
اذا لم تفهم لماذا عرضت هذه النتيجة .. افهم الآن جيــــدا ...
أولا ... اسأل نفسك ما معنى أن نعرض من هم ذو راتب اكثر من 3000 أو لا يملكون اضافي أو حروف اسمائهم 4 حروف ؟
طبعا الجواب هو عرض أي شخص فيه الخصائص الثلاث جميعها .. او خاصيتين منها .. او خاصية واحدة منها
الموظف الطيب سكوت الذي يتقاضى راتب 3000 دولار ولا يملك راتب اضافي... عرضناه هنا في النتيجة السابقة لماذا ؟
اختل الشرط الاول..... لان راتبه 3000 ... وليس اكثر من 3000
لم يختل الشرط الثاني .. لانه لا يملك راتب اضافي
اختل الشرط الثالث .. لان اسمه من خمس احرف وليس اربع احرف !!
الشرط الاول خاطئ ... الشرط الثاني صحيح .... الشرط الثالث خاطئ
خاطئ أو صحيح أو خاطئ = صحيح ... ممممم الجواب صحيح ؟؟ إذن اعرضه
هناك موظف يدعى TURNER
ويتقاضى راتب 1500 ... ولديه راتب اضافي ..
بالله عليك هل نعرض هذا ؟؟
اختل الشرط الاول فيه ... أي ان راتبه اقل من 3000
اختل الشرط الثاني فيه ... أي انه يملك راتب اضافي ....
اختل الشرط الثالث فيه ... أي ان اسمه ليست اربع احرف .. بل ست احرف ,,,
الشرط الاول خاطئ .. الشرط الثاني خاطئ ... الشرط الثالث خاطئ ..
خاطئ أو خاطئ أو خاطئ = خاطئ ... ممممم الجواب خاطئ ؟؟ اذن لا تعرضه
هل فهمت ؟؟
لا تخجل .. المسألة تلخبط في البداية ... اذا لم تفهم .. راسلني واعرض لي مالذي فهمته و مالذي لم تفهمه ,,
وأنا بكل رحابة صدر .. سوف اشرح لك مرة ومرتين وثلاث .... وألف ,,, لا تخف لن أأكلك ^^
سنعود بعد قليل ,,,
The Coder
24-12-2005, 02:47 PM
الان في رأسي بعض التحديات :
اليك التحدي الثالث :
اريد عرض اسماء ورواتب الموظفين الذين راتبهم اكبر من 1000 واقل من 5000 بدون استخدام Between
التحدي الرابع :
اريد عرض اسماء ورواتب الموظفين الذين اسمائهم KING أو SCOTT أو TIGER بدون استخدام IN
التحدي الخامس :
هل تشاهد الصورة 47 ؟؟ وهي ثلاث شروط ... برأيك مالناتج اذا كان بينهم OR ؟؟ وما الناتج اذا كان بينهم AND
(الصورة 47)
http://img6.picsplace.to/img6/10/47.jpg
قبل ان ابدأ في المعامل الاخير ... للمنطق اريد تذكيرك ببعض الامور .
صح أو خطأ = صح
بالانجليزي تكتب هكذا :
True OR False = True
اوكيه .. اتفقنا !!
3) المعامل المنطقي الاخير NOT :
ضعيف بالانجليزي ؟؟؟ يعني مثلي ...
طيب NOT تعني "لا" وتعني نفي الشيء .. وفي درسنا هذا تعني عكس الشيء .. هل فهمت ؟
هذا المعامل ... غريب بعض الشيء ...
لا يستخدم مباشرة ..بل يجب ان يعمل مع معاملات اخرى وهي اربع معاملات :
المعامل Between
المعامل IN
المعامل IS NULL
المعامل LIKE
نأخذها وحدة وحدة ..
- استخدام not مع المعامل Between
مثال عليها ... نريد عرض رواتب واسماء الموظفين الذين راتبهم ليس (لاحظ ليس) بين الـ 1000 و 3000
اليك الجملة :
select ename,sal from emp
where sal not between 1000 and 3000 ;
والناتج هو كل الموظفين الذين راتبهم فوق الـ3000 وتحت الـ 1000
ENAME SAL
---------- ----------
SMITH 800
KING 5000
JAMES 950
فهمت ؟
- استخدام not مع المعامل IN
اعرض اسماء من هم ليسو(لاحظ كلمة ليسو) في هذه القائمة :
(KING , SCOTT , CLARK , ADAMS)
اليك الأمر (دائما اقصد بالأمر هو جملة الاستعلام ) :
select ename from emp
where ename not in ('KING' , 'SCOTT' , 'ADAMS' , 'CLARK');
واليك النتيجة
ENAME
---------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
TURNER
JAMES
FORD
MILLER
- استخدام not مع المعامل IS NULL
ابسط مثال هو الحقل comm هل تذكره ؟؟ وهو الخاص بالرواتب الاضافية (احب ان اذكر كثيرا ^^.. اعذرني)
اريد عرض اسماء و الرواتب الاضافية الخاصة بكل من هم ليسو من الذين لا يملكون راتب اضافي ...
يعني اريد عرض كل من هم ليس راتبهم الإضافي يساوي null
هل فهمت ؟؟
اليك الامر :
select ename,comm from emp
where comm is not null ;
لاحظ ان عكس is null هي is not null
والنتيجة هي كل من لهم راتب اضافي ,,
ENAME COMM
---------- ----------
ALLEN 300
WARD 500
MARTIN 1400
TURNER 0
- استخدام not مع المعامل LIKE
اعرض لي اسماء الموظفين التي لا تبدأ بحرف الـ S
جملة الاستعلام :
select ename from emp
where ename not like 'S%';
النتيجـــــــــــة :
ENAME
-------
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
KING
TURNER
ADAMS
JAMES
FORD
MILLER
انتهينا من المعاملات جميعها ,,
بقي ان أغوص بك في وحل المنطق مرة ثانية .. لأني أريدك أن تكون محترفا , ولأني أريدك ان تكون مبرمجا , ولأني أريدك ان تدعي لي (وليس علي ) اذا واجهت مصائبها فيما بعد ..
الآن ركز جيــــــــدا في المطلوب !! التركيز التركيز ,, ولا شيء غير التركيز ,
اريد عرض اسماء و رواتب أساسية وإضافية للموظفين الذين اسمائهم مكونة من أربع احرف و لديهم رواتب اضافية أو رواتبهم اكبر من 2000 دولار ...
انا في رأيي الشخصي البحت .. والذي اعتقد انه 1000000% صحيح ..... ان السؤال السابق.. غامض .. ولا اعلم مالذي يقصده بالضبط اليك صيغتين :
الصيغة الاولى :
هل يريد الذين اسمائهم مكونة من اربع احرف ولديهم راتب اضافي ؟؟.....
او
الذين راتبهم اكبر من 2000 دولار ؟؟؟
الصيغة الثانية :
هل يريد الذين اسمائهم مكونة من اربع احرف ؟؟
و
لديهم رواتب اضافية او راتبهم اكبر من 2000 دولار ؟؟؟
هل لاحظت لماذا وضعت انا هذه الصيغتين ؟ اذا لم تلاحظ بعد ... فجرب ان تفهم مايلي :
الصيغة الاولى : (اسمائهم أربع حروف) و (لديهم راتب اضافي أو راتبهم اكبر من 2000 دولار )
الصيغة الثانية : (اسمائهم اربع حروف و لديهم راتب اضافي ) أو ( راتبهم اكبر من 2000 دولار )
يعني الصيغة الاولى .. ان تتم عملية الـOR اولا ثم AND
وفي الصيغة الثانية .... ان تتم عملية الـ AND اولا ثم OR
من البلاهة المغولية ان تقول ... "كلاهما نفس المعنى "... اذا كان تفكيرك بهذه الصيغة ... وبدون تفكير عميق ..
أنصحك بالانسحاب من القراءة .. واذهب لاحتراف كرة القدم أفضل لك وتدر عليك أموال أكثر ,,,
اذا لم تفهم بعد مالذي يحدث هنا ... فجرب ان تفهم الان :
هل تذكر الاولويات الحسابية ؟ والتي قلنا انها على هذا الترتيب :
الأقواس
الأسس
الضرب او القسمة
الجمع او الطرح
هل تذكرها ؟؟
هنا توجد اولويات ايضا !! اقصد بالأولويات يعني شيء قبل شيء .....
يعني اولويات حسابية .. وأولويات منطقية !!
الاولويات الحسابية ذكرناها ...
اما الاولويات المنطقية فسوف نكتشفها الان ..
هل AND اولا ثم OR ؟؟
او OR اولا ثم AND ؟؟؟
ام الذي نواجهه اولا .. هو الذي يكون اولا ؟؟ مثل ما شاهدنا في الضرب والقسمة ..
الضرب او القسمة لهما نفس الاولوية .. صح ؟ أي منهما اولا اذا جاءا سوية ؟؟ هل تذكر ؟؟
طبعا الذي يوجهنا اولا ... يكون هو الاول ...
من الممكن ان تكون AND و OR لهما نفس الاولوية , لا نعرف .....
ممممم نجرب ... (لا تلومني .. انا لا اريد أعطيك معلومات جاهزة ... لان المعلومات الساخنة والطازجة تلتهم وتختفي بسرعة... ولأني بنفسي لا اعرف الحل ... وبالتالي دعنا نعيش المشكلة سوية ونوجهها سوية .. )
الان .. انا شخصيا اريد الصيغة الاولى ...
يعني
اريد عرض اسماء الموظفين الذين اسمائهم أربع حروف
و
الذين لديهم راتب اضافي أو راتبهم اكبر من 2000 دولار
بمعنى اخر اريد
اسم مكون من أربع احرف ... و ... احد الأمرين او كلاهما.. 1- يا راتب فوق 2000 او 2- لديه راتب اضافي
لاحظ انني استخدمت الصيغة الاولى .. أي انني اريد ان تتم عملية الـ OR اولا ....
اذن ... نجرب هذا الأمر ...
select ename ,sal,comm from emp
where ename like '____'
and comm is not null or sal >2000 ;
انظر الناتج :
ENAME SAL COMM
---------- ---------- ----------
WARD 1250 500
JONES 2975
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
FORD 3000
لو دققت ...
و تمحصت ..
وركزت ...
وتتبعت ...
و انا اعرف انك لم تعمل أي منها ...
ولكن الذي حدث هو ان and بدأت اولا ....
هل لأنها أتت اولا ؟؟
يمكن !!
نجرب لو وضعنا الـ OR اولا .. مالذي سيحدث ... اليك جملة الاستعلام التالية
select ename ,sal,comm from emp
where sal >2000 or comm is not null
and ename like '____';
سوف تكون نفس النتيجة .. هل تصدق !
لاحظ كيف قلبت الترتيب .. لكي اضمن نفس المفهوم ...
يعني
اريد عرض اسماء الموظفين الذين اسمائهم أربع حروف
و
الذين لديهم راتب اضافي أو راتبهم اكبر من 2000 دولار
هي نفسها
اريد عرض اسماء الموظفين راتبهم اكبر من 2000 دولار أو الذين لديهم راتب اضافي
و
الذين اسمائهم أربع حروف
اذا لم تصدق ... ركز فيها .. واذا لم تفهم بالمرة مالذي حدث ... تجاهل الموضوع ...
قلنا انها نفس النتيجة .. يعني بدأ بالـAND !!
اذن الـAND هي اولا ... ثم الـ OR
طيب فكر لو ... انه يوجد And مرتين .. ايهما اولا .. ؟؟؟
هذا هو التحدي السادس .... التحدي هو ان تشرح لي بمثال .. من عندك .. لو هناك AND و OR و AND ... مالذي سوف يحدث اولا ؟؟ ولماذا ؟؟
قلنا قبل قليل انه الـ AND اولا ثم الـ OR ....
لكن انا اريد الـ OR اولا .. مالعمل ؟؟
يا سيدي ... الاقواس هي الحل ,,
من الان وصاعدا .. تعود ان تضع الاقواس ... بسبب او بدون ’,’,’,’,
اليك الحل .... جملة الاستعلام هي :
select ename ,sal,comm from emp
where (ename like '____' )
and (comm is not null or sal > 2000 ) ;
هل شاهدت الاقواس ؟؟
هل شاهدت اقواس زائدة والتي تضم الجملة (ename like '____' ) ؟؟
بإمكاننا ان ننزعها ... لكن تعود وتمرس الان ان تضعها ... لماذا ؟ لكي تسهل عليك القراءة .. ولكي تفهم المطلوب من الكود .. ولكي تكون مرتاح البال .... ولأني أأمرك بذلك ,,,
والنتيجة هي :
ENAME SAL COMM
---------- ---------- ----------
WARD 1250 500
KING 5000
FORD 3000
هذا ما أردته بالضبط ... يا سلام ,, اسم مكون من أربع احرف ... و ... (احد الأمرين او كلاهما..راتب فوق 2000 او لديه راتب إضافي )
اذا لم تفهم مالذي يدور هنا ... لا تخف .. اقرأ مرة ومرتين .. وثلاث ..
( اذا مازلت تعاني ... فأنت من النوع الذي لا يحب القراءة .. او انك تحب أمثلة كثيرة .. او انك لا تريد ان تفهم او ان شرحي لا يناسب عقليتك وخبرتك وطريقة تفكيرك ,, )
سوف أجرب طريقة أخرى ,,
انظر السؤالين التاليين
السؤال الأول :
اريد عرض اسماء و رواتب أساسية وإضافية للموظفين الذين اسمائهم مكونة من أربع احرف و لديهم رواتب اضافية
أو ان يتم عرض اسماء ورواتب اساسية وإضافية للموظفين الذين رواتبهم اكبر من 3000 دولار ... وليس لديهم رواتب اضافية
هل شاهدت السؤال الأول وركزت في طريقة عرضه ... أنا لم اقل سؤال غامض كهذا :
السؤال الثاني
اريد عرض اسماء و رواتب أساسية وإضافية للموظفين الذين اسمائهم مكونة من أربع احرف و لديهم رواتب اضافية
أو الذين رواتبهم اكبر من 3000 دولار ... وليس لديهم رواتب اضافية
لو شاهدت مثل السؤال الثاني ... فأعرف انه من الخطأ عرضه كهذا !!
من السؤال الأول نستنتج شكل السؤال كما يلي
(اسماء مكونة من اربع احرف و لديهم رواتب اضافية ) أو (رواتبهم اكبر من 3000 و ليس لديهم رواتب اضافية)
يا سلام على المنطق ,’,’
اليك جملة الاستعلام يا فتى ,,
select ename , sal , comm from emp
where
(ename like '____' and comm is not null ) or ( sal>3000 and comm is null ) ;
والنتيجة هي :
ENAME SAL COMM
---------- ---------- ----------
WARD 1250 500
KING 5000
التحدي السابع ....
لماذا ظهرت النتيجة السابقة ؟؟ لماذا KING و WARD هما اللذان عرضا فقط ؟؟
اتحداك ان تقنعني لماذا .. أقنعني بطريقتك .. وسوف أحاول فهمك !!
ممممم .. نفسي في كوباتشينو ^^ .... عن اذنك
The Coder
24-12-2005, 02:53 PM
قبل ان ينتهي هذا الدرس ..
اريد ان تشاهد الصورة التالية ... وهي تلخيص للمعاملات بشكل سلس وبشكل مفهوم لك لكي لا تنساها .. احتفظ بها .. فهي مفيدة كثيرا !! صدقني (الصورة 57)
http://img4.picsplace.to/img4/16/57.jpg
انتهى الدرس السابع ...
اليك المهام :
- جهز برنامج الاوراكل .. سوف اشرح جزء من تنزيله .... وسأفكر في شرحه كله ... اذا استطعت
- اقرأ الموضوع هذا اكثر من مرة .. واذا كنت تملك برنامج الاوراكل .. طبق ... ولا شيء غير التطبيق ...
اليك التحديات :
ستجد التحديات التالية بين السطور ... وهي :
التحدي الأول :
أريد عرض كل أسماء الموظفين التي تحتوي على حرف الـ T مرتين .. يعني لو أن احدهم يدعى بـ SCOTT فسوف يعرض ... فهو اسم يحتوي على الحرف T مرتين ..
ولو ان احدهم يدعى TRRRRRRRRT فسوف يعرض أيضا لأنه يحتوي على الحرف T مرتين وهكذا ,,,,,,
التحدي الثاني :
ما الناتج من العمليات التالية ؟
صح و صح و صح و صح و خطأ = ؟؟؟
خطأ أو صح أو خطأ أو صح = ؟؟؟
نفي نفي نفي نفي نفي الخطأ = ؟؟؟
التحدي الثالث :
اريد عرض اسماء ورواتب الموظفين الذين راتبهم اكبر من 1000 واقل من 5000 بدون استخدام Between
التحدي الرابع :
اريد عرض اسماء ورواتب الموظفين الذين اسمائهم KING أو SCOTT أو TIGER بدون استخدام IN
التحدي الخامس :
هل تشاهد الصورة 47 ؟؟ وهي ثلاث شروط ... برأيك مالناتج اذا كان بينهم OR ؟؟ وما الناتج اذا كان بينهم AND
(الصورة 47)
http://img6.picsplace.to/img6/10/47.jpg
التحدي السادس :
.... التحدي هو ان تشرح لي بمثال .. من عندك .. لو هناك AND و OR و AND ... مالذي سوف يحدث اولا ؟؟ ولماذا ؟
التحدي السابع ....
لماذا ظهرت النتيجة السابقة ؟؟ لماذا KING و WARD هما اللذان عرضا فقط ؟؟
أتحداك ان تقنعني لماذا .. أقنعني بطريقتك .. وسوف أحاول فهمك !!
انتهى الدرس ...
استعدوووو ... الى الشغل العنيف ..
توقعو الدرسين التاليين .. دسمين .. لدرجة الموت ,,,
سوف تخوصون لدرجة الاحتراف ان شاء الله
وحتى تاريخه ..
دعواتكم يا ناس ... ياخي ادعي من قلبك ولمدة 60 ثانية .... يعني وش بينقص منك ^^ ؟؟؟
شكرا لكم ^^
yasean
27-12-2005, 07:45 AM
..
السلام عليكم ورحمة الله وبركاته ..
أحببت التنبيه فقط إلى أن الصور في الصفحة الثانية
الكثير منها لا يظهر ..
على سبيل المثال .. الصور رقم 143 و 153 و 163
وجزاكم الله خيراً .. تحياتي ..
yasean
27-12-2005, 08:28 AM
..
السلام عليكم ..
أعتذر أخوي ..
أخيراً ظهرت الصور .. شكراً لك ..
تحياتي ..
The Coder
28-12-2005, 10:36 PM
..
السلام عليكم ..
أعتذر أخوي ..
أخيراً ظهرت الصور .. شكراً لك ..
تحياتي ..
وعليكم السلام ^^
شكرا لتنبيهك .... واصبر عليها لكي تظهر ^^&
حياك الله يا ياسين ,.,,
The Coder
29-12-2005, 11:30 PM
بسم الله الرحمن الرحيم
الدرس الثامن
اسم الدرس : جملة الاستعلام select والدوال
نوع الدرس : تطبيقي
صعوبة الدرس : *** من *****
اهميــة الدرس : ****** من ***** (Over)
درجة احتراف لغةSQL المتوقعة بعد هذا الدرس : ** من ***** (مبتدئ متقدم )
الوقت المتوقع منك لفهم الدرس : 10 ساعة (ساعتين فهم و 8 ساعات تطبيق )
متطلبات تتوفر فيك : التطبيق
المتوقع منك في هذا الدرس :
- التأكد من تركيب الأوراكل ,,
- اتقان جزء من هذه اللغة 100 %
- معرفة ترتيب النتائج تصاعديا وتنازليا .
- اتقان الدوال الاحادية .
- اتقان الدوال المتعددة .
هيا لنؤركل ^^
السلام عليكم
قبل البدء أريدك ان تعرف ان هناك جدول وهمي .. يدعى dual له أغراض كثيرة ..
منها التجريب عليه ..... وله مأرب اخرى ,,,
لو جربنا جملة الاستعلام هذه :
select * from dual ;
فسوف يعطيك نتيجة غريبة !! ....
انظر النتيجة :
D
-
X
انا شخصيا لا اعرف لماذا هذه النتيجة بالذات..
ولكن اعرف لماذا يعطينا نتائج مبهمة ..
قلنا ان الجدول له أغراض .... فسوف تجدني في هذا الدرس وفي دروس اخرى .. أتطرق لهذا الجدول ....
الان لو اريد التاريخ الحالي ... يعني لو ما عندي تقويم.. كيف اعرف التاريخ الحالي ؟؟
اليك الامر !!
select sysdate from dual;
SYSDATE
--------
23/12/05
واو .... صدقت النتيجة !!
هل رأيت ذلك ؟؟
- بعض الحماقات !!
مممممم .. اريد ان احسب 1+4 = ؟؟؟
select 1+4 from dual ;
النتيجة :
1+4
---
5
ههههههه ... غريب جدا ^^ .. لدينا آلة حاسبة
select 'haaaaahaaaaaaahaaaaaaaaaaaa!!!' from dual ;
والنتيجة ....
'HAAAAAHAAAAAAAHAAAAAAAAAAAA!!
------------------------------
haaaaahaaaaaaahaaaaaaaaaaaa!!!
ممممم ... الغريب ان الجدول .. لا يوجد به حقول و.... سجلات عادية !!
والاغرب انني جربت هذا الشيء في جدول emp المعروف ... وظهرت نتائج غريبة !!
اليك بعض منها ...
select 'what is wrong ?' from emp ;
النتيجة ....
'WHATISWRONG?'
---------------
what is wrong ?
what is wrong ?
what is wrong ?
what is wrong ?
what is wrong ?
what is wrong ?
what is wrong ?
what is wrong ?
what is wrong ?
what is wrong ?
what is wrong ?
what is wrong ?
what is wrong ?
what is wrong ?
واو ... بعدد السجلات الموجودة .. ظهر النص الذي اردت عرضه ؟؟ 14 سجل !! بعدد السجلات الموجودة في جدول الـموظفين !!
اوكيه .. اليك التاريخ !!
select sysdate from emp ;
واو ... نتيجة مبهرة .. انظر اليها !!
SYSDATE
--------
23/12/05
23/12/05
23/12/05
23/12/05
23/12/05
23/12/05
23/12/05
23/12/05
23/12/05
23/12/05
23/12/05
23/12/05
23/12/05
23/12/05
.. نفس النتائج ولكن بعدد السجلات !!
اذن ما فائدة جدول dual ؟؟؟؟؟؟
select 2*10+(11-7) from emp ;
النتيجة ...
2*10+(11-7)
-----------
24
24
24
24
24
24
24
24
24
24
24
24
24
24
واو ... يوجد في جدول الـموظفين 14 سجل ... وبعددها عرض لنا تلك النتائج ....
ممممم .. اعتقد إنني اكتشفت في هذه اللحظة .. استنتاج غبي ...
جدول dual به سجل واحد فقط .... لذا فهو يعرض لي النتيجة مرة واحدة ....
فهمت الان لماذا به سجل واحد ؟؟ لأني اطلب منه نتيجة واحدة .. وليست 14 نتيجة مشابهة !!
وانا شخصيا استنتجت شيء آخر .. وسأقوله لكم فيما بعد ,, ان شاء الله ^^
و اريد ان اشير الى انني اكتشفت شيء غريب قليلا .... لعل وعسى انها غلطة من البرنامج ...
وهي كالتالي :
select ename as "The_Name_Of_Employee" from emp
where ename ='KING' ;
يعني وضعت عنوان مستعار للعمود ename .... وجعلته طويل قليلا ..
فسوف يكون الناتج :
The_Name_O
----------
KING
هل لاحظت الاسم المستعار كيف عرض منه عشرة احرف فقط ؟؟
لا ادري لماذا ولكن أتوقع انه سوف يعرض على حسب عدد خانات العمود نفسه !!
يعني ان العمود ename عدد خاناته هي 10 خانات .. او 10 احرف !!
وبالتالي اعتقد أنها غلطة في نفس برمجة البرنامج ... لذا .. لا يهم ولكن أردت التنويه ,,,
المهم المهم .. اترك هذه الحماقات ... و حاول تركيب الأوراكل ....
سنعود بعد شوية ... ^^ << تطوير لسبيس تون
The Coder
29-12-2005, 11:46 PM
- جزء من تركيب الأوراكل 10G:
في بداية وضعك للCD سوف تظهر لك بعض الخيارات ..تابع حتى تظهر لك الصورة التالية (صورة 01 ):
http://img6.picsplace.to/img6/10/01_062.jpg
رقم واحد : اجعله هذا الخيار بالضغط عليه
رقم اثنين : سوف يعرض لك بشكل اوتوماتيكي .. وهو مسار البرنامج ...
طبعا هو في العادة يظهر في C:\ لكن انا وضعته في H:\
رقم ثلاثة :اجعل الخيار Enterprise Edition
رقم اربعة : اجعل علامة الصح في المربع
رقم خمسة : هذا مهم جدا ان تجعله اسم تتذكره ... للتسهيل اجعله مثل ما جعلته انا … الا وهو "ora"
رقم ستة وسبعة : اضف كلمة سر ... لا تنسى هذه الكلمة .. اذا نسيتها .. فأرجو تحميل الاوراكل مرة اخرى ,,
رقم ثمانية : اضغط التالي NEXT
اكمل التحميل ... اذا واجهتك أخطاء في التنزيل اضغط "تجاهل" ignore" "
بعد التحميل .. انظر الصورة 06
http://img6.picsplace.to/img6/10/06_018.jpg
اختر البرنامج الذي يدعى بـ SQL Plus
وهو برنامج خاص بتنفيذ أوامر الـ SQL
سوف يظهر لك النافذة التالية الصورة 066:
http://img5.picsplace.to/img5/16/066.jpg
هل تذكر كلمة السر ؟؟
هل تذكر كلمة ora ؟؟
اكتب المعلومات كما هي موضحة .. ثم اضغط اوكيه ,,
ان معنى system هو مجرد مستخدم افتراضي ... له الصلاحية العظمى في الوصول الى قاعدة البيانات اوراكل ...
سوف نتكلم فيما بعد عن الصلاحيات .. وعن المستخدمين ان شاء الله تعالى .,,,
اذا واجهت مشكلة ... راسلنا ,,,
سوف يظهر لك البرنامج .. اكتب ما يلي : الصورة 0661
http://img6.picsplace.to/img6/10/0661.jpg
1 اكتب الامر الموضح كما هو عليه ..
2 اكتب كلمة سر و احفظها جيدا .. يفضل ان تكون نفس كلمة السر التي وضعتها ...
3 تأكيد كلمة السر
4 اكتب الامر كما هو عليه
5 اكتب كلمة السر
اذا لم يعطيك كلمة connected او أعطاك مشاكل غيرها فراسلنا
6 اكتب الامر كما هو عليه
7 اكتب الامر كما هو عليه
اذا عرضت هذه النتيجة .. فهذا يعني ان جدول emp موجود لديك ,, وهو جدول جاهز يأتي مع الأوراكل ,,
الان ... أغلق البرنامج .. وافتحه مرة ثانية .. واكتب هذه المرة مايلي :
الصورة 067
http://img5.picsplace.to/img5/16/067_000.jpg
طبعا كلمة السر الجديدة .. وقلت لك من الأفضل ان تكون نفس كلمة سر المستخدم system
اسكوت Scott هو مستخدم افتراضي اخر .. لديه بعض الجداول التي نحن ندرسها في منهجنا ..
الجداول هي emp و dept لا عليك في الجداول الباقية ,,,
بعد الضغط على اوكيه ... سوف تظهر لك المؤشر الخاص بالكتابة ... بهذا الشكل "SQL>"
يعني يا حبيبي اكتب ما شئت من جمل الـ SQL
كل ما شغلت هذا البرنامج ... اكتب الامر التالي ...
انظر الصورة 068
http://img6.picsplace.to/img6/10/068.jpg
لو لم تكتبه ... فسوف تعرض الجداول بشكل غير مرتب ....
المهم .. اليك بعض الاختصارات لهذا البرنامج ..... والتي أرى أنها ليست مهمة بالمرة ,,,
لتنفيذ اخر امر كتبته ... اكتب R ثم اضغط Enter
لاستعراض اخر امر كتبته .. اكتب L ثم اضغط Enter
لكي تستعرض اخر امر كتبته في مذكرة للتعديل عليه ... اكتب ed ثم اضغط Enter
سوف يعرض لك برنامج المذكرة .. وبه الامر مكتوب .. عدل ما شئت فيه .. ثم اغلقه مع الحفظ ..
بعدها سيعرض لك نتائج الامر الذي عدلته ,,,
لحفظ اخر امر كتبته ... اكتبه بهذه الصيغة
save C:\a.sql ;
طبعا اكتب المسار الذي تريده ... انا كتبته في المسار c:\
وانا سميت الملف باسم a
انت بامكانك تسميته ماشئت .. مثلا سميه ABC
وتريده في المسار D:\ ... اكتبه كما يلي :
save c:\ABC.sql;
تريد استرجاعه ؟؟
اكتب الامر التالي /
get c:\ABC.sql ;
هناك اوامر اخرى لكن ... اتركها في وقتها ^^
الان نرجع للدرس الرئيسي لهذا اليوم ,,,
The Coder
30-12-2005, 12:27 AM
- ما معنى دالة Function؟؟
هو شيء يأخذ شيء معين .. ويعمل عمل ما ... ثم يعطيني ناتج معين !
فكر في صندوق .. له مدخل ومخرج ... انت او غيرك تدخلون شيء في المدخل.. ويخرج بنتيجة من المخرج
مثلا .. آلة تغليف علب .. تخيل شكلها مثل الصندوق ... لها مدخل ولها مخرج .. ولا تعرف ما بداخلها !!
ادخل علبة بمقاس 1 م مكعب ... تخرج من الجهة الثانية علبة بمقاس 1 م مكعب ولكنها مغلفة بشكل جميل ...
ادخل رأسك ..... يخرج مطرزا من الجهة الأخرى وبشكل غير مقبول
وإذا كانت الآلة ذكية .. سوف تعطي خطأ .. وتقول ان حجم رأسك ليس ا م مكعب .. وليس بالشكل المطلوب وهو على شكل مكعب
اذن الآلة هي دالة تغليف .... دالة عملها التغليف .. (اعرف انه من الخطأ قول ذلك ولكن .. تخيل !!)
الدالة هي مثل الآلة .. ولكنها دالة برمجية .... لا نعرف ما بداخلها .. نعرف ان لها مدخل او مداخل ... ولها مخرج او مخارج ... كالصندوق الأسود ... غامضة ....
لماذا الدالة في منهجنا ؟
توجد في لغة الـ SQL دوال برمجية .. قد بناها مطورو هذه اللغة .. وهي للاستخدام فقط ... لا نعرف كيف عملوها
لا نعرف ما بداخلها .. من الممكن ان نتوقع كيف عملت .. ولكن لا نعرف بالضبط كيف عملت ...
لماذا عملوها ؟ للتسهيل علينا ...ونستخدمها ..
لماذا نستخدمها ؟ لانها مفيدة وتعمل لنا أعمال تختصر علينا الوقت ...
مثلا ...
توجد دالة اسمها .. دالة الإلصاق .. يعني تلصق شيء بشيء ....
ادخل في هذه الدالة نص ... وادخل نص آخر ... وسوف تعرض لك الناتج ... النصين ملتصقين في نص واحد... يا سلام .. شيء جاهز ...
دالة تحويل الحروف الى حروف كبيرة CAPITAL
ادخل الكلمة abcd من مدخل الدالة (مدخل الصندوق) .. وسوف تعمل اعمال لا تعلم انت ماهي .. واذا بها .. تخرج لك من مخرج الدالة (مخرج الصندوق ) هذه النتيجة ABCD
يا سلام ... شيء اخر .. جاهز .. لا نعرف مالذي فعلته الدالة بالداخل .. ولكن يهمنا النتيجة ..
,’,’,’,’,’لكي تستطيع تخيل الدالة ,’,’,’,’,’
اريدك ان تقرأ الدرس هذا من البداية ... ثم تكمل ..
....
...
..
.
هل قرأته مرة ثانية ؟؟ احلف !!! ... اوكيه .. نكمل ,,
الفنكشن (فنكشن = Function = دالة ... شكلها جميل بالعربي هاه ^^) لها مدخل أو اكثر ... ولها مخرج أو اكثر صح ؟؟
في لغة الـ SQL يوجد نوعين من الفنكشن (لاحظ النطق للـ Function)...
الدوال احادية الصف Single-Row Function
الدوال متعددة الصف Multi-Row Function
هذه النوعين .... لهما اكثر من مدخل ... ولكن لهما مخرج واحد !!
افهم جيدا !! .. اكثر من مدخل .. ومخرج واحد .... لكلا النوعين .. الاحادية والمتعددة
اذا أردت معرفة كيف شكل مداخل ومخارج هذه الآلة ... ااااقصد ... هذه الدالة ... فإليك شكلها المعتاد
المخرج اسم الدالة ( المدخل الأول , المدخل الثاني ,..... , مدخل لانهائي )
اذا لم تفهم هذا الشكل .. لا تهتم ... سوف تفهما في المستقبل البعيد ^^
لكن اريد ان انوه الى نقاط مهمة جدا جدا جدا ,,
- مداخل الدالة تسمى بعوامل الدالة .. أي Parameters ومفردها parameter لا تنسى ذلك ..
- مخرج الدالة .. هو ما ترجع به الدالة ... يعني اذا قلنا الدالة ترجع قيمة كذا وكذا .. معناه ان الدالة تخرج كذا وكذا !!
- ان المداخل متعددة .. ولكن المخرج واحد في دوال الـ SQL
- اذا كانت الدالة ثلاث مداخل .. يعني ثلاث مداخل ... لو ان لها مدخل واحد ... يعني مدخل واحد !! ...
لو أدخلت ست قيم والدالة أصلا مدخلين اثنين مثلا !! .. فهذه والله اكبر فضيحة ,,
- بعض الدوال تقول "انت !! .. ادخل نص فقط ... لا تدخل رقم !!" والبعض الاخر .. لها مدخل نصي .. ومدخل تاريخ .. ومدخل رقمي .. وبعض الدوال كل مداخلها أرقام ... وهكذا .. فتنبه لذلك!!
- توضع الدوال عادة بعد select أي كعمود .. او بعد where ... وتوضع في مداخلها عادة اسم عمود أو أي جملة ... واقصد بالجملة هنا أي نص .. أي حرف .. أي رقم .. أي تاريخ !!
يعني في المدخل يا جملة .. يا عمود !! فقط لا غير ,,
لانك لو أخطأت .. في بعض الأحيان حتصير مشاكل .. واذا كانت الدالة ذكية ومتفهمة لغباء مستخدمها .. فسوف تتجاهل الأمر ,,
مفهوم !! لا تنسى ذلك ... سأقتلك !!
الان انسى امر الدوال المتعددة ... ونبدأ بالدوال الاحادية ,,,,,
1) الدوال الاحادية الصفوف Single-Row Function
وهي اربع أنواع ..( تفيدنا في اربع أغراض .. لاتنسى حفظ الانجليزي )..
أ- دوال لأغراض النصوص Character Functions
ب- دوال لأغراض الأرقام Number Functions
ج- دوال لأغراض التواريخ Date Functions
د- دوال لأغراض التحويل Conversion Functions
الان ... ابدأ بالتحمية ....وتوكل على الله ,,,
أ- دوال لأغراض النصوص Character Functions
لاحظ دوال ... وليست دالة ..
- دالة LOWER (lower = معناها اصغر أو أوطأ .. او أسفل )
العمل :تحويل النصوص الى حروف صغيرة small
المثال :
Select LOWER('GOOD by') from dual ;
النتيجة هي ...
LOWER('
-------
good by
يعني .. أدخلنا كلمة GOOD by , وهي كلمة بها حروف كبيرة وحروف صغيرة .. هل لاحظت ذلك ؟؟
سوف تتحول جميع الحروف الى small ... لتصبح good by
لاحظ ان الحروف الكبيرة .. تحولت صغيرة .. وان الحروف الصغيرة .. كما هي عليه !!
يعني لو أدخلنا GOOD BY سوف تتحول الى good by
ولو أدخلنا good by فسوف تكون كما هي عليه good by
الان مثال آخر ...
اريد عرض أسماء جميع الموظفين بالحالة العادية (أي كما هي عليه في الجدول)... والحالة بالحروف الصغيرة
select lower(ename) "Lower" , ename "Normal" from emp ;
والنتيجة ....
Lower Normal
---------- -------
smith SMITH
allen ALLEN
ward WARD
jones JONES
martin MARTIN
blake BLAKE
clark CLARK
scott SCOTT
king KING
turner TURNER
adams ADAMS
james JAMES
ford FORD
miller MILLER
لو ان احدهم اسمه King سوف يعرض king في العمود lower وسوف يعرض King في العمود Normal ....
لماذا هذه الدالة ؟؟ ومتى نستخدمها ؟؟
سوف اعرض لك استخدام قوي جدا .. لها ,,
لو عرفنا ان احدهم يدعى بـ كنق ...
لا نعرف هل ادخل مدخل البيانات اسمه هكذا KING ام هكذا King ام كيف ؟؟
بما اننا لا نعرف كيف ... فسوف نكتشف هذا الشيء عبر المثال التالي :
select ename from emp
where lower(ename) ='king';
هل لاحظت مالذي عملته ؟؟
أجبرت الاسم ان يكون بالشكل الحروف الصغيرة !!
اعرف ان معظمكم لم تصل إليه الرسالة والفكرة .. لكن بالله عليكم ركزوا جيدا ...
لماذا انا قلت 'king' بالذات ؟؟ الم اقل لكم أنني لا اعرف حالة الحروف الخاصة بكنق ؟؟
لماذا يا ترى؟
النتيجة ....
ENAME
------
KING
- دالة UPPER (upper = اكبر أو أعلى ..)
العمل :تحويل أي نص الى حروف كبيرة CAPITAL
الأمثلة :
Select UPPER('GOOD by') from dual ;
النتيجة ....
UPPER('
-------
GOOD BY
أدخلنا كلمة GOOD by .. وتحولت الى GOOD BY
هذه الدالة .. شبيهة التركيب للدالة lower .. وتنطبق عليها ما ينطبق على الدالة lower
لذا ... فجرب نفس امثلة الـ Lower على هذه الدالة ,,,
الجدير بالذكر ان هذه الدالة .. تدخل نص .. تدخل ارقام ... فلا يوجد مشاكل بها ,,,
جرب لو وضعنا هذه الجملة ... مالذي يحدث ؟
select upper(sal) from emp ;
The Coder
30-12-2005, 12:30 AM
- دالة INITCAP
العمل : تحويل أي نص الى ( الحرف الأول كبير .. وبقية الحروف صغيرة )
الأمثلة :
Select INITCAP('GOOD by mY FrIeNd') from dual ;
النتيجة كما يلي
INITCAP('GOODBYMY
-----------------
Good By My Friend
هل لاحظت مالذي حدث ؟؟
كلمة GOOD تحولت الى Good
كلمة by تحولت الى By
كلمة mY تحولت الى My
كلمة FrIeNd تحولت الى Friend
يعني أي كلمة ... سوف تتحول الى أولها حرف كبير .. والبقية احرف صغيرة
ينطبق على هذه الدالة ما ينطبق على Lower و Upper
اليك التحدي الأول !!
لو كتبنا الأمر التالي ....
select initcap(upper(lower('HI My friends ^^'))) from dual ;
مالذي سوف ينتج ؟؟؟؟
ولماذا نتج ما نتج ؟؟ مع تفصيل شرحك ,,,,
ارجو منك عدم استخدام البرنامج لمعرفة النتيجة ...
انت اجلس مع نفسك .. وتوقع النتيجة على الورق ,,
وأنا لم اشرح هذا الجزء المهم من الدوال لغرض ما في نفسي ,,
-دالة CONCAT
العمل : ضم كلمتين او نصين وجعلهما كلمة واحدة
الأمثلة :
Select CONCAT('GOOD ' , 'BY') from dual;
لاحظ انه توجد مسافة بعد كلمة GOOD !! انا وضعتها عمدا لكي تصبح النتيجة ..
CONCAT(
-------
GOOD BY
هل شاهدت النتيجة !!
الكلمة الاولى + الكلمة الثانية = الكلمتين مضمومة !!
... الان بدأت اتأسف يا عرب ...
سوف اضطر الى تصعيب المنهج اكثر واكثر .. فتحملوني يا عرب ,’,’,’
اريد عرض أسماء الموظفين بحالة الحروف الكبيرة Capital في عمود .. وبحالة الحروف الصغيرة small في عمود اخر .. وأريدهم مضمومتين في عمود ثالث ....
يجب ان تعرض فقط اسماء الموظفين الذين يعملون تحت القسم 30 ,,,
اليك النتيجة التي انا اريدها بالضبط ,,
allen ALLEN allenALLEN
ward WARD wardWARD
martin MARTIN martinMARTIN
blake BLAKE blakeBLAKE
turner TURNER turnerTURNER
james JAMES jamesJAMES
لماذا لا تفكر قليلا قبل رؤية الحل ؟؟؟
فكر فكر فكر فكر
فكر فكر فكر
فكر فكر
فكر
حللتها ؟؟؟
ممتاز ... اليك الحل ...
select lower(ename), upper(ename) , concat(lower(ename) ,upper(ename)) from emp
where deptno = 30 ;
مسلية وبسيطة ^^ ....
النتيجة كما اسلفنا بهذه الصورة ....
LOWER(ENAM UPPER(ENAM CONCAT(LOWER(ENAME),
---------- ---------- --------------------
allen ALLEN allenALLEN
ward WARD wardWARD
martin MARTIN martinMARTIN
blake BLAKE blakeBLAKE
turner TURNER turnerTURNER
james JAMES jamesJAMES
- دالة SUBSTR
العمل : تأخذ جزء من الكلمة او النص ... أي تقص منه
الأمثلة :
Select SUBSTR('GOOD BY',2,3) from dual;
لاحظ انها ثلاث مداخل !! أي ثلاث Parameters
المدخل الأول يفترض بأن يكون نص (لقد جربتها مع الأرقام والتواريخ ونجحت ^^ .. لكن فائدتها الحقيقية في النصوص والتواريخ فقط ...), و المدخل الثاني والثالث يفترض بأن يكونا رقمين .
اليك الناتج ...
SUB
---
OOD
لماذا هذه النتيجة ؟؟
قلنا ان هذه الدالة تأخذ جزء من النص .. وتقصه لكي يتم عرضه كما نريد ....
أدخلنا نص .. وهو GOOD BY .. لاحظ ان المسافة تعامل وكأنها حرف !!
وأدخلنا عددين وهما 2 و 3 ...
ثاني مدخل خاص برقم الحرف الذي يبدأ منه القص ... بالله عليك ثاني حرف في كلمة GOOD BY ماهو ؟؟
حرف الـO الأول صح ؟؟
ثالث مدخل خاص بعدد الأحرف التي يجب ان تعرض ...
عد ثلاث حروف بالبدء من الحرف O
O
O
D
وتبقى الكلمة النهائية OOD
اذا لم تفهم .... اليك مثال اخر ,,,
اريد عرض تواريخ توظيف الموظفين مقصوصة من الحرف الأول الى الحرف الرابع..
وأريد عرض تواريخ توظيف الموظفين مرة اخرى مقصوصة من الحرف الخامس الى الحرف السادس
وأريد نفس الشيء ولكن مقصوصة من الحرف الأول فقط !!
وأريد عرض التواريخ بنفس صيغتها
وأريد عرض ثاني رقم وثالث رقم من الرواتب فقط ....(مقصوص منها الرقم الثاني والثالث )
وعرض الرواتب بنفس صيغتها ..
يعني بهذه الصورة
A B C D E F
-------- ---- -- - ---------- -
17/12/80 17/1 2/ 1 800 0
20/02/81 20/0 2/ 2 1600 6
22/02/81 22/0 2/ 2 1250 2
02/04/81 02/0 4/ 0 2975 9
28/09/81 28/0 9/ 2 1250 2
01/05/81 01/0 5/ 0 2850 8
09/06/81 09/0 6/ 0 2450 4
19/04/87 19/0 4/ 1 3000 0
17/11/81 17/1 1/ 1 5000 0
08/09/81 08/0 9/ 0 1500 5
23/05/87 23/0 5/ 2 1100 1
03/12/81 03/1 2/ 0 950 5
03/12/81 03/1 2/ 0 3000 0
23/01/82 23/0 1/ 2 1300 3
فكر فكر فكر فكر .............
The Coder
30-12-2005, 12:32 AM
لا تعرف ؟؟ انك تعرف انني اعرف انك لا تعرف ذلك ,,,,
خذ الحل ..
Select hiredate A, SUBSTR(hiredate,0,4) B, SUBSTR(hiredate,5,2)C
, SUBSTR(hiredate,0,1) D,sal E ,SUBSTR(sal,2,1) F from emp ;
لاحظ انني سميت الأعمدة بالحروفA B C D ....
A هو التاريخ كما هو عليه
B التاريخ مقصوص منه اول اربع حروف .. لاحظ بإمكاننا ان نضع الرقم 1 بدلا من 0 ... جربتها وستجدها نفس النتيجة
C مقصوص من الحرف الخامس الى السادس ... يعني ابدأ من الخامس .. واعرض حرفين الخامس والسادس....
D عرض اول حرف من التاريخ .. لاحظ اننا لو وضعنا 1 بدلا من 0 .. فستأتي نفس النتيجة ....
E عرض الراتب كما هو عليه ...
F عرض الرقم الثاني من اليسار .. للراتب .. لاحظ اننا لا نحتاج هذه الدالة مع الأرقام .. في اغلب الأحيان
ولكن وضعتها انا هنا لكي ترى ان الدالة ذكية قليلا .. وغبية قليلا ... وبنت حلال ... ولم تعمل مشاكل ,,,
الان اريد ان اعرض اسماء الموظفين بالحالة الاحرف الصغيرة .. ومقصوص من الحرف الأول الى الثالث ...
ماذا اعمل ؟؟
فكر فكر فكر فكر ....
اليك الحل ....
...
..
.
select SUBSTR(lower(ename),1,3) , ename from emp ;
لاحظ .... اننا استخدمنا الدالتين ...
وهذه حلاوة استخدام الدوال ... بإمكانك مزج احدها مع الأخرى ... بالطريقة التي تعجبك ,,,
اليك الناتج ....
SUB ENAME
--- ------
smi SMITH
all ALLEN
war WARD
jon JONES
mar MARTIN
bla BLAKE
cla CLARK
sco SCOTT
kin KING
tur TURNER
ada ADAMS
SUB ENAME
--- ------
jam JAMES
for FORD
mil MILLER
- دالة LENGTH (Length = الطول !!)
العمل : توجد عدد احرف الكلمة ... او النص (طول النص ^^)
الأمثلة :
Select LENGTH('GOOD By') from dual;
كم تتوقع يوجد حرف ؟؟
اذا قلت 6 حروف .. فقد أخطأت!! .. لماذا لا تحسب المسافة ؟؟
المسافة تعتبر حرف كما أسلفنا
الناتج هو :
LENGTH('GOODBY')
----------------
7
هل فهمت ؟؟
لا أرى فيها صعوبة ...
لكن لو جربناها مع الراتب مثلا ....وهو رقم .. فمالذي يحدث ؟؟
Select LENGTH ( sal ) from emp ;
مالناتج ؟؟ ولماذا ؟؟
LENGTH(SAL) SAL
----------- ----------
3 800
4 1600
4 1250
4 2975
4 1250
4 2850
4 2450
4 3000
4 5000
4 1500
4 1100
3 950
4 3000
4 1300
عرض عدد الخانات للأرقام ؟
اعتقد انه في جملة Select .. سوف تحول الأرقام والتواريخ الى نصوص للعرض ...
لا اعتقد .. بل اجزم بذلك ...
اذا لم تفهم ما معنى تحويل الأرقام لحروف .. فسأشرح لك الان بعض الأمور ...
يوجد هناك نوعين من الأرقام ...
رقم رقمي
ورقم حرفي ..
الرقم الرقمي .. يستخدم للعمليات الحسابية كالضرب والجذر وغيرها ....
والرقم الحرفي .. للعرض عادة ... فمثلا اسم ملف ما .. ABC123 .... الارقام 1 و 2 و 3 ... هي احرف شكلها أرقام !! ..
اذا كنت تعرف شيء اسمه الأعداد الثنائية ... فهذا جميل ...
الأعداد الثنائية هي 0 و 1 .. وهي التي يفهمها الحاسب ..
والأعداد العشرية هي 0 و 1 و 2 و.......9 والتي نستخدمها نحن كبشر عادة ...
العدد الثنائي = ما يناسبه بالعشري
1 =1
10 =2
11 =3
100= 4
101=5
وهلم جر ,,,
سوف نغطي هذه الدروس فيما بعد ان شاء الله ....
المهم هذه الأرقام هي ارقام رقمية .. تستخدم للحسابات كما اسلفنا ..
الأرقام الحرفية .. هي حروف على شكل ارقام .. تستخدم للعرض ...
فمثلا ... في نظام الحروف .. وليس الأرقام ... لاحظ!! نظام الحروف وليس الأرقام !!
0010000 = 1
0010001 = 2
0010010 = 3
......
......
1000001 = A
1000010 = B
....
وهكذا ...
طبعا الثلاثة الرقمي والذي شكله (11) غير الثلاثة الحرفي والذي شكله (0010010 )
فأنا كنت أقول ان جملة الاستعلام select تعمل العمليات الحسابية والمنطقية وكل شيء ..
وفي النهاية تحول الناتج ... الى حروف (حروف=نصوص)
فائدة هذا التحويل هي العرض فقط على الشاشة ,,
لم تفهم ؟؟
سوف تفهم بشكل منطقي ومرتب اكثر في المستقبل البعيد ان شاء الله ,,,
محترف ؟؟ ذكي ؟؟ عبقري ؟؟ تحب التحديات ؟؟
تحدي للمحترفين فقط !! اكرر للمحترفين ,,...
اريد ان اعرض أسماء الموظفين في عمود
وأريد عرض أسماء الموظفين ماعدا الحرف الأخير مقصوص منه في عمود اخر
وأريد عرض الحرف الأخير من أسماء الموظفين في عمود ثالث !!
يعني اريد الناتج بهذه الصورة :
A B C
---------- - -------
SMIT H SMITH
ALLE N ALLEN
WAR D WARD
JONE S JONES
MARTI N MARTIN
BLAK E BLAKE
CLAR K CLARK
SCOT T SCOTT
KIN G KING
TURNE R TURNER
ADAM S ADAMS
JAME S JAMES
FOR D FORD
MILLE R MILLER
صعب هاه ؟؟
اريد تصعيبه اكثر وأكثر ..
اريد عرضه بهذا الشكل !! :
ALL_OF_THEM
--------------------
SMIT + H = SMITH
ALLE + N = ALLEN
WAR + D = WARD
JONE + S = JONES
MARTI + N = MARTIN
BLAK + E = BLAKE
CLAR + K = CLARK
SCOT + T = SCOTT
KIN + G = KING
TURNE + R = TURNER
ADAM + S = ADAMS
JAME + S = JAMES
FOR + D = FORD
MILLE + R = MILLER
في عمود واحد يدعى all_of_them !! وهو التحدي الثاني
.. انا شخصيا .. لا اعتقد ان أحدكم سيحله اصلا ..
ولا اعتقد ان احدكم سيفكر اصلا ان يقرأ كل سطر ,, هل تعرف لماذا ؟
لأنه لا يوجد إلا واحد فقط الان .. يحل التحديات أول بأول !! ما شاء الله عليه ,,
كانوا 25 .. وصاروا 7 ... و قبل أيام 2 ... والآن واحد فقط .. يحل معي ,,
انا صراحة اعتبرها مصيبة ,, لو ما بتعرف مش مشكلة ...
لان التحديات عادة صعبة ولم اشرحها وتحتاج لاستنتاج منك ...
لذا .. فليكن ما يكن ,,
- الدالة INSTR
العمل : تحدد مكان حرف .. في أي نص ... أي تدخل نص .. وتدخل الحرف الذي تريد معرفة مكانه ..
وفي النهاية سوف ترجع (ترجع=تخرج) الدالة رقم وهو ترتيب الحرف في النص ,,
الأمثلة :
Select INSTR('GOOD GOOD','D') from dual ;
ومعناه .. في النص GOOD GOOD ماهو ترتيب اول D يواجهنا ؟؟
سوف يكون الحرف الرابع صحيح ؟؟
INSTR('GOODGOOD','D')
---------------------
4
لو وضعنا مثلا النص GOOD , ثم وضعنا حرف S مثلا ..
بالله عليك اين الحرف S ؟؟ هي يوجد حرف S في النص GOOD ؟؟؟
طبعا لا ,, لذا فسوف يكون الناتج .... صفر ’,’,’,’,’,’
اريد تعقيد الأمور اكثر و اكثر ,, اريد ان أتفنن في كل ما أخذناه !! مع العلم انني اعقد الأمور من رأسي , ولا يوجد منهج في العالم يعلمني كيف اعقد الأمور على نفسي , فأتوقع منك ان تعقد الأمور انت اكثر وذلك بالتمرس والتجريب , طبعا اذا لم تتمرس كثيرا وتجرب كثيرا , فلن تتعلم بشكل قوي , انا لا اريد تعقيد الأمور اكثر , ولكن اريد ان افهم فهم عميق لماذا مطورو لغة الـ SQL وضعوا هذه الدوال ؟؟ لماذا فكروا في وضعها اصلا ؟
الان لدي سؤال غبي , اريد ان تعرض لي أسماء الموظفين بحالة الحروف الصغيرة , ومقصوصة عند حد الحرف a
فمثلا blake يحتوي على الحرف a يعني نقص حده فيصبح bla
ومثلا allene فيكون اسمه a
ومثلا king فيكون فارغ , لانه لا يحتوي على الحرف a
اليك الناتج الذي اقصده
ENAME B
---------- ---
SMITH
ALLEN a
WARD wa
JONES
MARTIN ma
BLAKE bla
CLARK cla
SCOTT
KING
TURNER
ADAMS a
ENAME B
---------- ---
JAMES ja
FORD
MILLER
طبعا لا اعتقد انك تحتاج لمثل هذا الغباء , ولكن اريدك ان تفكر فقط ,
سواء فكرت ام لم تفكر , اليك الناتج :
select ename , substr(lower(ename),1,instr(lower(ename),'a')) B from emp ;
استخدمت instr داخل دالة القص substr ,
لو كان اسم الموظف blake ..
يعني قص لي من اول حرف (الرقم واحد) , وعدد الحروف اللازمة هي ثلاثة .. لماذا ثلاثة ؟؟
لان ترتيب الحرف a هو الثالث من الاسم blake , يعني الدالة instr ترجع الرقم ثلاثة فتبدو الجملة هكذا :
Substr(lower(ename) , 1 , 3 )
لم تفهم ؟؟
طيب اليك ذلك لاحظ الحل بالتدرج ,’,’,’,’,’
Substr(lower('BLAKE'),1,instr(lower('BLAKE'),'a') )
Substr(lower('BLAKE'),1,instr('blake','a') )
Substr(lower('BLAKE') , 1 , 3 )
Substr('blake' , 1 , 3 )
bla
وهو الناتج الاساسي
لم تفهم ؟ ممممم اعتقد أنها صعبة عليك في هذا الوقت , لذا اتركها الان وراسلني لو عندك استفسار .
- الدالة LPAD
العمل : تنظيم من اليسار .
الأمثلة :
Select LPAD('AHMED',10,'*') from dual ;
كأن لسان حال هذه الدالة يقول :
"حدد المدخل الأول(المدخل الأول=AHMED في مثالنا هذا) بعدد المدخل الثاني( عشرة ) حروف ... اذا زاد .. قص منه الزائد , اذا نقص اكمل الحروف المتبقية بالمدخل الثالث (علامة النجمة) "
انظر الناتج :
LPAD('AHME
----------
*****AHMED
لم تفهم ؟
ادخلنا الحد 10 حروف صح ؟؟
ادخلنا حرف * صح ؟
لو ادخلنا في المدخل الأول ABC , فسوف يكون الناتج *******ABC (عشر حروف لاحظ من أي جهة النجوم)
لو ادخلنا المدخل الأول ABCDEFGHI فسوف يكون الناتج *ABCDEFGHI (عشر حروف لاحظ من أي جهة النجوم )
لو ادخلنا THE_ORACLE_COURSE فسوف يكون الناتج مقصوص لانه اطول من عشر , يعني هكذا : THE_ORACLE (عشر حروف)
لو كان المدخل لا شيء ؟؟ فسوف يكون الناتج **********
لماذا هذه الدالة ؟ للتنظيم فقط لا غير ,
اسم الدالة LPAD , وحرف الـ L يعني Left أي يسار (يعني وضع النجوم في اليسار في مثالنا )
تكره الشرح المفصل ؟؟
اليك مثال اخر ,,,
Select LPAD(ename,10,'-') from emp ;
LPAD(ENAME
----------
-----SMITH
-----ALLEN
------WARD
-----JONES
----MARTIN
-----BLAKE
-----CLARK
-----SCOTT
------KING
----TURNER
-----ADAMS
-----JAMES
------FORD
----MILLER
سوف تظهر لك النتائج بشكل منسق اكثر على برنامج SQL PLUS , لو طبقت الجملة السابقة طبعا !!
The Coder
30-12-2005, 12:38 AM
- الدالة RPAD
العمل : تنظيم من اليمين , نفس فكرة الدالة LPAD ولكن R تعني يمين Right
الأمثلة :
Select RPAD(ename,10,'!') , LPAD(ename,10,'?') from emp ;
لاحظ الناتج !! ولاحظ العلامتين ! و ؟
ولا تنسى ان تلاحظ اننا حددنا 10 حروف ,,
مرة باليمين ومرة باليسار :
RPAD(ENAME LPAD(ENAME
---------- ----------
SMITH!!!!! ?????SMITH
ALLEN!!!!! ?????ALLEN
WARD!!!!!! ??????WARD
JONES!!!!! ?????JONES
MARTIN!!!! ????MARTIN
BLAKE!!!!! ?????BLAKE
CLARK!!!!! ?????CLARK
SCOTT!!!!! ?????SCOTT
KING!!!!!! ??????KING
TURNER!!!! ????TURNER
ADAMS!!!!! ?????ADAMS
JAMES!!!!! ?????JAMES
FORD!!!!!! ??????FORD
MILLER!!!! ????MILLER
اليك مثال اخير ...
نريد تجربة تصغير الحد ... مالذي سوف يحدث ؟؟
Select ename , RPAD(ename,4,'*') from emp ;
والنتيجة هي :
ENAME RPAD
---------- ----
SMITH SMIT
ALLEN ALLE
WARD WARD
JONES JONE
MARTIN MART
BLAKE BLAK
CLARK CLAR
SCOTT SCOT
KING KING
TURNER TURN
ADAMS ADAM
JAMES JAME
FORD FORD
MILLER MILL
كأنها دالة القص substr , وليست هي طبعا ,,
وكما قلنا انها عملية تنظيمية ليست الا ,,,
- الدالة TRIM
العمل : اذا ادخلت حرف ما ... فسوف تحذفه من اول النص , ومن اخر النص اذا وجد هذا الحرف
دالة اعتبرها الوحيدة غبية جدا , ووجودها غريب فعلا ,,
اليك الأمثلة:
Select TRIM('S' FROM 'SAMI') as A from dual ;
والناتج ,,
A
---
AMI
ادخلنا الحرف S وادخلنا النص SAMI سيكون الناتج هكذا AMI
لو ادخلنا الحرف نفسه .. ثم ادخلنا النصوص التالية :
SAMIS الناتج AMI
SSSSAMISSSS الناتج AMI
Samis الناتج هو amis
SYSTEMS الناتج هو YSTEM
انا شخصيا لا اعرف لماذا هذه الدالة , ولماذا وجدت اصلا , اذا عرفت سر وجودها اخبرتكم فيما بعد ان شاء الله ,
اخيرا انتهينا من دوال النصوص ولله الحمد ,,, كثيرة هاه !!
اليك تلخيص مبسط للدوال الحرفية ... الصورة (18) احفظها جيدا ,,
http://img6.picsplace.to/img6/10/18_016.jpg
ب- دوال لأغراض الأرقام Number Functions
الدالة :ROUND
العمل :تقريب الأعداد ,’,’,’
الأمثلة :
اليك درس في الرياضيات !! درس ممل جدا جدا جدا .. تحمل على قراءة سطوره !!
تقريب الأعداد ..
اولا اريدك ان تعرف مايلي :
العدد 152 هو نفسه 0152
العدد 89 هو نفسه 000000089
العدد 189 هو نفسه 189.0000000 لأن الاصفار لا قيمة لها اذا كانت في يمين الفاصلة
العدد 754 ليس هو العدد 754.0001 ... العدد الثاني اكبر بمقدار ضئيل ,,,,
فرق بين المثالين الأخيرين !!
نبدأ الدرس ...
لماذا نقرب ؟؟؟ لكي يسهل علينا قراءة العدد ..
أيهما أسهل .. 1500145 مليون و خمس مئة ألف و مئة وخمس و أربعون ... أم 1500000 مليون ونصف ؟؟
طبعا هنا لا يهمنا الدقة .... يهمنا التقريب وسهولة العدد للتذكر ...
تشاهد الأخبار ؟؟ لو قتل في حرب ما لا سمح الله ... هذا العدد من الضحايا .... "15046 ضحية "..
ماذا يقولون ؟؟ يقولون "قتل ما يقارب 15000 ضحية ليلة أمس بـ......."
قتل ما يقارب !! .. تقريب .. صح ؟؟
يعني حذفوا 46 شخص !! لأجل التقريب ... الـ46 لا بأس بها .. بجانب 15046 ...
على حسب احتياجاتنا نقرب الأعداد .. فمثلا في الكيمياء الذرية ... لو احدهم قرب هذا العدد 0.00456 الى 0.0046
فنعتبرها مصيبة !! كارثة !!!! ... لماذا ؟؟ لأنه حذف عدد لا يغفر ,, ويهمنا بالدرجة الأولى ..
كأنه قال "قتل 10000 ضحية !! " هل فهمت النسبة والتناسب ؟؟
نبدأ في كيفية التقريب ...
لو هنالك طالب شاطر .. واخذ نسبة 98.8 نريد تقريب النسبة للعدد الصحيح (عدد صحيح = عدد بدون كسور) ... ما هو الناتج ؟؟
طبعا 99 ,,
لو هنالك طالب اخر حصل على نسبة 98.4 .. نريد التقريب الى العدد الصحيح .. ما هو الناتج ؟؟
طبعا 98 ,,
هل تعرف لماذا ؟؟
لأن 98.8 يوجد في الكسر 8 وهو اكبر من او يساوي الـ 5 ,, اذن نحذفه ونزيد الخانة التي بعده بواحد يعني هكذا
98
+
1
=
99
وكما لاحظنا في 98.4 ... تجاهلنا الـ 4 لأنه اصغر من الـ5 ,,,
لو مثلا احدهم حصل على 89.54 .. ما هو التقريب الى العدد الصحيح ؟؟ الكسر اكبر من او يساوي 5 ... اذن
89
+
1
=
90
هل فهمت الفكرة المبدئية ؟؟ تتوقف على الكسر هل اكبر من او تساوي الـ 5 او لا !!
الان دالة ROUND هي دالة تقريب معقدة بعض الشيء ..
اليك شكلها ... لو اردنا تقريب العدد 549.8874
ROUND(549.8874 , 1)= ???
هنالك مدخلان (2 Parameters ) في هذه الدالة .. المدخل الأول هو الرقم المراد تقريبه .. المدخل الثاني هو الخانة المراد اختبارها !! ... كيف ؟؟
The Coder
30-12-2005, 12:40 AM
اليك الصورة 28
http://img6.picsplace.to/img6/10/28_004.jpg
في الصورة اريدك ان تحفظ الخانات .. فالفاصلة العشرية لا تحسب .. يمين الفاصلة العدد واحد .. ثم اثنين ثم ... الخ
ويسار الفاصلة يوجد صفر , سالب واحد , سالب اثنين ...... الخ
احفظها جيدا .. يمين الفاصلة الأعداد الموجبة .. يسار الفاصلة الصفر والأعداد السالبة !!
انا وضعت الرقم واحد في المدخل الثاني في الدالة ROUND السابقة .. يعني اختبر الخانة بيمين الخانة واحد (اختبر الخانة رقم اثنين)...
سؤال خطير !! ما معنى اختبر ؟؟
يعني اذا كانت اكبر من او تساوي 5 ... اضف واحد للعدد الذي يليه واجعله صفر واجعل الارقام التي يمينه كلها اصفار ...
واذا كانت اصغر من 5 ... اجعله واجعل الارقام التي يمينه كلها اصفار فقط (بدون زيادة واحد للعدد الذي تليه),,
في الصورة الخانة رقم واحد يوجد بها الرقم 8 ....انظرالرقم في الخانة التي بيمينه (الخانة رقم اثنين) .. يوجد العدد 8 ايضا !! ..
هل العدد 8 اكبر من او يساوي الـ 5 ,,, اذن .. نحذف جميع الخانات التي يمين الخانة رقم واحد ... ونزيده بواحد ,,
لم تفهم ؟؟
ROUND(549.8874 , 1 ) = 549.9000=549.9
اختبرنا الخانة الثانية .. (لماذا نختبر الخانة الثانية ؟؟ لاننا ادخلنا واحد ...)
طبعا قلنا انه 549.9000 ثم حذفنا الاصفار في يمين الفاصلة لانها لا تساوي شيئا !!
ROUND(549.8874 , 3) = 549.8870 = 549.887
اختبرنا الخانة الرابعة .. (لماذا نختبر الخانة الرابعة ؟؟ لأننا ادخلنا ثلاثة ... )
ROUND(549.8874 , 0 ) = 550.0000=550
اختبرنا الخانة الأولى ...
كأن المدخل الخاص بالخانات يحدد عدد الكسور .. فمثلا ادخلنا رقم واحد يعني اريد كسر واحد يظهر .. كما في الناتج السابق 549.9
ثم أدخلنا رقم ثلاثة .. يعني اريد ثلاث كسور تظهر كما في الناتج السابق 549.887 !!
ثم أدخلنا رقم صفر .. يعني لا اريد أي كسر يظهر ,,
لو أدخلنا العدد سالب اثنين ؟؟ او سالب واحد ؟؟
اذا سالب اثنين .. نختبر الخانة رقم كم ؟؟ رقم سالب واحد صح ؟؟ لكن مالذي يحدث
ROUND(549.8874 , -2 ) = 500.0000=500
ROUND (549.8874 , -1 ) = 550.0000=550
ROUND(549.8874 , -3 ) = 1000.0000 = 1000
لاحظ في لماذا صارت 1000 ؟؟ الخانة -2 ... يوجد بها خمسة .. صح ؟ اذا اختبرناها فسوف نصفرها مع كل الأعداد بيمينها .. ثم نضيف واحد للعدد الذي يليها .. والذي يقطن في الخانة رقم -3
ماهو العدد في الخانة رقم -3 ؟؟ طبعا صفر ...
يعني كأن الرقم بهذه الصورة : 0549.8874
هل لاحظت الصفر ؟؟ لا قيمة له .. لذا فهو لا يكتب عادة ..
ROUND(549.8874 , -4 ) = 00000.0000 = 0
سالب اربعة ؟؟ نفس الفكرة ..
00549.8874 اختبر الخانة -3 ... وسيصبح الناتج 00000.0000 يعني 0 !!
ارجوا إعادة النظر في هذا الدرس مرة ثانية وثالثة حتى تفهمه ...
الان نريد استخدام الدالة كما ينبغي ...
select round (549.8874,-3) from dual ;
والناتج يصبح ...
ROUND(549.8874,-3)
------------------
1000
تخيل ان المدير (هو نفسه المدير السابق) .... يشكو من حساسية الأعداد في بعض الأحيان ... ,, ويريد ان يرى رواتب الموظفين بشكل سلس ومقبول , لا يهمه الدقة في الرواتب .. ولكن يريد ان يرى الشكل السهل ..
يعني يريدها بهذه النتيجة
ENAME SAL C
---------- ---------- ----------
SMITH 800 800
ALLEN 1600 1600
WARD 1250 1300
JONES 2975 3000
MARTIN 1250 1300
BLAKE 2850 2900
CLARK 2450 2500
SCOTT 3000 3000
KING 5000 5000
TURNER 1500 1500
ADAMS 1100 1100
JAMES 950 1000
FORD 3000 3000
MILLER 1300 1300
العمود C هو الراتب بعد التقريب ,,, (C = اسم مستعار )
هل تعرف مالجملة ؟؟؟
.....
...
.
انتهى الوقت ..
اليك الجملة :
select ename , sal , ROUND(sal,-2 ) C from emp ;
...
انتهت هذه الدالة المملة ...
الدالة :TRUNC
العمل :قص العدد ... مشابهة لـ ROUND
الأمثلة :
هل تذكر عملية التقريب في دالة ROUND؟
في دالة الـ ROUND اذا اختبرنا الخانة .. فنرى احد الاحتمالين :
1- اكبر من او تساوي الخمسة ؟؟ اذن اضف واحد للعدد التالي (التالي =الذي على اليسار) وصفر العدد وكل الاعداد في اليمين
2- اذا كان اصغر من الخمسة , صفر العدد وكل الاعداد في اليمين ...
في الدالة TRUNC .....
لا يوجد الا احتمال واحد .. وهو الاحتمال الثاني
سواء كان اكبر من او يساوي الخمسة .. أو حتى اصغر من الخمسة لا يهم ...
المهم صفر العدد الذي نختبره والاعداد التي في اليمين .. وبدون اضافة الواحد !!
TRUNC (549.8874 , 2 ) =549.88
TRUNC (549.8874 , 1) =549.8
TRUNC (549.8874 , 0) = 549
TRUNC (549.8874 , -1) = 540
TRUNC (549.8874 ,-2)=500
TRUNC (549.8874 , -3) =0
TRUNC (549.8874 , -4) =0
TRUNC (549.8874 , 5) = 549.8874
كأنها (لاحظ كلمة كأنها ) عملية قص للرقم ....
بعض الأحيان هذه الدالة ادق من الدالة السابقة ..
وبعض الأحيان تلك الدالة ادق من هذه ..
select TRUNC (549.8874 ,1) from dual ;
والناتج هو :
TRUNC(549.8874,1)
-----------------
549.8
الان نريد عرض الرواتب بالدالتين .. مرة بالسالب اثنين ومرة بالسالب ثلاثة
select sal , round(sal,-2) A , round(sal,-3) B
,trunc(sal,-2) C , trunc(sal,-3) D from emp ;
انظر الناتج ولاحظ الفروق ,,,
SAL A B C D
---- ---------- ---------- ---------- ----------
800 800 1000 800 0
1600 1600 2000 1600 1000
1250 1300 1000 1200 1000
2975 3000 3000 2900 2000
1250 1300 1000 1200 1000
2850 2900 3000 2800 2000
2450 2500 2000 2400 2000
3000 3000 3000 3000 3000
5000 5000 5000 5000 5000
1500 1500 2000 1500 1000
1100 1100 1000 1100 1000
950 1000 1000 900 0
3000 3000 3000 3000 3000
1300 1300 1000 1300 1000
الدالة :MOD
العمل :دالة باقي القسمة ... من اهم الدوال البرمجية الحسابية ,,,
الأمثلة :
تعلمت في صغرك عملية القسمة ,
1000 قسمة 500 = 2
كبرت قليلا ... وعرفت ان :
1000 قسمة 502 = 1 والباقي 498 ..
وكبرت كثيرا .. وعلمت ان :
1000 قسمة 502 = 1.99203187
ولما وصلت الى هذا السطر .. نسيت مالذي حدث من قبل !! دعني أذكرك ...
لماذا يلزمنا باقي القسمة ؟؟ سوف تعرف ذلك فيما بعد ... وخاصة في البرمجة ,,
اريدك الان ان تعرف ما هو باقي القسمة ....
1000 باقي القسمة على 50 = صفر
50 باقي القسمة على 5 = صفر
50 باقي القسمة على 6 = 2
5 باقي القسمة على 1000 = 5
5 باقي القسمة على 6 = 5
5 باقي القسمة على 5= صفر
0 باقي القسمة على 5 = صفر
هل تذكرت الان ؟
دالة MOD هي دالة باقي القسمة ..
جرب باقي القسمة للـ 6 على الـ 5
select MOD(6,5) from dual ;
لاحظ المدخل الأول والثاني ... اولا الست ثم الخمس ,,
MOD(6,5)
---------
1
نريد باقي قسمة الراتب الاساسي على الراتب الاضافي لكل موظف يملك راتب اضافي ...
select sal,comm,mod(sal,comm) from emp
where comm is not null ;
اليك النتيجة ... تتبعها جيدا ,,
SAL COMM MOD(SAL,COMM)
---- ---------- -------------
1600 300 100
1250 500 250
1250 1400 1250
1500 0 1500
انتهت الدوال الرقمية ...
لاحظ أنني لم أشدد على دالة باقي القسمة كثيرا رغم أهميتها ,’,’,’
.....
سنعود بعد شوية ,,
The Coder
30-12-2005, 12:47 AM
ج- دوال لأغراض التواريخ Date Functions
قبل البدء اريد ان اعرض عليك أسماء الأشهر الإفرنجية لأن أوراكل وللأسف لا تعرف لا شعبان رجب ولا رجب رمضان ,,
يناير , فبراير , مارس , ابريل , مايو , يونيو , يوليو ,أغسطس , سبتمبر , أكتوبر , نوفمبر , ديسمبر
January , February , March , April , May , June , July , August , September , October , November , December
طبعا بالانجليزي احفظهم ,’,’,
الدالة : SYSDATE
العمل :توجد التاريخ الحالي .. طبعا توجده من تاريخ النظام للحاسب الآلي المستخدم لهذه الدالة
الأمثلة :
أخذناها من قبل ... هل تذكر ؟؟
اليك مثال عليها ...
select sysdate from dual ;
وسوف تعرض التاريخ الحالي ... طبعا عرضت لي هذه النتيجة ... وانت ستعرض لك تاريخ يوم استخدامك لها ,,
SYSDATE
--------
29/12/05
الدالة :MONTHS_BETWEEN
العمل :توجد الفرق بين تاريخين ... يعني ندخل تاريخ ثم ندخل تاريخ اخر .. توجد لنا عدد الشهور بينهما !!
الأمثلة :
دالة قوية جدا لإيجاد عدد الشهور بين تاريخين ... يعني ندخل شهر .. ثم ندخل شهر اخر .. واترك الدالة تفرم وتعجن و تصلخ وتجزر ... وفي النهاية تعطينا الفرق بينهما ,,,
يعني مثلا .. ولد احدهم في التاريخ 10/10/1999 م ثم مات رحمة الله عليه في تاريخ 10/11/1999 م
بالله عليك كم شهر مضى من يوم ولادته ؟؟ كم ؟؟
أكيد شهر ,,
اليك المثال مع العلم ان أوراكل تعتبر هذا الشكل "10-10-99" تاريخ .. وتعتبر هذا الشكل "10-10-1999" ايضا تاريخ .. للتاريخ إشكال كثيرة سوف نغطيها .. فلا تقلق ... :
select months_between('10-11-1999','10-10-99') from dual ;
لاحظ في المدخلات Parameters الخاصة بالدالة ان الكبير اولا ثم الصغير ثانيا ... أي ان الأحدث وضعناه اولا ثم الأقدم ثانيا ...
ولاحظ ان احدها على الشكل DD/MM/YYYY (D=day , M=month , Y=year) و الآخر على شكل DD/MM/YY وفوق هذا لا يوجد مشكلة ... جميل جدا ...
اليك الناتج ....
MONTHS_BETWEEN('10-11-1999','10-10-99')
---------------------------------------
1
الناتج يساوي واحد ؟؟ واحد ماذا ؟؟ طبعا واحد شهر ... يعني الفرق بين التاريخين السابقين .. هو شهر واحد ..
نحن وضعنا التاريخ الأحدث اولا صح ؟؟
لو عكسناها ؟؟ هل تقبل الدالة ؟؟ هل ذكية لكي تعرف ذلك ؟؟ لنرى ...
select months_between('10-10-99','10-11-99') from dual ;
MONTHS_BETWEEN('10-10-99','10-11-99')
-------------------------------------
-1
سالب واحد ؟؟
يعني كأنه طرح الكبير من الصغير .... المهم نحن عادة نتجاهل السالب في وصف الفرق بين رقمين ...
يعني في النهاية الفرق شهر واحد ... لا يهمنا سالب .. موجب ... هل فهمت !! تجاهل السالب فقط في إيجاد أي فرق ,,,
طيب ... تعقيد الأمور اكثر واكثر ... احدهم (هو نفسه لكن حصل خطأ في التواريخ ) ولد في التاريخ 10/10/1999 م .. وتوفي رحمه الله في تاريخ 11/11/1999 م ... كم شهر مضى من يوم ولادته ؟؟
شهر ويوم ... صح ؟؟ هل تتوقع ان هذه الدالة ذكية جدا لكي تقول لك .. يا حبيب ألبي الفرق هو شهر ويوم ؟؟
لا .. وألف لا ... سوف تعرض أرقام وكسور
اليك المثال ....
select months_between('11-11-99','10-10-99') from dual ;
ماهي النتيجة ؟؟ ماهو المتوقع !!
نحن قلنا ان الدالة ترجع (ترجع = تخرج) فقط عدد .... وهذا العدد المفترض بأن يكون عدد الأيام !! صح ؟؟
غلط ... بل عدد الأشهر !!
الان كم الأشهر المتوقعة !! انظر الناتج
MONTHS_BETWEEN('11-11-99','10-10-99')
-------------------------------------
1.03225806
تحدي للمحترفين الأذكياء فقط !! .... بالله عليك .. كيف جاء هذا الكسر ؟؟؟
التحدي الثالث هو كيف جاء هذا الكسر ..؟؟ ولماذا جاء ؟؟وما هو هذا الكسر اصلا ؟؟؟؟؟ فسر !!
....
الان اريد عرض كم شهر مضى على الموظفين من تواريخ توظيفهم وحتى الان !!
حتى الان ؟؟ من أين نأتي بتاريخ الحالي ؟؟؟؟
اليك جملة الاستعلام !!
select ename ,months_between(sysdate,hiredate) A from emp ;
والناتج هو ...
ENAME A
---------- ----------
SMITH 300.414125
ALLEN 298.317351
WARD 298.252835
JONES 296.897996
MARTIN 291.059286
BLAKE 295.930254
CLARK 294.672189
SCOTT 224.349609
KING 289.414125
TURNER 291.704447
ADAMS 223.220576
JAMES 288.865738
FORD 288.865738
MILLER 287.220576
جاءك المدير ... (نفس ذلك المعقد ) وقرأ النتيجة السابقة ... وقال لك .. " ما هذا يا مهمل !! لا اعرف ان اقرأ هذه !!!.
لا اريد عدد الشهور ... اريد عدد السنوات !!"
ما العمل ؟؟؟ ما الذي نستطيع فعله في هذه الحالة ؟؟؟ هل تعرف ؟؟
فكر قبل ان تشاهد الحل !! ...
أحب ان أشير الى نقطة .. هو ان 99.99999% منكم ... حسب ما اعتقد... انه يقرأ فقط بدون تفكير ..
هل يجب علي ان أذكرك في كل مثال ان تفكر اولا ؟؟ اعرف انك تحك رأسك الان وسوف تفكر في الحل ...
جميل جدا .....
اليك الحل ..
عدد السنين = عدد الشهور / 12 !!
12 شهر = 1 سنة ... صح ؟؟
24 شهر = 2 سنة ... صح ؟؟
مالذي عملناه ؟؟؟
اخذنا مثلا 24 .. وقسمناها على 12 وصار الناتج 2 ,,
انظر ....
select ename , months_between(sysdate,hiredate)/12 A, hiredate B from emp ;
وانظر الناتج ....
ENAME A B
---------- ---------- --------
SMITH 25.0345137 17/12/80
ALLEN 24.8597825 20/02/81
WARD 24.8544061 22/02/81
JONES 24.7415029 02/04/81
MARTIN 24.2549438 28/09/81
BLAKE 24.6608578 01/05/81
CLARK 24.556019 09/06/81
SCOTT 18.695804 19/04/87
KING 24.117847 17/11/81
TURNER 24.3087072 08/09/81
ADAMS 18.601718 23/05/87
JAMES 24.0721481 03/12/81
FORD 24.0721481 03/12/81
MILLER 23.9350513 23/01/82
نظر المدير .. الى النتيجة ... ثم نظر اليك وكأنه يريد قتلك .... لماذا ؟؟ لأنها مازالت غير سهلة القراءة ..
لا يريد هذه الأرقام بالكسور .. يريدها هكذا .. 25 سنة .. 26 سنة ..... الخ ... مالعمل ؟ فكر فكر فكر فكر ......
خذ الحل ...
select ename, ROUND(months_between(sysdate,hiredate)/12,0)||' years' A from emp ;
النتيجة .... كما يلي ... سهلة القراءة ,,,
ENAME A
---------- ---------
SMITH 25 years
ALLEN 25 years
WARD 25 years
JONES 25 years
MARTIN 24 years
BLAKE 25 years
CLARK 25 years
SCOTT 19 years
KING 24 years
TURNER 24 years
ADAMS 19 years
JAMES 24 years
FORD 24 years
MILLER 24 years
اليك تحدي من نوع خاص جدا ...
بينما كنت اكتب هذه السطور .. واذا بعقلي يخبرني انه يريد عرض نتيجة كهذه !! (من جدول الموظفين ) :
YEARS MONTHS DAYS HIREDATE SYSDATE
----- ---------- ---------- -------- --------
25 0 12 17/12/80 29/12/05
24 10 9 20/02/81 29/12/05
24 10 7 22/02/81 29/12/05
24 8 27 02/04/81 29/12/05
24 3 1 28/09/81 29/12/05
24 7 28 01/05/81 29/12/05
24 6 20 09/06/81 29/12/05
18 8 10 19/04/87 29/12/05
24 1 12 17/11/81 29/12/05
24 3 21 08/09/81 29/12/05
18 7 6 23/05/87 29/12/05
24 0 26 03/12/81 29/12/05
24 0 26 03/12/81 29/12/05
23 11 6 23/01/82 29/12/05
جلست عشر دقائق (عشر دقائق كثيرة هاه ؟؟) في معرفة الحل .. أخيرا تمكنت ^^ ... هل تعرف لماذا تمكنت !!؟؟ لأني أردت ان اعرف ! الإرادة هي أهم شيء ,, والحاجة هي أم الاختراع ,,
طبعا عرض الفرق بعدد السنين ... ولكن بدون كسور هذه المرة ... بل بالشهور والأيام !! مثلا ....
10/10/2000 و 9/9/1999 بينهما سنة .. وشهر ... ويوم .. صح !! هل تعرف كيفية عمل جملة استعلام كهذه ؟؟
لا تتعب نفسك كثيرا .. ولا تحبط نفسك اذا رأيت الجملة ...
ان هذه الجملة ... لا يخرجها إلا ذوي الباع الطويل في البرمجة !! .. وستخرج اعقد منها يوما ما .. قريبا ان شاء الله .. فلا تخف ولا تحزن ,, وعلى فكرة ... من سيطلب منك ذلك غير مديرنا المعقد ؟؟؟ لا اعتقد احد سيفعل ذلك ,,
يعني اذا كنت مبتدأ .. او متوسط ... او حتى خبير في بعض الأحيان .. من الممكن ان لا تتمكن من عملها ..
انظر إليها ... وأريد من هذا التحدي شيء واحد .. تفسير الجملة .. بشكل منطقي ومعقول ,, هل تستطيع ؟؟
وهو التحدي الرابع !!
select TRUNC(months_between(sysdate,hiredate)/12) years
,TRUNC( months_between(sysdate,hiredate),0)-TRUNC(months_between(sysdate,hiredate)/12)*12 months
, TRUNC( MOD(months_between(sysdate,hiredate)*31,31),0) days
, hiredate ,sysdate from emp ;
اكثرت عليكم في هذه الدالة .. ولكن فيها تفكير كثير برمجيا .. لذا احببت ان تفكروا كثيرا ,,
الدالة :ADD_MONTHS
العمل :اضافة عدد من الشهور الى تاريخ ما ,,,
الأمثلة :
اذا اردت ان تعرف كم التاريخ بعد 100 شهر من الان .... مالذي عليك فعله ؟؟
اليك جملة الاستعلام التالية والتي تفيد الى اننا نضيف الى تاريخ توظيف الموظفين 100 شهر ....
select add_months(hiredate,100) , hiredate from emp ;
انظر الناتج
ADD_MONT HIREDATE
-------- --------
17/04/89 17/12/80
20/06/89 20/02/81
22/06/89 22/02/81
02/08/89 02/04/81
28/01/90 28/09/81
01/09/89 01/05/81
09/10/89 09/06/81
19/08/95 19/04/87
17/03/90 17/11/81
08/01/90 08/09/81
23/09/95 23/05/87
03/04/90 03/12/81
03/04/90 03/12/81
23/05/90 23/01/82
اعتقد انها سهلة .... وليست بتلك الصعوبة ...
نريد اضافة 5 سنوات ... مالذي يحدث ؟؟
فكر فكر فكر ....
نظيف 5 * 12 ... يعني 60 شهر .... فكر فيها قليلا ... وانظر الجملة ..
select add_months(hiredate,6*12) , hiredate from emp ;
النتيجة ...
ADD_MONT HIREDATE
-------- --------
17/12/86 17/12/80
20/02/87 20/02/81
22/02/87 22/02/81
02/04/87 02/04/81
28/09/87 28/09/81
01/05/87 01/05/81
09/06/87 09/06/81
19/04/93 19/04/87
17/11/87 17/11/81
08/09/87 08/09/81
23/05/93 23/05/87
03/12/87 03/12/81
03/12/87 03/12/81
23/01/88 23/01/82
سهلة !!
انتهى الدرس هنا .. ولم تنتهي جملة الدوال ....
في الدروس القادمة سنكمل الدوال الاحادية ... ان شاء الله ... ثم المتعددة ....
وسيكون بعدها دروس لدرجة الاحتراف ان شاء الله .. في لغة الSQL
اتوقع 5 دورس ان شاء الله وننتهي من الـ SQL
وحتى ذلك الموعد احفظ الدوال صم !!!
الى اللقاء
The Coder
30-12-2005, 11:20 PM
اوبس ... نسيت ..
التحديات .... اريدكم ان تضعوها في موضوع الاستفسارات ..
والذي لا يستطيع !!
يرسلها لي ,,,
اليك التحدي الأول !!
لو كتبنا الأمر التالي ....
select initcap(upper(lower('HI My friends ^^'))) from dual ;
مالذي سوف ينتج ؟؟؟؟
ولماذا نتج ما نتج ؟؟ مع تفصيل شرحك ,,,,
ارجو منك عدم استخدام البرنامج لمعرفة النتيجة ...
انت اجلس مع نفسك .. وتوقع النتيجة على الورق ,,
وأنا لم اشرح هذا الجزء المهم من الدوال لغرض ما في نفسي ,,
التحدي الثاني ... وهو تحدي للمحترفين فقط !! اكرر للمحترفين ,,...
اريد ان اعرض أسماء الموظفين في عمود
وأريد عرض أسماء الموظفين ماعدا الحرف الأخير مقصوص منه في عمود اخر
وأريد عرض الحرف الأخير من أسماء الموظفين في عمود ثالث !!
يعني اريد الناتج بهذه الصورة :
A B C
---------- - -------
SMIT H SMITH
ALLE N ALLEN
WAR D WARD
JONE S JONES
MARTI N MARTIN
BLAK E BLAKE
CLAR K CLARK
SCOT T SCOTT
KIN G KING
TURNE R TURNER
ADAM S ADAMS
JAME S JAMES
FOR D FORD
MILLE R MILLER
صعب هاه ؟؟
اريد تصعيبه اكثر وأكثر ..
اريد عرضه بهذا الشكل !! :
ALL_OF_THEM
--------------------
SMIT + H = SMITH
ALLE + N = ALLEN
WAR + D = WARD
JONE + S = JONES
MARTI + N = MARTIN
BLAK + E = BLAKE
CLAR + K = CLARK
SCOT + T = SCOTT
KIN + G = KING
TURNE + R = TURNER
ADAM + S = ADAMS
JAME + S = JAMES
FOR + D = FORD
MILLE + R = MILLER
في عمود واحد يدعى all_of_them !!
التحدي الثالث ...
select months_between('11-11-99','10-10-99') from dual ;
ماهي النتيجة ؟؟ ماهو المتوقع !!
نحن قلنا ان الدالة ترجع (ترجع = تخرج) فقط عدد .... وهذا العدد المفترض بأن يكون عدد الأيام !! صح ؟؟
غلط ... بل عدد الأشهر !!
الان كم الأشهر المتوقعة !! انظر الناتج
MONTHS_BETWEEN('11-11-99','10-10-99')
-------------------------------------
1.03225806
تحدي للمحترفين الأذكياء فقط !! .... بالله عليك .. كيف جاء هذا الكسر ؟؟؟
التحدي الثالث هو كيف جاء هذا الكسر ..؟؟ ولماذا جاء ؟؟وما هو هذا الكسر اصلا ؟؟؟؟؟ فسر !!
التحدي الرابع
.. تفسير الجملة .. بشكل منطقي ومعقول ,, هل تستطيع ؟؟
select TRUNC(months_between(sysdate,hiredate)/12) years
,TRUNC( months_between(sysdate,hiredate),0)-TRUNC(months_between(sysdate,hiredate)/12)*12 months
, TRUNC( MOD(months_between(sysdate,hiredate)*31,31),0) days
, hiredate ,sysdate from emp ;
The Coder
04-01-2006, 10:31 PM
بسم الله الرحمن الرحيم
الدرس التاسع
اسم الدرس : جملة الاستعلام select والدوال
نوع الدرس : تطبيقي
صعوبة الدرس : *** من *****
اهميــة الدرس : ****** من ***** (Over)
درجة احتراف لغةSQL المتوقعة بعد هذا الدرس : ** من ***** (مبتدئ متقدم )
الوقت المتوقع منك لفهم الدرس : 11 ساعة (ثلاث ساعات فهم و 8 ساعات تطبيق )
متطلبات تتوفر فيك : التطبيق
المتوقع منك في هذا الدرس :
- اتقان جزء من هذه اللغة 100 %
- اتقان الدوال الاحادية .
- اتقان الدوال المتعددة .
هيا لنؤركل ^^
السلام عليكم
قبل البدء اشير الى انه من الافضل ان تحل الواجبات والتحديات .. وان لا ترسلها لي .. بل اعرضها في موضوع استفسارات الاوراكل ...
لكي يتم المناقشة فيها ....
اخذنا الدوال الاحادية ووصلنا عند الدالة add_months ..
نكمل الدوال الاحادية الصف.... ونكمل بقية الدوال الخاصة بالتاريخ
الدالة :NEXT_DAY
العمل :لو أردت تاريخ الجمعة القادم ... هذه الدالة ستوجد ذلك التاريخ ,,,
الأمثلة :
اريد عرض تاريخ الجمعة القادم ... يعني اقرب يوم جمعة .. تخيل لو اليوم أربعاء .. وتاريخ اليوم 10/10/1960 م (اعرف ان التاريخ قديم) فإن تاريخ اقرب يوم جمعة هو تاريخ بعد بكرة ... يعني 12/10/1960 م .... هل فهمت معنى الجمعة القادم ؟؟
يوم كتابة هذه السطور .. هو يوم الجمعة ... تاريخ 30/12/2005 م ..... اوبس ... غدا سيكون هنالك سنة جديدة .. وانا لا اعلم ... لا يهم ,,,
المهم اريد يوم الجمعة القادم ... بتاريخ كم ؟؟ طبعا يا 6/1/2006 م او 7/1/2006 م ... ربما يكون الشهر الحالي 31 يوم ... المهم لنرى عبر الجملة التالية ..
select next_day (sysdate,'FRIDAY') from dual ;
والنتيجة هي ....
ERROR at line 1:
ORA-01846: not a valid day of the week
اوبس .. لماذا كلمة FRIDAY خاطئة ؟؟
قد تستغرب يا صاحبي .. ولكن النظام الخاص بكمبيوتري عربي !!
لذا .. فإن الجملة يجب ان تكون ...
select sysdate , next_day(sysdate,'الجمعة') from dual ;
والنتيجة هي ...
SYSDATE NEXT_DAY
-------- --------
30/12/05 06/01/06
هل فهمت ^^ ...
مثلا نريد عرض تاريخ الجمعة القادم لتاريخ التوظيف لكل موظف ... هل نشاهد ذلك ؟؟ هيا ..
select hiredate , next_day(hiredate,'الجمعة') from emp ;
والنتيجة ...
HIREDATE NEXT_DAY
-------- --------
17/12/80 19/12/80
20/02/81 27/02/81
22/02/81 27/02/81
02/04/81 03/04/81
28/09/81 02/10/81
01/05/81 08/05/81
09/06/81 12/06/81
19/04/87 24/04/87
17/11/81 20/11/81
08/09/81 11/09/81
23/05/87 29/05/87
03/12/81 04/12/81
03/12/81 04/12/81
23/01/82 29/01/82
ممممم .... الدالة التالية ...
الدالة :LAST_DAY
العمل :توجد تاريخ اخر يوم من شهر ما ,,
الأمثلة :
هل تذكر حينما قلت لك تاريخ الجمعة القادم وكان في 6/1/2006 ؟؟
لماذا لم يكن في 7/1/2006 ؟؟ لان الشهر الحالي .. كان 31 يوما ...
اريد ان اعرف كم عدد ايام الشهر الحالي .. هل صحيح 31 يوما ؟؟؟
select last_day(sysdate) from dual ;
اليك النتيجة
LAST_DAY
--------
31/12/05
.... صح ,,
ممممم .. لا توجد أمثلة في رأسي لهذه الدالة ... ولكن فكر انت لماذا عملت هذه الدالة ...
المهم اعتقد انه يوجد دالتين للتاريخ ... ولكن لما طبقتهم .. لم يستجيبوا معي .... لا اعرف لماذا ولكن ... اعتقد لأن المنهج قديم ؟؟ لا اعرف .. وكأنه يستخدم إصدار قديم للأوراكل ... انسى أمرهما الان ,,,,
د- دوال لأغراض التحويل Conversion Functions
انتهينا من الدوال الحرفية .. والدوال الرقمية .. ودوال التاريخ ...
والان نحن سنغطي دوال مهمة وهي دوال التحويل
وبعدها سوف ننتهي من الدوال الاحادية الصفوف ,,
اريدك ان تعرف الان جزئية مهمة جدا ...
كم نوع من البيانات موجودة في الأوراكل ؟؟ (ما معنى البيانات ؟؟ راجع الدرس الخامس !!)
الان وفي الوقت الحالي ... اريدك ان تعرف ثلاث ..
حرفية (أو نصية )..... و رقمية ..... و تواريخ ,,,
اريدك ان تعرف ان النص = مجموعة حروف .....
الان بالله عليك قلي ... هذا النوع (11/10/1999) ما هو ؟؟؟
تاريخ ؟؟ خطأ !!
نص ؟؟ خطأ !!!
رقم ؟؟؟ خطأ !!!
هذا يا حبيبي من الممكن يكون تاريخ ومن الممكن يكون نص !! لا احد يعرف !!
طبعا مستحيل يكون رقمي .. لأنه يوجد هذا الحرف / ,,
قلنا من قبل ان التواريخ تشبه النصوص .. ولكن النصوص لا تشبه التواريخ !! كيف ؟ انا أخبرك ,,
النص = حروف أبجدية + حروف اخرى + أرقام حرفية !!
لاحظ انه يوجد فرق بين الأرقام الحرفية والأرقام الرقمية ... الأرقام الحرفية للعرض فقط كنص !! اذا لم تفهم .. تجاهل الموضوع الان
المهم ... الحروف الأبجدية .. مثلا بالانجليزي ABC…..abcd….. .....الخ ..
الحروف الأخرى هي مثل / * - + _=)(>&<......... الخ
هل فهمت معنى النص !!
كيف يعرف برنامج الأوراكل ان هذا نص .. وهذا رقم .. وهذا تاريخ ؟؟
بسيطة .. مثلا هذا نص 'abc_545' ,,, كيف عرف ؟ من علامتي التنصيص الأحادية !!
ونفس الفكرة للتاريخ ولكن للتواريخ أشكال معينة ستعرفها الان ...
نرجع الى دوال التحويل ..
أي رقم في الدنيا ... بإمكاننا ان نحوله نص صح ؟؟
أي تاريخ في الدنيا ... بإمكاننا ان نحوله نص صح ؟؟؟
لكن ....
ليس كل نص يصبح رقم .. وليس كل نص يصبح تاريخ !!
سوف تشاهد الدوال وتعرف ما كنت اقصده !!
The Coder
04-01-2006, 10:54 PM
الدالة :TO_NUMBER
العمل :تحويل نص الى رقم ..... بمعنى اخر تحويل الأرقام الحرفية الى أرقام حسابية
الأمثلة :
قبل ان تستخدمها ... هل تتوقع لو ادخلنا النص التالي "SYUTYRE123" هل سيتحول الى رقم ؟
طبعا لا ...
لانه يوجد حروف ابجدية ......
لو ادخلنا النص التالي "7894" هل سيتحول هذا النص الى رقم ؟؟ نعم بالطبع .. سيتحول الى 7894 ,,
اذن يجب ان يكون النص المدخل حروفه ارقام حرفية فقط!!
هل تذكر EMPNO ؟؟ وهو رقم الموظف !!
هل هو نوع رقمي ام حرفي ؟؟
هو نوع رقمي !! يعني لو ادخلنا h456 كرقم للموظف .. فسيعطي خطأ !!
تخيل لو انه نوع حرفي ... هل يصح ؟؟؟ طبعا يصح ,, لأن النصوص بإمكانها ان تكون ارقام فقط !!
الان لو قلنا ...
select job+1 from emp ;
مع العلم ان الـ JOB نوع نصي وليس رقمي .. بالله عليك كم نتيجة عمل+1 = ؟؟؟
خطأ في خطأ !!
كيف نضيف الى العمل الرقم واحد ؟؟؟ النص للعرض وليس للحساب !!
هل عرفت ان هذه حركة غبية ؟؟
لو ان الحقل EMPNO نوع نصي ... تخيل ذلك ...
ونريد ان نعمل بعض الحسابات ... هل نستطيع ؟ طبعا لا ...
الان ..
تخيل لو ان EMPNO حقل نصي (بالخطأ صار حقل نصي )
اريد اعرض أرقام الموظفين جميعهم ولكن مضاف إليها 100 مثلا !! ماذا نعمل ؟؟
نحول حقل EMPNO النصي الى أرقام حسابية ... باستخدام الدالة TO_NUMBER
بدلا ان نقول ....
select empno+100 , empno from emp ;
والتي تعتبر خاطئة اذا ما اعتبرنا ان حقل EMPNO حقل نصي .... نقول ..
select TO_NUMBER(empno)+100 , empno from emp ;
والنتيجة ...
TO_NUMBER(EMPNO)+100 EMPNO
-------------------- ----------
7469 7369
7599 7499
7621 7521
7666 7566
7754 7654
7798 7698
7882 7782
7888 7788
7939 7839
7944 7844
7976 7876
8000 7900
8002 7902
8034 7934
مثلا
اريد ان اعرض معلومات صاحب الرقم 7782 + 6 .... مثلا ,,, ماهي الجملة ؟؟
select * from emp
where empno=7782+6 ;
تخيل لو ان EMPNO حقل نصي (بالخطأ صار حقل نصي ) .. .. هل جملة الاستعلام السابقة صحيحة ؟؟ طبعا لا .. ليست صحيحة !!
ماذا نعمل ؟؟
نحول حقل EMPNO النصي الى أرقام حسابية ... باستخدام الدالة TO_NUMBER
select * from emp
where TO_NUMBER(empno)=7782 + 6 ;
هل فهمت شيء ؟
يعني حول قيمة empno النصية الى قيمة رقمية !! هذا كل شيء ....
لا ارى تلك الأهمية لهذه الدالة ... ولا يوجد لدي في الوقت الراهن أي تطبيقات قوية لها ,,,
الدالة :TO_DATE
العمل :تحول نص الى وقت أو تاريخ ... مع العلم ان النص المدخل يجب ان يكون مكتوب بصيغة معينة
الأمثلة :
قبل البدء اريدك ان تعرف ان ...
Y تعني سنة ... اختصار لـ Year
M تعني شهر ... اختصار لـ Month
D تعني يوم ... اختصار لـ DAY
MI تعني دقيقة ... اختصار لـ Minute
H تعني ساعة ... اختصار لـ Hour
S تعني ثانية ... اختصار لـ Second
طيب ...
الموظف WARD ... لا اعرف متى ولد .. ولكن اعرف تاريخ تعيينه وهو 22 من شهر فبراير من عام 1981 م ....
اذا قلت لك اريد تاريخ الموظف WARD بهذا الشكل ... (اقرأ من اليسار الى اليمين)
DD-MM-YY .....
مالذي تتوقعه ؟؟ هل تعرف ؟؟
يعني هكذا
22-02-81
واذا قلت لك .... اريد تاريخه بهذا الشكل ... (اقرأ من اليسار الى اليمين)
DD/MM/YYYY
كيف نكتبها ؟
نكتبها هكذا :22/02/1981
لاحظ انه لا فرق بين / و بين - فكلاهما لهما غرض واحد ,,
لو اردنا تاريخه بهذه الصيغة ...
MM/SS/YY
فإن التاريخ يكتب هكذا ... 02/22/81
فهمت الفكرة ؟ يعني الفكرة هي التاريخ يجب ان يكون على الشكل المطلوب ....
يعني يجب ان يطابق التاريخ الشكل ... تذكر هذا جيدا !! يجب ان يطابق التاريخ الشكل !!!!
مثل الشكل .. DD/MM فإن التاريخ يكون 22/02
مثلا الشكل MM فإن التاريخ هكذا .. 02 ,,,
الان ... فكر كم شكل للتاريخ ؟؟ ثلاث أشكال ؟ خمس ؟ عشرون ؟؟
صراحة ... كثير ... وبالكيفية التي تريدها !!
تريد الايام ثم السنوات ثم الشهور ....
تريد شهور والسنوات فقط , جرب ما يحلوا لك ....
أحب ان أشير الى نقطة .. انه في بعض الأحيان ... نريد اسماء الشهور و الايام ...
مثلا اريد عرض معلومات الموظف الذي تم تعيينه في يوم الأحد في شهر فبراير في سنة 1981 م ....
أي التاريخ (من الشمال الى اليمين ):
SUNDAY FEBRUARY 1981
فإن الشكل ... هو(من الشمال الى اليمين ) :
DAY MONTH YYYY
DAY يعني يوم ... MONTH تعني شهر ,,,
هل رأيت كيف طابق التاريخ الشكل ؟؟؟
الان نبدأ مع هذه الدالة ...
تحول هذه الدالة نص على شكل معين .. الى تاريخ !!
وحتى الان لا ارى في هذه الدالة .. ودالة TO_NUMBER تلك الأهمية .. ولا اعرف لماذا عملوها اصلا ....
وجدت مثال واحد في منهجين مختلفين !! مثال غبي ...
الان اريد عرض معلومات الموظف الذي تاريخ تعيينه 22/02/1981
select * from emp
where hiredate=to_date('22/02/1981','dd/mm/yyyy') ;
وسوف تعرض نتيجة الموظف WARD الذي تحدثنا عنه قبل قليل ,,
الدالة تأخذ في المدخل الأول التاريخ بشكل نص , والمدخل الثاني شكل التاريخ , يجب ان يكون التاريخ مطابق للشكل ,,
اعتقد ان هذه الدالة .. تفي بالغرض عندما لا اعرف كيف تخزن التاريخ في قاعدة البيانات ..
يعني انا شخصيا .. التواريخ كتبت لي هكذا DD/MM/YY
وفي احد المناهج .. لاحظت ان التواريخ كتبت عنده هكذا DD/MM/YYYY
يعني مثلا اريد عرض معلومات الموظف الذي تعين في : فبراير 22/1981
ولا اعرف كيف تخزن .. فاجبر ان تكون النتيجة بشكل انا ارغبه ... ,,
مثلا الشكل MONTH , DD YYYY
ما جملة الاستعلام اللازمة ؟؟
select * from emp
where hiredate=to_date('February 22,1981' ,'month dd , yyyy') ;
وسوف تعرض معلومات الموظف WARD
وظهرت لي مشاكل .. متعلقة بالعربي والانجليزي ....
فجهازي عربي خالص ... بدل ان اقول February 22,1981 اقول "فبراير 22 , 1981"
وسوف تجد شكلها غبي جدا وغير مرتبة لان الاوراكل ببساطة انجليزي خالص ,,
المهم ... هل تصدق ان المثال السابق هو المثال الوحيد الذي وجدته !!
المشكلة لا تكمن هنا .. المصيبة انه ... بدلا من الجملة ...
select * from emp
where hiredate=to_date('22/02/1981','dd/mm/yyyy') ;
استطيع القول وبدون الدالة ...
select * from emp
where hiredate='22/02/1981';
لماذا هذه الدالة ؟؟؟
هل لأجل كتابة فبراير كاملة ... ام لأجل ماذا ؟؟
في دراستي الجامعية سابقا ... أتذكر ان دكتور مادتنا .. قال لنا "تجاهلوا موضوع التواريخ ... ليست في المقرر"
اعتقد انه رأى عدم أهمية أشكال التواريخ !! ... اعتقد ذلك ,
لذا ... فسوف أتجاهل هذه الدالة ,, وحتى إشعار اخر !!
الان اليك دالة قوية جدا !!
الدالة :TO_CHAR
العمل :تحويل الرقم الى نص .. وتحويل التاريخ الى نص !!
الأمثلة :
لماذا هذه الدالة ؟ لعرض التواريخ والارقام بالأشكال التي نرغبها ,,
لها مدخلان ....(2 Parameters)
المدخل الاول ... يفترض بأن يكون به .. يا رقم .. او تاريخ ...
المدخل الثاني ... يفترض بأن يكون نص !!
اذا كان المدخل الاول رقم .. فسوف يتم تحويله الى نص .....
اذا كان المدخل الاول تاريخ .. فسوف يتم تحويله الى نص ...
- اولا تحويل الرقم الى نص ....
اذا كان المدخل الاول رقم .. فسوف يتم تحويله الى نص .....
رواتب الموظفين على سبيل المثال ستعرض هكذا ...
1000
3500
90000
1000000
صح ؟
اريد عرضها هكذا ..
$1000
$3500
….
او ... اريد عرضها هكذا ...
1000.00
3500.00
…..
او اريدها هكذا ....
$1,000
$1,000,000
….
او هكذا ...
$1,000.00
$1,000,000.00
لاحظ الفرق بين الفاصلة العشرية (النقطة)والفاصلة الكتابية (التي شكلها هكذا , )
أو اريد اعقد شكل وهو ..
$00,001,000.00
$00,003,500.00
$01,000,000.00
هل شاهدت هذا التعقيد !!
بل اريدها اربع ارقام يمين الفاصلة العشرية !!
$00,001,000.0000
$00,003,500.0000
$01,000,000.0000
مالذي اعمله ؟؟
باستخدام دالة تحويل الارقام الى نص .. نستطيع ان نعمل هذه الاشكال ...
اسمعني جيدا .. في هذه الدالة لا تستطيع ان تضع الا ثلاث حروف ,’,’,’,’,’,’,’
النقطة وهي الفاصلة العشرية
والفاصلة الحرفية
و علامة الدولار $
فقط !!
اريد ان اعرض الرواتب على هذا الشكل ...
$1000
$3500
$10000
لاحظ الراتب الاخير .. زائد بخانة عن بقية الرواتب ...
وهو اكبر الرواتب صح ؟؟
بالله عليك توقع معي .. كم اكثر عدد للخانات ؟؟
5 خانات .. وهو يمثل عدد خانات اكبر راتب ... 10000
اذن انظر جيدا كيفية استعمال الدالة ...
select to_char(sal,'$9999') from emp ;
اوبس !! ... ماهذه التسعات ؟؟ ولماذا ؟؟
معنى $9999 أي اعرض لي الراتب sal على هذه الصيغة ...
يعني لو 1000 اجعلها $1000
طيب لو 500 اجعلها $500 كما هي
طيب لو 1 اجعلها $1 كما هي ,,,
طيب لو 10000 هنا يظهر خطأ .... ولن تعرض شيء .. لماذا ؟؟ لأننا وضعنا 4 تسعات .. أي اربع خانات فقط
والعشرة الاف خمس خانات !! فيجب الحذر ,,
اليك النتيجة ^^
TO_CHA
------
$800
$1600
$1250
$2975
$1250
$2850
$2450
$3000
$5000
$1500
$1100
$950
$3000
$1300
The Coder
04-01-2006, 10:58 PM
طيب ... اريد وضع ارقام كسرية ... ولتكن .. ثلاث خانات !!
يعني بهذا الشكل
$1000.000
$3500.000
$500.000
مالذي اعمله ؟؟
بسيطة ..
select to_char(sal,'$9999.999') from emp ;
هل رأيت الفاصلة العشرية ؟؟ هل رأيت كم تسعة وضعناها ؟؟
يعني لو الراتب 1 اجعلها بهذا الشكل $1.000 هل فهمت ؟؟
TO_CHAR(SAL, '$9999.999')
----------
$800.000
$1600.000
$1250.000
$2975.000
$1250.000
$2850.000
$2450.000
$3000.000
$5000.000
$1500.000
$1100.000
$950.000
$3000.000
$1300.000
لو كان لدينا شخصين .. راتبهما كما يلي ...
500.5 خمس مئة ونصف دولار
20.25 عشرون و ربع دولار ,,
كيف ستكون النتيجة ؟؟
ستكون هكذا !!
$500.5
$20.25
ستعرض عادي .. كما هي ,,,
اريد ان اعقد الامور كعادتي ..
النتيجة السابقة ليست مرتبة ....
النتيجة السابقة شكلها هكذا ..
$1000.000
$500.000
$1.000
انا لا اريدها هكذا ...
اريد على هذا الشكل ....
$1000.000
$0500.000
$0001.000
هنا ... نضع الأمر هكذا ...
select to_char(sal,'$0000.000') from emp ;
فبدلا من تلك التسعات .. وضعنا اصفار !!
ما معنى التسعات وما معنى الاصفار ؟؟
رأينا كيف يكون في التسعات لو ان الراتب 1000 فسوف يكون شكله هكذا 1000.000
ولو كان الراتب 1 فان شكله يكون هكذا 1.000
الاصفار لها رأي اخر ... ففي جملة الاستعلام السابقة (الاخيرة).... لو جائنا راتب 1000
فإن شكله يصبح 1000.000 ولو ان الراتب 1 فإن شكله 0001.000 هل فهمت !!
طيب ... لكي اتأكد من انك فهمت ..
لماذا 0001.000 ؟؟ لماذا لم تكن 00000001.000 ؟؟
هل تعرف ؟؟
لا تعرف !!!!
انا اخبرك .... لأننا وضعنا اربع اصفار كأني اقول ... اجعلها اربع خانات !! هل فهمت ؟؟
لو كان لدينا شخصين .. راتبهما كما يلي ...
500.5 خمس مئة ونصف دولار
20.25 عشرون و ربع دولار ,,
كيف ستكون النتيجة ؟؟
ستكون هكذا !!
0500.500$
0020.250$
اوه نسيت عرض النتيجة الخاصة باخر جملة استعلام
TO_CHAR(SA
----------
$0800.000
$1600.000
$1250.000
$2975.000
$1250.000
$2850.000
$2450.000
$3000.000
$5000.000
$1500.000
$1100.000
$0950.000
$3000.000
$1300.000
لا اعرف هل عرضت بشكل متساوي ام لا , ولكن اذا كنت من النوع الذي يطبق معي .. فسوف يشاهدها بوضوح مع برنامج SQL PLUS !!
هل عرفت الان الفرق بين الاصفار والتسعات ؟؟ اعتقد واضحة !!
اريد عرض النتيجة التالية وهي اعقد جملة على الاطلاق !!!!!
$1,000,000.00
$0,001,000.00
$0,000,500.00
هل تعرف هذه الفواصل !! فرق بينها وبين الفواصل العشرية ,,
هذه الفواصل نشاهدها في المبالغ الكبيرة في البنوك ,,,
نريد ان نعرض رواتب الموظفين كما في النتيجة السابقة ... ماذا نعمل ؟؟
عادي ...
select to_char(sal,'$0,000,000.00') from emp ;
انظر انظر ... عادي جدا ...
TO_CHAR(SAL,'$
--------------
$0,000,800.00
$0,001,600.00
$0,001,250.00
$0,002,975.00
$0,001,250.00
$0,002,850.00
$0,002,450.00
$0,003,000.00
$0,005,000.00
$0,001,500.00
$0,001,100.00
$0,000,950.00
$0,003,000.00
$0,001,300.00
تحدي .... تحب التحديات ؟؟
لا تحبها ؟؟؟
سواء احببتها ام لم تحببها .. اليك اول تحدي !!
التحدي الاول ...
تخيل انه يوجد موظفين ارصدتهم في البنك مايلي ..
10.25 عشرة دولارات وربع ...
20.5 عشرون دولار ونصف ...
1000000.945 مليون دولار وتسع مئة وخمسة واربعون من العشرة ...
يوجد جدول يدعى بـ BANK مثلا .....
اريد عرض النتائج بهذه الصورة
$0,00,00,10.25
$0,00,00,20.5
$1,00,00,00.945
وهلم جر !!
ركز !! ... لماذا تركت هذا تحدي ؟؟ فكر جيدا ,,
-ثانيا .. تحويل التواريخ الى نصوص ,,
اذا كان المدخل الاول تاريخ .. فسوف يتم تحويله الى نص ...
المدخل الثاني ... له بعض الكلمات المحجوزة ... كلمات محجوزة يعني ... كلمات محددة لو وضعتها فهي صحيحة ..
اذا وضعت غيرها ... فسوف يأتيك خطأ !!
لذا ... تذكر الكلمات المحجوزة ,,,, وهي كثيرة ...
منها النقطة ومنها الفاصلة ومنها النقطتين : ومنها الـ /
ومنها الخاصة بالايام والشهور والسنوات والساعة والثانية والدقيقة ... وغيرها ,,,
اتينا الى دوخة قصص التواريخ ,,
اريد عرض تاريخ التعيين للموظفين .. بهذا الشكل .. :
TEUSDAY OF NOVEMBER 1981 IN 12:00:00 AM
يعني ...
الثلاثاء من شهر نوفمبر في عام 1981 في الساعة 12:00:00 صباحا !!
لم ندقق في الوقت .. بالرغم من أهميته !!
في الحقول التي من نوع تاريخ ... يجب ان يحتوي هذا التاريخ على وقت مصاحب له !!
يعني .. الحقل hiredate من نوع تاريخ ..... وليس من نوع نصي !!
نتوقع من الحقل hiredate ان يحتوي على وقت !! .... هل فهمت ؟؟
الان اريد عرض أوقات تعيين الموظفين .... اريد الساعات:الدقائق:الثواني ....
تذكر ان H يعني ساعة و MI يعني دقيقة .... و S تعني ثانية !!
و أريدها بنظام 12 ساعة وليس 24 ساعة !!
اليك جملة الاستعلام ...
select to_char(hiredate,'HH:MI:SS') from emp;
لا تسأل لماذا HH وليست H !!
وهي تعني خانتين للساعات .!!! ونفس الشيء للثواني والدقائق ..
هنا في هذا المثال ... الكلمات المحجوزة .. هي HH و : و MI و SS
TO_CHAR(
--------
12:00:00
12:00:00
12:00:00
12:00:00
12:00:00
12:00:00
12:00:00
12:00:00
12:00:00
12:00:00
12:00:00
12:00:00
12:00:00
12:00:00
هل شاهدت ذلك !! ...
عمود hiredate والذي كنا نعتقد انه للتاريخ ... يحتوي على وقت ايضا !!
طيب .... حل اخر ... بنفس الفكرة ...
select to_char(hiredate,'HH12:MI:SS') from emp;
مالفرق بينه وبين السابق ؟
وجود 12 بجانب الـ HH وهو يشير الى نظام الـ12 !!
صراحة كلاهما نفس المعنى .. ويشيران الى نظام الـ12 ساعة !!
الدالة هذه ... لها مدخلين .. تأتي وتنظر الى المدخل الاول ... ياسلام .. هل رقم ام تاريخ ؟؟
اذا رقم .... تنظر الى المدخل الثاني .. ويجب ان يحتوي على 0 او 9 او فاصلة عشرية او فاصلة عادية او الـ$ فقط !!
اذا تاريخ .. تنظر الى المدخل الثاني ... يجب ان يحتوي على احد رموز السنوات او الايام او الساعات او أي رمز !!
اذا اردنا عرض نظام الـ 24 ساعة !! ,,, ماذا نعمل ؟؟
الذي لا يفهم في هذه النظامين أقول له ..
يا سيدي .... اتق الله في نفسك .. وحاول ان تفهم الان ....
نظام الـ12 ساعة .... هو من 1 الى 12 ... وتعيد الكرة .... من 1 الى 12 !!
يعني توجد الساعة واحدة صباحا ... وتوجد الساعة واحدة ليلا !!
اما في نظام الـ24 ساعة .. فهي من 1 الى 24 !!
يعني توجد في نظام الـ24 ..... الساعة 13 (نفس الساعة الواحدة صباحا بنظام الـ12).... وتوجد الساعة 1 ليلا !!
طيب .. الساعة التاسعة ليلا .. كم ؟؟؟ أي الساعة 21 !!
طيب التاسعة نهارا ؟؟ أي الساعة 9 !!
الساعة الحادية عشر ليلا .. كم ؟؟ أي الساعة 23 !!
الساعة الثانية عشر ليلا .. كم بالنظام 24 ؟؟ أي الساعة 00:00:00
أي الساعة صفر ..... هل فهمت !! لم تفهم ؟؟؟ اركب الطائرات كثيرا ... فسوف تجدهم يستخدمونها !! او اشتري ساعة الكترونية (كما اشتريتها انا حينما كنت طفلا !! ... فهمت هذا النظام وقتها !! ).... وستفهمها .. صدقني !!
على فكرة ...في نظام الـ12 ساعة ....
الساعة الثانية عشر ليلا ... يقولون عنها انها الثانية عشر صباحا !! ... والساعة الواحدة صباحا
هل تذكر قديما .. قبل سنين ... اخر جملة استعلام كتبناها ؟؟؟
انظر اليها ؟؟ وانظر الى نتيجتها .....
كانت النتائج هكذا ...
12:00:00
...
..
.
الخخخخ ....
بالله عليك .. هل 12 صباحا ام مساء ؟؟
وما أدرى مديرك .... لما يرى النتيجة .. هل بنظام الـ24 ساعة ام بنظام الـ 12 ساعة ؟؟
لا احد يعلم ....
هل تريد الحل ؟؟ لا تعرضها 12:00:00 وحسب !!
اعرضها هكذا
12:00:00 AM
او
12:00:00 PM
يعني بالعربي ... 12:00:00 ص أو 12:00:00 م
ماذا نعمل ؟
اليك جملة الاستعلام هذه ..
select to_char(hiredate,'HH:MI:SS AM') from emp;
هل شاهدت الـ AM لا تعني AM فقط ... بل تعني اعرض لي ... ما اذا كان صباحا ام مساءا (AM OR PM)
طبعا النتيجة المتوقعة هي ...
12:00:00 AM
او
12:00:00 PM
على حسب ....
وبما ان ساعة النظام الخاصة بجهازي ... عربي .... فسوف تعرض لي انا ... ومن هم على شاكلتي .. هذه النتيجة
12:00:00 ص
او
12:00:00 م
المهم ... نريد عرض الوقت بنظام الـ 24 ساعة .... كيف ؟
هل تعرف ؟؟ بسيطة ..
elect to_char(hiredate,'HH24:MI:SS') from emp;
مثال ...
حصلت جريمة في وقت تعيين احد الموظفين ... الجريمة كانت ليلا !! .... اريد ان احصر عدد الموظفين الذين تعينوا ليلا !! .... ماذا اعمل ؟؟ لا يهمني الساعة .. بل يهمني ليلا ام نهارا ؟؟
يعني اريد عرضها بهذا الشكل ...
A ENAME
- ------
AM SMITH
AM ALLEN
AM WARD
PM JONES
PM MARTIN
AM BLAKE
AM CLARK
AM SCOTT
AM KING
AM TURNER
AM ADAMS
AM JAMES
AM FORD
AM MILLER
من النتيجة يظهر تورط مارتن وجونس !!
المهم ... ما هي الجملة ؟؟
select to_char(hiredate,'AM') A,ename from emp ;
هل شاهدت ذلك ؟؟
ما معنى AM في المدخل الثاني ؟؟
هل معناها صباحا فقط ؟؟ لا !!
الدالة ... ترى .... في المدخل الثاني AM ..
وتقول ... "ممممم ... يوجد AM في المدخل الثاني ؟؟ اذن هذا المستخدم يريدني ان اعرض له صباحا ام مساء !! "
هل فهمت الفكرة ؟؟
انا متأكد ان هنالك من لم يفهم .. وأغلق الدرس كله ...
The Coder
04-01-2006, 11:15 PM
اليك مثال .. فيه تلاعب في الطريقة هذه ....
طيب .. لا اريد عرض الساعات : الدقائق : الثواني
اريد عرض الدقائق : الثواني : الساعات ثم صباحا ام مساء ...
واو .. ملخبطة ... ولكنني اريد عرضها بالشكل السابق !!
ماذا اعمل ؟
اليك الجملة ....
select to_char(hiredate,'MI:SS:HH AM') from emp ;
هل فهمت !!
نريد التعقيد اكثر و اكثر .... !! ..
لا اريد عرض الدقائق والثواني ... يهمني عرض الساعات و الايام فقط لا غير ...
يعني على هذا الشكل !! (اليوم .. والساعة)
الاحد 12
الثلاثاء 10
الاثنين 6
اليك الجملة !!
select to_char(hiredate,'DAY HH') from emp ;
معنى DAY أي اعرض لي اليوم ماهو .... والساعة .. لتاريخ تعيين الموظف !!
كل مافي الفكرة يا ناس ... ان الدالة تشاهد المدخل الثاني .... وترى ..
اذا DAY حولته الى اليوم .. بالنطق !!
اذا dd حولته الى اليوم بالرقم ...
اذا mm حولته الى الشهر بالرقم
يعني .. احفظ بعض المصطلحات ... واكتبها في المدخل الثاني .. وسوف تحولها الدالة ... هذا كل شيء !!
اليك مثال معقد جدا .... وهو اعقد مثال في هذه الدالة ..... ان فهمته .. فستفهم كل ما سبق !!
اريد عرض تواريخ التعيين للموظفين على هذه الصورة !!
TEUSDAY OF NOVEMBER 1981 IN 12:00:00 AM
هل شاهدت كلمة OF و كلمة IN ؟؟؟
كيف نعرضها ؟؟
اليك الجملة ... واذا لم تفهمها ... فسوف اعرض لك مثال اخر واخير ....
select to_char(hiredate,'DAY "OF" MONTH YYYY "IN" HH:MI:SS AM') from emp ;
هل شاهدت كلمتي OF و IN ؟؟
وضعناها بين علامتي تنصيص ثنائية وكأني اقول .. اعرض هذه الكلمة كما هي عليه
.. اذا لم تفهم .. فلا تقلق ... فانا اعتبره مستوى شبه متقدم .... بالرغم من سهولتها ...
الفكرة .... هي ما تكتبه في المدخل الثاني ... سواء يوم شهر .. سنة ... صباح ام مساء !! .. فسوف يعرض لك بالكيفية التي كتبتها ..
اليك مثال اخير ...
اريد ان اعرض وقت وتاريخ اليوم ... الحالي !!
ماذا اعمل ؟ اريدها بهذه الصيغة
TODAY … IS SUNDAY OF JANUARY … AND THE TIME IS 02:58:05 PM
أي
اليوم .. هو الاحد من يناير .. والوقت هو 02:58:05 مساء .....
اذا كنت تحب التحديات .... فهو تحدي لك ... ولكن اجابته بالاسفل !!
جرب نفسك .. وواجه نفسك .... حاول كتابتها .. ارجع واقرأ الدرس من جديد ....
يجب ان تكتب الجملة بنفسك ..
انا لم اضع الجملة الا لمن لم يفهم ...
انظر الاجابة .. وكلي ثقة بأنك فكرت فيها ... سواء عرفتها ام لم تعرفها !!
select to_char(sysdate,'"TODAY... IS" day "OF" month "...AND THE TIME IS" hh:mi:ss am') from dual ;
لن اعرض النتيجة ... ولكن ..... اذا لم تفهم .... اطرح أسألتك في موضوع الاستفسارات !!
وعلى فكرة ... قصدي من هذا التلاعب ليس الـ SQL فقط !!
بل سوف تنفعنا كثيرا في المستقبل ..... ثق بي .. الدالة to_char رهيبة !!
كل الامر هو ان المدخل الثاني به بعض الكلمات المحجوزة ... احفظها واستخدمها فقط !! هذا كل شيء !!
واذا اردت مثلا اليوم .. اكتب DAY في المدخل الثاني ... واذا اردت الشهر ... اكتب MONTH وهكذا !!!
اشير الى بعض النقاط والتي اعتبرها زيادة ولكن يجب عدم اغفالها اذا كنا نعمل تحت قطاع يهتم بالتواريخ ومفاهيمها ..
- من الممكن ان لا تعرض لك هكذا ...
Sunday January
بل تعرض مختصرة في بعض الاحيان ...
Sun Jan
لعرض اليوم مختصر ... لا تكتب day في المدخل الثاني .. بل dy
اما الشهر ... MON وليس MONTH
- من الممكن ان نعرض السنة ... بالنطق ... وليست بالارقام ... مثلا الفين وستة .. بدلا من 2006
وذلك بكتابة year بدلا من yyyy
- من الممكن ان اعرض تاريخ اليوم .. بدلا من 26 ... اقول السادس والعشرون ...
- من الممكن عرض السنوات ما اذا كانت سنة كبيسة ام لا ...
باختصار ... مسئلة الوقت والتاريخ ... مسئلة معقدة وكبيرة قليلا ...
اريد تعليمك الـ SQL وليس التواريخ و الأوقات !!
وايضا تحويل الارقام الى نص باستخدام هذه الدالة .. فيها شغل كثير .. سوف نتطرق اليها فيما بعد في لغة الـ PLSQL ان شاء الله اذا احتجناها ... اكرر .. اذا احتجناها !!
لكي ابري ذمتي .. عملت أمثلة على أهم النقاط التي واجهتني في تحويل التاريخ الى نص ....
اولا السنين ,,
select to_char(sysdate , 'yyyy year YEAR Year y,yyy yyy yy y ') from dual ;
النتيجة سوف تكون مثل هذه ..
2006 two thousand six TWO THOUSAND SIX Two Thousand Six 2,006 006 06 6
حيث ان yyyy تعني 2006
وان year عرض السنة كتابة .. ولكن بحروف صغيرة ...
وان YEAR نفس السابقة بحروف كبيرة
وان Year سيكون اول حرف كبير ...
وان الـ y,yyy ستعرض السنة 2.006
وان الـ yyy ستعرض السنة هكذا 006
وان الـ yy ستعرض السنة 06
وان الـ y ستعرض السنة 6
لاحظ ان النقطة (الفاصلة العشرية) ... والفاصلة العادية ... والـ / بامكاننا ان نضعها ولن يحدث خطأ ..
الان مع الأشهر ,,,,
select to_char(sysdate ,'MONTH month Month mon mm RM ') from dual ;
سوف تكون النتيجة بهذه الصورة ...
JANUARY january January jan 01 I
حيث ان MONTH عرض الشهر بحروف كبيرة ...
وان month عرض اسم الشهر بحروف صغيرة
وان Month عرض اسم الشهر بحرف كبير اولا ثم حروف صغيرة
وان mon عرض اول ثلاث حروف من الشهر ... طبعا بحروف صغيرة .. لو كتبنا MON فسوف تعرض بحروف كبيرة ..
وان mm فسيعرض الشهر رقما ... أي 01
وان الـ RM سيعرض الشهر بالحروف الرومانية ... أي I
لو الشهر اثنين فسوف يعرض بالحروف الرومانية II
لو ثلاثة .. III
لو اربعة . IV
لو ثمانية VIII
لو عشرة X
وهكذا ....
The Coder
04-01-2006, 11:42 PM
الان دارت الايام ,,,
select to_char(sysdate,'day DAY Day dy ddd dd d ') from dual ;
سوف تعرض النتيجة بهذا الشكل .... (على سبيل المثال)
Sunday SUNDAY Sunday sun 058 04 2
معنى ..
day أي عرض اسم اليوم بحروف صغيرة ..... sunday
DAY عرض اسم اليوم بحروف كبيرة .. SUNDAY
Day عرض اسم اليوم بالحرف الاول كبير وبعده صغيرة ...Sunday
dy عرض اول ثلاث حروف من اسم اليوم sun .. لو كانت Dy فستعرض Sun ولو كانت DY فستعرض SUN
ddd سوف يعرض اليوم من السنة ... يعني ان في السنة 365 يوم تقريبا ... ففي التاريخ الحالي ... اليوم كم من السنة الحالية ..... ؟؟
dd عرض اليوم من الشهر .. يعني 04 من شهر يناير مثلا !!
d عرض اليوم من الاسبوع ... يعني اذا سبت .. فهو واحد .. اذا احد كمثالنا هذا .. فهو اثنين ... اذا الاثنين . فهو ثلاثة ..
اذا جمعة فهو سبعة !!
بعض المتفرقات ....
select to_char(sysdate,'AM A.M. CC WW W ') from dual ;
AM عرفنا ماهي ..
A.M. نفسها ولكن ستعرض النتيجة يا A.M. او P.M. يعني بالنقاط
CC تعني نحن في القرن كم ^^ ؟؟؟؟ طبعا سوف يكتب لك في النتيجة 21 .. أي القرن الواحد والعشرون
WW هو الاسبوع من السنة .. يعني كم هو الاسبوع من السنة ؟؟
W الاسبوع من الشهر , يوجد في الشهر اربعة اسابيع تقريبا .. يعني لو الاسبوع الاول من شهر يناير .. يكتب واحد ...
لو الاسبوع الثالث من الشهر ... يعني حيكتب ثلاثة
مثال اخير ......
تخيل ان التاريخ اليوم هو .... 03/01
مثلا ....
اريدها هكذا ... ثلاثة / واحد
او اريدها هكذا .. الثالث من هذا الشهر .. 3rd
او اريدها هكذا ... الثالث ... third
كيف ؟؟
select to_char(sysdate,'ddsp/mmsp "or" ddth/mmth "or" ddspth "from" mmspth "month" ') from dual ;
النتيجة ...
three/one or 03rd/01st or third from first month
كل ما فعلته ...
انه أي رقم ... مثلا dd يحضر لي رقم الايام ... الحقته بحرفي sp (اختصار ل spell وهو النطق) لكي يقول ثلاثة بدل من 03
نفس الشيء مع الـ mm
الحقت الحرفين th بـ dd و mm لكي يعرض لي الترتيب ..
يعني بالانجليزي .. الاول 01st والثالث 03rd والرابع 04th وهكذا ,,,
اذا اردت نطق + ترتيب ؟؟
النطق = sp
الترتيب =th
اذن ... dd+sp+th فتساوي ddspth يعني الله لا يهينك ... انطقلي ترتيب اليوم ...
وهو الثالث ... third
ونفس الشيء مع الشهر .. mmspth وهو الشهر الاول ...
طيب ...
مارأيك في كلمة month لماذا لم تتحول الى الكلمة january ؟؟؟
لماذا ؟؟
ركز ركز ركز ؟؟
الم نقل انها سوف تتحول الى الشهر ؟؟
لماذا لم تتحول هنا ؟؟
التحدي الثاني يقول ...
select to_char(sysdate,'ddsp/mmsp "or" ddth/mmth "or" ddspth "from" mmspth "month" ') from dual ;
يوجد كلمة month ... الم يكن من المفترض ان تتحول الى شهر ؟؟؟
النتيجة كانت هكذا .....
three/one or 03rd/01st or third from first month
لماذا لم تتحول كلمة month الى الشهر في تاريخ sysdate أي لماذا لم تتحول الى January مثلا ؟؟؟
واخيرا انتهينا من الدوال الاحادية الصف ,,
ولكن تذكر هنالك مشاكل معك ومع الدوال .. (درس في علم النفس ....)
مشكلة النسيان !!
الحفظ !!
سوف تحفظها الان .. وتنساها غدا ...
لا تخف ... لقد وضعت لك ... جداول وصور ... تلخيص بسيط لها ... اذا نسيتها .. فقط .. اذهب الى هذه الجداول .. والصور ... واقرأها .. اذا لم تفهم نقطة فيها .. راجع شرحي لها ....
تعود ان تلخص بطريقتك ... تسمى هذه الطريقة .. بطريقة الفهرسة !!
يعني .. اكتب عناوين الدروس فقط ... في جدول واحد .. كأنك تعمل فهرسة لأي مادة ....
وانا لا اقصد فقط الأوراكل .... بل كل المواد ...
هل تحس الان .. انك ضائع مشتت بين الدوال ؟؟
هل تحس انك فاهم ولكن ... ملخبط ؟؟
هل تحس انك .. حاسس ان تعبك كله راح .. بالرغم من انك فاهم ؟؟
الحل الفهرسة كما أسلفت !!
حتى عندما ترجع الى الدروس القديمة .. لا ترجع الى الكتاب !! بل ارجع الى فهرستك انت .. التي صنعتها ...
سوف تقرأها .. وتقول .. "نعم نعم .. افتكر هذه النقطة جيدا ... " سوف تذكر كل شيء .... حتى لو لم تكن مكتوبة في الفهرسة والتلخيص الخاص بك ..
مهارة الفهرسة ... تعلمتها انا شخصيا من كتاب علم نفس ...
اعتقد اسم الكتاب "كيف تضاعف ذكائك " ... اعتقد ....
.. ذكر في الكتاب انه من اقوي التكنيكات .... الفهرسة !! وهي تلخيصك انت !! بطريقة الفهرس !!
بإمكانك ان تكتب بعض الرموز لو أردت او بعض التلميحات .. فهي مفيدة جدا ...
تذكر ان تعملها بنفسك انت ... لكي تفهمها انت .... وفقط انت !!
مشكلة الاستحضار !!
("")هل انتهت المشاكل ؟؟ لا لا ... لم تنتهي ..
انت الان حافظ وفاهم .. وعملت الفهرسة كما يجب ....
واذا بأول سوال في الاختبار ..لاتعرف ان تحله !! لماذا ؟؟ لأنك لا تعرف مالذي ستستخدمه !! هل الدالة الفلانية .. هل بدون دالة ؟؟ هل وهل وهل ؟؟؟ لا تعرف ....
اذا حفظت الدوال .. لا تحفظها فحسب ... احفظ لماذا صنعوها !!
لماذا هي موجودة !!
لماذا استخدمها ومتى ؟؟
وهي تسمى الاستحضار ... يعني لو أردت منك جملة ما ... فسوف تقول في نفسك ...
"اووووه ... ماذا استخدم ماذا استخدم ماذا استخدم ؟؟؟؟؟ "
وهي مشكلة بحد ذاتها ...
مع التمرس ... سوف تحل هذه المشكلة أوتوماتيكي ... وهو ان "تواجه المشكلة "...
كان معلمي الهندي يقول دائما .."Face the problem … you people want every thing free "
.. لكن حل التمرس هذا .. يحتاج لجهد ... بالرغم من قوته !!
لو قرأت دروسي .. تخيل وتذكر .. وتصور و أعصر مخك ... لماذا هذه الدالة ؟؟ ولماذا صنعوها ؟؟ ومتى استخدمها ؟؟
هكذا .. حتى لو لم تتمرس كثيرا .. فسوف تعرف متى تستخدمها !!
ولكن يبقى التمرس سيد الموقف !!
...
اشير الى انني عصر يوم كتابتي لهذا السطور الاخيرة ....
اكتشفت لماذا عملوا to_date
هل تذكر انني تركت دالتين لاغراض التواريخ ؟ كانت تحدث معي مشاكل ...
والان عرفت ماهي المشاكل ....
وعرفت ان حلها هي الدالة to_date !!
قبل ان ابدأ التلخيص ... فسوف اعرض لك ... هذه الدالتين ...
الدالة :ROUND
العمل :تقريب !
الأمثلة :
هل تعتقد انني أخطأت ؟؟؟
هل تعتقد انك تذكر هذه الدالة ؟؟
نعم تذكر ... وهي دالة تقريب الاعداد ...
فهي دالة لتقريب التواريخ ايضا !!
بس بطريقة أسهل ..... من تقريب الأعداد ,,
لو ان التاريخ الحالي 03/01/2006
بالله عليك ... بالنسبة للسنة ايهما اقرب .. 2006 ام 2007 ؟؟
طبعا 2006
بالله عليك .. بالنسبة للشهر .. ايهما اقرب .. الشهر الاول .. ام الشهر الثاني ؟؟
طبعا الشهر الاول
كيف ؟؟
التاريخ 03/01/2006
على مستوى السنة ... هل التاريخ الحالي ... اقرب الى 01/01/2006 ام اقرب الى 01/01/2007 ؟؟
أين ننظر يا اصحاب العقول الرزينة ؟؟ في الايام ؟؟ في السنوات ؟ لا ... في الاشهر ..
يعني لو قلت لك على مستوى السنة ... فاننا ننظر في الاشهر ....
الشهر الحالي هو واحد !! لو كان الشهر هو الشهر السادس فأقل (يعني الشهر السادس او الخامس او الرابع .. او الاول )
فهذا يعني انه قريب من السنة الحالية ... وهي 2006
ولو ان الشهر الحالي هو سبعة .... فما فوق .. فهذا يعني انه قريب من السنة القادمة .. وهي 2007
فهمت ؟؟
على مستوى الشهر .... هل التاريخ الحالي (03/01/2006) اقرب الى 01/01/2006 ام اقرب الى 01/02/2006 ؟؟
أين ننظر يا اصحاب العقول الفطنة ؟؟ في الاشهر ؟؟ في السنوات ؟؟ لا ... في الايام
ركز ...
يعني لو قلت لك على مستوى السنة .. تنظر في الاشهر ..
ولو قلت لك على مستوى الاشهر .. تنظر في الايام !! بسيطة صح ؟
اذن اليوم هو الثالث ...
اذا كان اصغر من او يساوي اليوم الخامس عشر !! فاقرب الى الشهر الحالي
واذا كان اكبر من اليوم الخامس عشر فاقرب للشهر التالي ...
لم تفهم ؟؟ لا تريد ان تفهم ؟؟ هل انت من اصحاب العقول التي تفهم مع الامثلة ؟ طيب .. اليك الامثلة ...
تاريخ اليوم ... كما اشرت هو 03/01/2006
select round(sysdate,'MONTH') from dual ;
المدخل الثاني مكتوب فيه .. month يعني على مستوى الشهر ....
النتيجة تتوقعها ماذا ؟؟
طبعا 01/01/2006
select round(sysdate,'YEAR') from dual ;
الـ year تعني على مستوى السنة ..
نحن في شهر واحد .. يعني اصغر من او تساوي 6 ... اذن .... السنة الحالية هي الاقرب ..
النتيجة 01/01/2006
لم تفهم .. اليك الامثلة ...
قبل ان ابدأ ...
كنت قد كتبت سابقا .... مايلي :
select round('01/01/2006','YEAR') from dual ;
واعطاني خطأ ... واعدني من الخاطئين .. وقال لي ان المدخل الاول خطأ ... ولا يجوز لك فعل هذا .. ولا تفعلها ثانية .. ولا يصح لا عقل ولا منطق فعل هذا .... وعرض لي قائمة باخطائي ..
لاحظ انني ادخلت التاريخ بشكل يدوي .. وليس كمثل sysdate او كمثل احد الاعمدة من نوع تاريخ مثل hiredate
بالله عليك ... مش التاريخ كالنص .. ويشبهه ؟؟ لم تقتنع ؟؟ اليك مثال قديم ..
select ename from emp
where hiredate ='22/02/1981';
بالله هل هذه صحيحة ام لا ؟؟
صحيحة مئة بالمئة ...
لكن عندما استخدمها مع الدالة round .... تحصل مشاكل !! ونفس الشيء ... مع الدالة to_char ... ادخلت فيها تاريخ من رأسي .. ولم افلح !!
الحل هو .. to_Date ...
لكي اجبر الـ round والـ to_char ان تقبل المدخل الاول وبالقوة ... وغضب عليها ان تقبلها !!
اعتقد ان الدالة round حينما كتبت لها الجملة السابقة .. قالت في نفسها .. هذه يضحك علي ويضع نص !! وليس تاريخ .. هاها ... خذ قائمة الاخطاء !!
واعتقد ان المطورين .. يريدون المدخل الاول للدالة round ان يكون تاريخ خالص !!
لا نقلق لاننا نملك الدالة التي قلنا انها عديمة الفائدة سابقا وتدعى to_date !!
لا تلومني يا هذا .. لم اقل انها عديمة الفائدة من فراغ ... لأني لم اعرف ان هنالك دالة غبية .... مثل round ..
لذا .. من الممكن ان تواجهنا دوال وحالات غبية ... فتذكر الدالة to_date كحل إجباري !! ,’,’,’,’
اليك حل المشكلة ^^ ...
select round(to_date('15/07/2006','dd/mm/yy'),'MONTH') from dual;
هاها ... الان تغلبنا على الدالة .. وسوف تعرض النتيجة ماذا ؟؟؟ ركز في انها على مستوى الشهر !!
من يعرف ؟؟
لا احد يعرف ؟؟
؟؟؟؟
؟؟؟
؟؟
؟
The Coder
04-01-2006, 11:46 PM
طيب النتيجة ستكون :
01/07/2006
لأن اليوم 15 .. وهو اصغر من او يساوي 15 لذا فالشهر الحالي هو الأقرب !!
مثال اخر
select round(to_date('16/07/2006','dd/mm/yy'),'MONTH') from dual;
فكر فكر فكر ..
النتيجة بسيطة ..
ستكون ...
01/08/2006
سهلة صح ؟؟
الان على مستوى السنين ...
select round(to_date('15/07/2006','dd/mm/yy'),'YEAR') from dual;
مالنتيجة ؟؟
طبعا .... على مستوى السنة .. ننظر الى الشهر (لاحظ اننا تجاهلنا الايام في مستوى السنين).. نجده اكبر من او يساوي 7
اذن .. النتيجة هي ..
01/01/2007
مثال اخير ...
select round(to_date('15/06/2006','dd/mm/yy'),'YEAR') from dual;
والنتيجة ... هي ....
01/01/2006
اليك التحدي الثالث !!
select round (to_date('16/12/2006','dd/mm/yy'),'month') from dual;
مالنتيجة المتوقعة ولماذا ؟؟
حاول ان لا تستخدم البرنامج .. استخدم عقلك فيها !!
الان انتهت هذه الدالة ... جميلة بعض الشيء .. ولكن انظر الى الدالة القادمة .. دالة غبية بعض الشيء ولكن من الممكن ان تفيد لأغراض اخرى ...
الدالة :TRUNC
العمل :???? اعتقد قص التاريخ ؟؟
الأمثلة :
هل تذكرها ؟؟
نفس تلك الموجودة في قص الاعداد ... ولكن هذه المرة ... التواريخ ....
ندخل في الأمثلة ....
select trunc(to_date('15/08/2006','dd/mm/yy'),'month') from dual;
مالنتيجة لو كانت round ؟؟
طبعا
01/08/2006
طيب ... في هذه الدالة .. النتيجة نفس الشيء ..
01/08/2006
المثال الي بعده ....
select trunc(to_date('18/08/2006','dd/mm/yy'),'month') from dual;
لو كانت الدالة round مالنتيجة ؟
طبعا
01/09/2006
لكن مع هذه الدالة ... النتيجة :
01/08/2006
كأنه يقول ... على مستوى الشهور ... سواء الايام كانت اكبر من 15 او اصغر من او تساوي 15 ... رجعها الى واحد
يعني كأنه يقول صفر عداد الايام !! وارجعه لواحد ,,
اليك مثال السنين ...
select trunc(to_date('15/08/2006','dd/mm/yy'),'year') from dual;
النتيجة ...
01/01/2006
select trunc(to_date('15/04/2006','dd/mm/yy'),'year') from dual;
النتيجة هي ..
01/01/2006
خلاصة الامر .. اذا على مستوى الشهور ... رجع الايام الى 1 واترك الشهر كما هو
اذا على مستوى السنين ... رجع الايام لـ 1 و الشهور لـ 1 والسنين كما هي ... !!
انتهت ....
الان اليك تلخيص مبسط لـدوال الاحادية الصف ...
ولاحظ ان مداخل الدوال من الممكن ان تكون اسم عمود ... او تكون نص .. او رقم .. او تاريخ !!
دوال لأغراض النصوص .. (عرضت في الدرس السابق .. وتعرض الان للتذكير ...) صورة 19
http://img6.picsplace.to/img6/10/19_015.jpg
دوال لأغراض الأرقام ... صورة 29
http://img8.picsplace.to/img8/5/29_006.jpg
دوال لأغراض التواريخ .. صورة 39
http://img8.picsplace.to/img8/5/39_009.jpg
دوال لأغراض التحويل !! صورة 49
http://img6.picsplace.to/img6/10/49_001.jpg
هل انتهت الدوال الاحادية ... هل تخلصنا منها الى الأبد ؟؟ هل نبدأ في دوال المتعددة الصفوف ونرتاح ؟؟
لا لا لا .. لا ...
بقيت دالة واحدة لا تصنف ضمن الدوال السابقة !!
The Coder
04-01-2006, 11:50 PM
الدالة :NVL
العمل :تبدل القيم الخالية ... بقيم اخرى !!
الأمثلة : مهمة هذه الدالة ...
اولا ....
NULL + 800 = ؟؟؟
كم تساوي ؟؟؟
اذا لم تعرف .. اتق الله في نفسك .... وراجع الدرس السادس !!
الحل هو ....
NULL + 800 = NULL
أي عملية حسابية وأي رقم .. مع الـقيمة الخالية فالنتيجة هي قيمة خالية !!
ضرب قسمة طرح جمع .... جذر ... أي شيء ... الناتج قيمة خالية !!
الان ....
اليك هذا المثال القديم ..
نريد عرض اسماء وراتب الكلية ..(الرواتب الكلية = الرواتب الأساسية + الإضافية )
ما هي جملة الاستعلام ؟؟
فرصة لك ان .. تتذكر ...
هيا هيا هيا ....
انتهى الوقت ,,
select ename , sal+comm from emp ;
ENAME SAL+COMM
---------- ----------
SMITH
ALLEN 1900
WARD 1750
JONES
MARTIN 2650
BLAKE
CLARK
SCOTT
KING
TURNER 1500
ADAMS
ENAME SAL+COMM
---------- ----------
JAMES
FORD
MILLER
بعضهم .... قيمة الراتب الكلي .. فارغة ؟؟ لماذا ؟
لان قيمة الـcomm لديه فارغة .....
فـ NULL + راتبه = NULL
مشكلة عويصة ....
مشكلة اخرى .... المدير لا يريد شيء فارغ من هذه الجملة ...
select ename , comm from emp ;
انظر النتيجة .... فراغات فراغات فراغات ... شكلها ... وحش !!
ENAME COMM
---------- ----------
SMITH
ALLEN 300
WARD 500
JONES
MARTIN 1400
BLAKE
CLARK
SCOTT
KING
TURNER 0
ADAMS
JAMES
FORD
MILLER
مالعمل ؟؟
ماذا نفعل ؟؟
من ينقذنا ؟؟
سوبر مان ؟؟
لا ....
بل دالة NVL
دالة NVL تقول .... اعطيني العمود الذي ترى ان فيه قيم خالية ... واعطيني قيمة بديلة .. وانا اضعها لك .. كيف ؟؟
في مثالنا الخاص بـالرواتب الكلية .... انسى القيمة الخالية في حياتك اليومية ... وفكر ..
اذا واحد ما عنده راتب إضافي ... يعني راتبه الإضافي يساوي كم ؟؟
صفر صح ؟؟
ما رأيك لو مثلا ... واحد راتبه الاساسي 1250 وراتبه الاضافي ما عنده ... راتبه الكلي كم ؟؟؟
طبعا 1250 .... مالذي فعلته ؟؟ فكر ؟؟ بسيطة ... 1250 دولار + 0 دولار = 1250 دولار .. هذا كل شيء ..
يعني بدلا من الـ NULL نضع صفر !!
وتعالي يا دالة NVL .... نريدك في مشوار ....
select nvl(comm,0) from emp ;
انظر الناتج وفكر .....
NVL(COMM,0)
-----------
0
300
500
0
1400
0
0
0
0
0
0
0
0
0
هل شاهدت ذلك ...؟؟
بدلا من القيم الخالية .. والفراغات .. اصبح لدينا اصفار !!
دالة NVL لديها مدخلين ... المدخل الاول .. العمود الذي تتوقع ان به قيم خالية ...
والمدخل الثاني .. به القيمة البديلة اذا ... (لاحظ اذا ) كانت القيمة خالية .. اذا لم تكن خالية .. اتركها كما هي ...
ياسلام يا NVL ... حللت مشكلاتنا ببراعة ...
الرئيس ..KING
من اسمه ... تعرف انه ملك !!
ورئيس الموظفين في جدولنا المعتاد ,,
من مديره في الشركة ؟؟
نريد ان نعرف مديره .... كيف ؟؟
select ename , mgr from emp
where ename='KING' ;
والنتيجة ...
ENAME MGR
---------- ----------
KING
اوبس ... قيمة خالية في حقل الـمدير mgr !!
يعني لا مدير له ... وهو التوب (التوب = top = فوق ... والتوب كلمة عربية مأنجلزة .... وليست انجليزية معربة ...)....
حقل المدير ... حقل كله ارقام ....
يعني رقمي .. وليس نص او تاريخ (اسف لاني ذكرتك بمصائب التاريخ !!)
لو جائنا رئيسنا KING وقال .. شكلها مو حلو .. ابي جملة بدلا من الفراغ هذا .... ابيه NO MANAGER
له حق يتشرط ...
ماذا نعمل ؟ بسيطة .... الدالة NVL تحت الخدمة ..
select ename,NVL(mgr,0) from emp where ename='KING';
والنتيجة هي ...
ENAME NVL(MGR,0)
---------- ----------
KING 0
ياسلام .. صار صفر بدلا من الفراغ ...
بالله عليك ... لو احد الموظفين رقمه صفر ..... وهو موظف يأخذ راتب 250 دولار فقط .. تجعله رئيسا على KING !!!
كم نضع ؟؟ واحد ؟؟ عشرة ؟؟ لا نعرف ...
كأننا سمعنا KING قبل ان يذهب يقول .. اريد الجملة NO MANAGER !! صح ... اذن بسيطة !!
select ename,NVL(mgr,'NO MANAGER') from emp where ename ='KING';
شكلها حلو ...
انظر النتيجة الجميلة الان ... بالله انظر ...
ORA-01722: invalid number
جميلة النتيجة ... مجرد ..... خطأ !!!!
مالعمل ... ؟؟
ماذا نفعل ؟؟
دالة NVL تقول ... ان المدخل الاول رقم .. يجب ان يكون المدخل الثاني رقم ...
المدخل الاول نص .. فلا بأس في المدخل الثاني ... رقم نص .... لا بأس !!
في مثالنا .. المدخل الاول هو mgr وهو رقم .... ماذا نعمل ؟؟؟
مشكلة الاستحضار الان بدأت لديكم ....
و أظن ان مشكلة الحفظ بدأت قبلها لديكم ....
ممممم .... هههههه ... سوف اجعله تعذيب .. أأقصد تحدي ,,
وهو التحدي الرابع
انتهت رحلتنا في كوكب ... الدوال الاحادية الصف ,’,’,’,’,’,’,’
The Coder
04-01-2006, 11:54 PM
2) الدوال المتعددة الصفوف Multi-Row Function
اولا وقبل كل شيء .... مالفرق بين الدوال الاحادية الصف ... والمتعددة الصفوف ؟؟
تعرف ؟؟
انظر المثال التالي .. (الصورة 59)
http://img8.picsplace.to/img8/5/59_001.jpg
انظر الى الجدول في المنتصف ...
يمين ... ستجد دالة تسمى بـ SUM وتعني ... مجموع !! (ذات اللون الأحمر)
دالة SUM دالة متعددة الصفوف
يسار ستجد دالتنا الموقرة .. LOWER (ذات اللون الأحمر ) اذا لم تعرف مالذي تفعله ,, روح ونام أفضل ,,
مالفرق بين الدالتين ؟؟
دالة LOWER تأخذ صف صف ...
يعني تأخذ صف واحد .. وتخرجه كصف واحد ..
اما دالة المجموع ... فهي تأخذ مجموعة صفوف ... من الممكن ان تكون صف واحد او صفين او ألف صف !!
وتخرجه كصف واحد !! .. ركز ...
هل فهمت الفرق !!
يعني احادية الصفوف .. تأخذ صف واحد وتخرج صف واحد
متعددة الصفوف .. تأخذ مجموعة صفوف (مجموعة = صف او اكثر ) !! .. وتخرج ايضا صف واحد فقط..
وهو فرق جذري!!
الان اريد ان اسرد لك دوال المتعددة الصفوف ...
اقل من الدوال الاحادية الصف ... وابسط ,,
الدالة :SUM
العمل :ايجاد المجموع
الأمثلة :
ماهو مجموع رواتب الموظفين الذين في قسم 30 ؟؟؟
صعبة !!
اليك الجملة ....
select sum(sal) from emp where deptno =30 ;
وستعرض نتيجة واحدة .. فقط ...
SUM(SAL)
--------
9400
....
اشير الى انها تأخذ في المدخل اعداد فقط ... طبعا !!
لانها لا توجد مجموع اسماء ولا مجموع تواريخ .... كما تعرف ....
هل تصدق ان دالة SUM ذكية ؟؟ تعرف لماذا ؟؟
لانها اوتوماتيكيا ... تحول القيم NULL الى صفر ,,,
جرب الجملة التالية ... وستعرف انها ذكية ..
select sum(comm) from emp ;
سوف تحول القيم الـخالية الى اصفار ,,
اريد .. تعقيد الامور اكثر واكثر ,,
واريد مجموع ... الرواتب الكلية ...
كيف ؟
تعرف ؟؟
اختبر نفسك !! .... لم تعرف ؟؟
طيب ...
select sum(sal+comm) from emp ;
والنتيجة هي .. 7800 دولار ,,
يا سلام ...
انتظر قليلا ... بالله عليك .. اذهب واحضر الالة الحاسبة .... ونفذ هذه الجملة التالية ..
select sum(sal) from emp ;
ستجد ان النتيجة مخيفة .... 29025 دولار !!
يعني بالله .... مجموع الرواتب الاساسية فقط اكبر من مجموع الراتب الكلية ؟
لا نقبلها لا بالعقل ولا بالمنطق ,,,,,
مالذي حدث ؟؟
هل تعرف ؟؟؟
لا تعرف ؟؟؟
سواء عرف ام لم تعرف .. رغبت ام لم ترغب ...
سوف اجعله تحدي خامس
التحدي الخامس يقول ...
فسر لي .. لماذا ظهرت النتيجة 7800 دولار ؟؟ مع العلم ان دالة SUM دالة ذكية !!
واخبرني مالحل .. وما العمل ؟؟ ما الجملة البديلة ؟؟
الدالة :MAX
العمل :توجد اكبر قيمة ,,
الأمثلة :
في جدول الموظفين .. من هو صاحب اكبر راتب ؟؟
تعرف ؟ لا تعرف ؟
اليك الجملة ...
select max(sal) from emp ;
وسوف تعرض القيمة .. 5000 ,,, انتهى ...
الدالة :MIN
العمل :توجد اصغر قيمة ,,
الأمثلة :
في جدول الموظفين .. من هو صاحب اصغر راتب ؟؟
اليك الجملة ..
select min(sal) from emp ;
والنتيجة هي 800 دولار ,,
لاحظ ان في MAX و MIN تستطيع ان تضع نص في مدخلهما !!
فما الذي تتوقعه من الجملة التالية ؟
select max(ename),min(ename) from emp ;
انظر النتيجة ...
MAX(ENAME) MIN(ENAME)
---------- ----------
WARD ADAMS
يعني .. لو رتبنا الاسماء ابجديا .. لوجدنا ان ادم هو الاول ... ووارد هو الاخير ...
يعني MIN اوجدت الاول ... والـ MAX اوجدت الاخير ..
رائع ....
كأن MIN اوجدت اقل الحروف ترتيبا ... مثلا الحرف باء .. هو الحرف الثاني ...
والحرف جيم هو الحرف الخامس .. ماهو الـ MIN وما هو الـ MAX بينهما ؟؟
فالـ MIN هو حرف باء (الثاني الاصغر), اما MAX فهو الحرف جيم ...(الخامس الاكبر)
فهمت ؟؟؟
The Coder
04-01-2006, 11:57 PM
الدالة :AVG
العمل :توجد المتوسط ؟؟
الأمثلة :
اخواننا في الاحصاء .. يعرفون جيدا ما معنى المتوسط الحسابي ...
مثلا .. انظر الى هذه الرواتب من شركة A المحدودة ,,,
1000
2000
5000
6000
ما هو المتوسط الحسابي لهذه الرواتب ؟؟
نوجد المجموع ....
1000+2000+5000+6000 = 14000
بعد ايجاد المجموع ...
نقسمه على عدد الارقام ... هنا اربعة ارقام ... اذن .. نقسم المجموع على اربعة
14000 / 4 = 3500
فهمت ؟
يعني كأنك تقول 3500 لجميع الموظفين في شركة A المحدودة وبالتساوي ....
لماذا المتوسط الحسابي ؟؟
انا اعتبره مقياس فعلي ,,,
مثلا الشركة B
2000
3000
8000
500
2000
لو جمعتها تصبح 15500 ... هل شركة B تعطي رواتب افضل من شركة A اذا قارنا بينهما من ناحية المجموع ؟؟ طبعا لا نعرف ... لماذا ؟ لانه ذكر 4 موظفين في الشركة A و 5 موظفين في الشركة B
اذن ليس المجموع مقياس فعلي !!
اذا حسبنا المتوسط الحسابي للشركة B فإننا نجد مايلي ..
15500 / 5 = 3100
من الأكثر في الرواتب .. A ام B ؟؟
ومن المتوسط الحسابي نجد ان A اكثر كرما بالنسبة للموظفين جميعهم !! اكرر بالنسبة للموظفين جميعهم !!
الان اريد ان اوجد المتوسط الحسابي للـرواتب فإليك الجملة ,,
select avg(sal) from emp ;
النتيجة ... هي
AVG(SAL)
----------
2073.21429
الدالة :COUNT
العمل :ايجاد عدد الصفوف !!
الأمثلة :
لو قلت لك .... كم عدد صفوف الجدول dept ؟؟؟
هي في الحقيقة أربعة ....
طبعا انا ذهبت وكتبت الجملة التالية ...
select * from dept ;
وظهرت لي ..... اربع صفوف ... انا بنفسي عددتهم ...
اقسم انهم اربعة صفوف !!
لا تصدق ... هيا عدهم انت ... .
DEPTNO DNAME LOC
------- -------------- --------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
هل صدقت ؟؟
استطعنا انا وانت ..... ان نعدها بالنظر ...
طيب .. لو قلت لك كم عدد صفوف جدول الموظفين ؟؟
انا لاني اعتدت عليها .. اقول 14 !! عددتهم بنفسي ...
وباستطاعتك انت وبعد ثواني ان تعدهم ...
لو كان جدول الموظفين به مليار وستمئة مليون وثلاث وعشرون الفا وخمسة عشر موظف .. ونصف الموظف ...
بالله عليك .. كيف تعدهم ؟؟ كيف تعرف ؟؟
طبعا دالة count تحت الخدمة ..... دائما وليس مؤقتا !!
select count(*) from emp ;
والنتيجة كانت ...
COUNT(*)
--------
14
هل انتهى كل شيء ؟؟
لا لم ينتهي كل شيء .. اولا ما معنى النجمة * ؟؟؟
في دراستنا السابقة معناها جميع الأعمدة !!
يعني اوجد لي عدد جميع الاعمدة ؟ هل هذا معنى هذه الدالة ؟؟
ركز جيدا ....
هذه الدالة تتجاهل تماما القيم الفارغة !!
افهم ذلك جيدا !!
الحاسب غبي .. لا يعرف الا صفر او واحد .. من الذكي ؟؟ انت يا بشر ...
بالله عليك .. ما معنى 14 صف ؟؟
مش معناها 14 موظف ؟؟؟ كيف عرفت ؟؟ لانك فكرت ... وعرفت ان الجدول خاص بالموظفين .. وان كل صف يمثل موظف واحد !! ياسلام على الاستنتاج !! بشر وذكي وتعرفها بالبديهي ,,
هذه الدالة .. لها نوعين ... نوع يوجد عدد الصفوف لجدول ... ونوع اخر يوجد عدد عمود معين ...
COUNT(*) هذه اوجدت لنا عدد الصفوف في الجدول كله ...
هل تريد عدد الصفوف الخاصة بـالعمود (عمود=حقل) الخاص بالرواتب ؟؟
select count(sal) from emp ;
وسوف تعرض لك كم ؟؟
14 صف .... يعني 14 راتب لـ 14 موظف ....
تعال معي الان ...
كم عدد الصفوف للعمود رواتب اضافية ؟؟
select count(comm) from emp ;
والنتيجة هي .... 4 !!
يعني توجد اربعة صفوف فقط ؟؟
اين العشرة الباقية ؟
ان قيمها ... قيم خالية !!
لذا .... فإن الدالة تتجاهل القيم الخالية ...
هل فهمت ؟
طيب .. هل تذكر deptno الموجود في جدول emp ؟؟ ماهو ؟؟ انه عمود الخاص بارقام الاقسام
كم قسم موجود ؟؟؟ جرب الامر ...
select count(deptno) from emp ;
وسوف تعرض لي 14 صف ..
14 صف يعني هنالك 14 قسم ؟؟؟
هل هذا صحيح ؟
طبعا خطأ !!
يوجد 4 اقسام فقط !! لا تصدق ؟؟ عددناها انا وانت !! هل تذكر !!
من جدول الأقسام dept
اريد ان اوصل اليك معلومة ..... قد تكون الأعمدة بها قيم خالية ... كما شاهدنا في الرواتب الاضافية
قد تكون قيم مكررة كما شاهدنا في المفتاح الغريب (الغريب= الاجنبي) والذي يدعى بـ deptno
فانتبه لهذه النقطة .. لاتعني عدد الصفوف شيء صحيح ! هل فهمت ,,
اريد ان اعرف كم عدد الموظفين الذين يأخذون رواتب اضافية .. كيف ؟؟؟
هل تعرف ؟؟
select count(comm) from emp ;
وسوف تكون النتيجة هي 4 !!
في الحقيقة ... لو شاهدت الجدول فسوف تشاهد ان هنالك 3 أشخاص يأخذون رواتب اضافية .. والرابع يأخذ صفرا !!
هل بالله عليك .. ان الرابع يأخذ راتب إضافي ؟؟ هل نعتبره نحن البشر انه يأخذ راتب إضافي ؟؟
اذن اليك الامر .. ولكن بشكل أفضل ....
select count(comm) from emp
where comm <> 0 ;
معنى السطر الثاني ... عندما لا يساوي الراتب الإضافي صفرا
والنتيجة تكون .. ثلاثة !!
تنبه لهذه الدالة ... قد تكون هنالك اخطاء كهذه لم اذكرها انا .. وقد لا تهتم اليها ,,,
هل هذا كل شيء عن الدوال المتعددة ؟؟
هل هي بهذه السهولة ؟؟
هل انتهينا منها ؟؟
هل توجد مصاعب اكثر ؟؟
هذا ما سنعرفه في الدرس القادم ^^
,’,’,’,’,’,’,’,’,’,’,’,’,’,’,’
The Coder
05-01-2006, 11:07 PM
تنبه ان الدرس القادم .. صعب قليلا ... ومسلي اكثر من هذه الدوال !!
الدوال يجب ان تحفظها عن بكرة ابيها !!
قد تكون كثيرة ..
قد تكون ملخبطة ..
قد تطفش منها ...
قد تكون مملة !!
ستختفي هذه الأعراض اذا تمكنت منها ..... صدقني ,,,
وصلى الله على نبينا محمد وعلى اله وصحبه وسلم
التحديات للتذكير وهي موجودة بين السطور .... أرجو منك عرضها في موضوع الاستفسارات ,,,
التحدي الاول ...
تخيل انه يوجد موظفين أرصدتهم في البنك مايلي ..
10.25 عشرة دولارات وربع ...
20.5 عشرون دولار ونصف ...
1000000.945 مليون دولار وتسع مئة وخمسة واربعون من العشرة ...
يوجد جدول يدعى بـ BANK مثلا .....
اريد عرض النتائج بهذه الصورة
$0,00,00,10.25
$0,00,00,20.5
$1,00,00,00.945
وهلم جر !!
التحدي الثاني يقول ...
select to_char(sysdate,'ddsp/mmsp "or" ddth/mmth "or" ddspth "from" mmspth "month" ') from dual ;
يوجد كلمة month ... الم يكن من المفترض ان تتحول الى شهر ؟؟؟
النتيجة كانت هكذا .....
three/one or 03rd/01st or third from first month
لماذا لم تتحول كلمة month الى الشهر في تاريخ sysdate أي لماذا لم تتحول الى January مثلا ؟؟؟
اليك التحدي الثالث !!
select round (to_date('16/12/2006','dd/mm/yy'),'month') from dual;
مالنتيجة المتوقعة ولماذا ؟؟
حاول ان لا تستخدم البرنامج .. استخدم عقلك فيها !!
التحدي الرابع ...
.. اريد الجملة NO MANAGER !! اذا كان القيمة خالية في عمود mgr
وكتبنا هذه الجملة والتي كانت خطأ
select ename,NVL(mgr,'NO MANAGER') from emp where ename ='KING';
نريد التصحيح ,,,
التحدي الخامس :
select sum(sal+comm) from emp ;
كانت نتيجتها اقل من مجموع الرواتب .. وهي من المفترض ان تكون اكثر !!
فسر لي .. لماذا ظهرت النتيجة اقل ؟؟
واخبرني مالحل .. وما العمل ؟؟ ما الجملة البديلة ؟؟
The Coder
15-01-2006, 01:43 AM
بسم الله الرحمن الرحيم
الدرس العاشر
اسم الدرس : جملة الاستعلام select والدوال
نوع الدرس : تطبيقي
صعوبة الدرس : *** من *****
اهميــة الدرس : ****** من ***** (Over)
درجة احتراف لغةSQL المتوقعة بعد هذا الدرس : *** من ***** (متوسط )
الوقت المتوقع منك لفهم الدرس : 10 ساعة (ساعتين فهم و 8 ساعات تطبيق )
متطلبات تتوفر فيك : التطبيق
المتوقع منك في هذا الدرس :
- اتقان جزء من هذه اللغة 100 %
- معرفة اضافة , تعديل , وحذف البيانات من الجدول عبر لغة DML
- معرفة التراجع والحفظ
- معرفة انشاء , تعديل , حذف الجداول والحقول عبر لغة DDL
هيا لنؤركل ^^
السلام عليكم
قبل البدء .. اكتشفت دالة جديدة ....
المشكلة في تعدد المناهج ....
لا ادري هل يوجد غير هذه الدالة ..... ولكن اذا وجدتها فسوف اعرضها في الدروس القادمة ان شاء الله ’,’,’,’,’,
الدالة صعبة قليلا ...
ليست كالدوال السابقة !!
الدالة قد تجعلك تكره الـ SQL .. وقد تحببك فيها ,’,’,’
اما هذه الدالة فهي ....
الدالة :DECODE
العمل :????
الأمثلة :
لو لدينا مجموعة احتمالات ..... فمثلا ...
انا كمدير عام .. اريد ان ارفع مرتبات الموظفين .... بنسبة معينة ...
فكل محلل ارفع راتبه بنسبة 50%
و كل مدير ارفع راتبه بنسبة 40%
و كل كاتب .. ارفع راتبه بنسبة20%
وكل بائع .. ارفع راتبه بنسبة 10%
وطبعا ارفع راتبي بنسبة 70%
لاحظ انه يوجد مجموعة احتمالات !!
لو فإن ..
لو فإن ...
لو فإن ....
مجموعة مسارات ... مجموعة قرارات .....
يعني اذا شيء .. فارفع الراتب بشيء ..
واذا بشيء .. ارفع الراتب بشيء ...
وهكذا ....
مالعمل ....بالله عليك فكر ... كيف نحل هذه المشكلة .؟؟؟
جرب .... أعصر مخك ...
حلها باختصار دالة DECODE
كيف نستخدم هذه الدالة ؟
اليك المثال نفسه ,’,’,’,’
اولا يا ضعيفي الرياضيات !!
إضافة 10% الى الراتب ...... كيف ؟؟؟
الراتب نفسه + (الراتب نفسه * 0.1 )
لا تعرف كيف جائت الـ 0.1 ؟؟
اولا انطقها .؟؟ لا تعرف ان تنطقها ؟؟ تنطق واحد من العشرة ...
او عشرة من المئة ...
او مئة من الألف
.....
يعني ... 10% هي عشرة في المئة !!
لو قسمنا 10 على مئة .. تصبح 0.1 هل فهمت ؟
طيب ...
نضيف الى الراتب عشرة في المئة ... يعني عشرة في المئة من الراتب نفسه... نضيفها الى الراتب نفسه
مثال ...
1000 دولار .... ماهو الـ 10% منه ؟
100 دولار صح ؟؟
طيب اضف الى الـ 1000 دولار نسبة 10% !!
الحل هو 1000 + 100 = 1100 ,,,
انتهى درس الرياضيات ....
اليك المثال الان .....
Salary after the addition = salary + (salary * (10/100))
و 10 تقسيم مئة كما قلنا ... تساوي 0.1
طيب ...
انظر المثال .. وتعمق فيه وهو عرض الراتب العادي , والراتب ما بعد الزيادة ,,,
select job,sal,
decode(job,'SALESMAN',sal+(sal*0.1)
,'CLERK',sal+(sal*0.2)
,'MANAGER',sal+(sal*0.4)
,'PRESIDENT',sal+(sal*0.7)
,'ANALYST',sal+(sal*0.5) , 0) SAL_AFTER from emp;
واو .. طويلة الدالة ..
دالة ذكية جدا .. تأخذ أي عدد من المدخلات على حسب ما نريد !!
انظر الى المدخل الاول ... وهو حقل الـ job .... لماذا هذا الحقل ؟؟
كأننا نقول يا ايتها الدالة decode .... انظري الى الحقل JOB
اذا كان الـ job يساوي SALESMAN فاعرض القيمة sal+(sal*0.1)
اذا كان الـ job يساوي CLERK فاعرض القيمة sal+(sal*0.2)
وهكذا ....
حتى اذا وصل الى القيمة الغريبة .. التي انا وضعتها !! وهي الصفر ..
هل شاهدت المدخل الاخير ؟؟ انه صفر !! لماذا صفر ؟؟ وما هو فائدته ؟؟
صراحة هنا تأتي أي قيمة .. يعني الدالة decode تشاهد هذا المدخل وتقول .. ممممم اذا لم يكن الـ job لا CLERK ولا ANALYST ولا أي شيء مما ذكر انفا ..... اذن .. اعرض القيمة صفر ..
مارأيك و وضعنا واحد هل تضر ؟؟ هل تؤثر في العمل ؟؟
طبعا لا .. ولكن بدلا من ان يعرض صفر للذي عمله ليس من القائمة السابقة .. فسوف يعرض واحد !!!
JOB SAL SAL_AFTER
--------- ---------- ----------
CLERK 800 960
SALESMAN 1600 1760
SALESMAN 1250 1375
MANAGER 2975 4165
SALESMAN 1250 1375
MANAGER 2850 3990
MANAGER 2450 3430
ANALYST 3000 4500
PRESIDENT 5000 8500
SALESMAN 1500 1650
CLERK 1100 1320
CLERK 950 1140
ANALYST 3000 4500
CLERK 1300 1560
هل رأيت ذلك ؟؟
عرضت بشكل جميل جدا ...
ان بعضكم يعرفون انني اعرف أنهم لم يفهموا لذا .... مثال اخر أصعب ...... واعقد
احتج بعض الموظفين ,, وقالوا من الظلم التفرقة بيننا وان تعاملونا على حسب الوظائف .
المفترض (كما يقولون هم وليس انا) ان يكون على حسب الراتب !! لكي يكون أدق وأفضل لهم !!
يعني كما يلي :
اذا راتب اقل من 1000 دولار ...... يزيد بنسبة 10%
اذا راتب اقل من 2000 دولار واكبر من 1000 دولار .. يزيد بنسبة 20%
اذا راتب اقل من 3000 واكبر من 2000 .. يزيد بنسبة 30%
اذا راتب اقل من 4000 واكبر من 3000 .. يزيد بنسبة 40%
اذا راتب اقل من 5000 واكبر من 4000 .. يزيد بنسبة 50%
اذا راتب اكبر من 5000 ,,,, يزيد بنسبة 60%
هكذا اعدل وافضل !!
سنعود ...
The Coder
15-01-2006, 02:35 AM
اليك الجملة .... وكلي ثقة انك فكرت اصلا في الحل ...
اولا يا اصحاب الرياضيات ... يا احباب الرياضيات .. يا ضعاف الرياضيات ..
كيف نعرف ان هذا الراتب اقل من كذا وكذا ؟؟ واكبر من كذا وكذا ؟؟
المسئلة هذه بسيطة .... فمثلا ... 2500 دولار .. اكبر من 2000 واصغر من 3000
كيف عرفت ؟؟ كيف عرف عقلك البشري اوتوماتيكيا ؟؟ من اخبرك انه بين 2000 و 3000 ؟؟
هل جاءت صدفة ؟؟ هل اتاك الوحي ؟؟
انا اخبرك ... من سرعة عقلك ... حسبها بسرعة فائقة جدا .. وانت لا تعلم
عرف انه بين 2000 و 3000 بطريقة ما ... وانت لا تعلم
لديه قواعد وقوانين .... وطبقها ... وانت لا تعلم ...
اليك حل قوي .. اليك قاعدة مبتكرة ...
Trunc(2500/1000)= 2
Trunc(2999/1000)=2
Trunc(2000/1000)=2
هل شاهدت مالذي حصل ؟؟
الاعداد ما بين 2000 و الـ 3000 لها نفس النتيجة في المعادلة السابقة !
Trunc هي دالة القص ... هل تذكرها ؟؟ اذا لم تذكرها لا تكمل الدرس ... ارجع للدروس السابقة او ارجع للملخص !!....
اذن ..
اخترعنا قاعدة .... اسسنا قاعدة ... اذا كان الناتج من
Trunc(number/1000)=2
فان هذا العدد يكون اكبر من او يساوي 2000 واصغر من الـ 3000 !
نفس الشيء ...
Trunc(number/1000)=1
فان هذا العدد يكون اكبر من او يساوي 1000 واصغر من الـ 2000 !!
لن اكمل .. ولكن اليك الجملة .....
select sal ,
decode(trunc(sal/1000),0,sal+(sal*0.1)
,1,sal+(sal*0.2)
,2,sal+(sal*0.3)
,3,sal+(sal*0.4)
,4,sal+(sal*0.5)
,sal+(sal*0.6) )SAL_AFTER from emp ;
انظر جيدا !! ....
هذه الجملة صعبة ... صعبة جدا لكثير من الناس !!
ركز جيدا فيها ....
قبل البدء .. انظر دالة trunc درسناها بمدخلين صح ..
يعني هكذا
Trunc(1000,2)=1000.00
Trunc(1000,0)=1000
صح ؟
لو جعلناها بمدخل واحد ... فسوف تفترض هي .. ان المدخل الثاني صفر ,ـ,ـ,ـ,ـ,ـ,ـ,ـ,ـ,ـ,ـ,ـ,
اوكيه !! يعني :
Trunc(1000.124547)=1000
الان نرجع لدالة decode
اول مدخل هو ماذا ؟؟
هل هو sal ؟؟
هل هو job ؟؟
لا !!
معادلتنا السابقة !!
الدالة decode تقول ... تريدني ان ارى ناتج هذه المعادلة !!
تأتي لأول صف ... وترى ان راتبه 800 دولار !!
وانظر ماذا تقول هذه الدالة :
"... مممممم 800 تقسيم 1000 الناتج هو 0.8
ومع القص !! ... تصبح صفرا !!
ممممممم اذا كان الناتج صفرا .... فسوف اعرض الناتج بما يلي :
800+(800*0.1)=880 dollar
اذن سوف اعرض الاول ... 880
الي بعده .... هه ... هذا الاخر راتبه 1100 ...
1100 تقسيم 1000 الناتج هو 1.1
ومع دالة القص يصبح الناتج واحد !!
ممممم ... أي الاحتمالات ؟؟ اها ..
اذا كان الناتج هو واحد فانه سوف اعرض مايلي :
1100+(1100*0.2)=1320 dollar
سوف اعرضه اذن ^^
"
هل فهمت ؟
يعني اول مدخل هو المعادلة ... هو ما سوف ننظر الى ناتجه !!
والبقية الاحتمالات !!
اذا كان كذا فيصبح الناتج كذا ...
اذا كان كذا فيصبح الناتج كذا ....
وهكذا ,’,’,’
الاحتمال الاخير ... وهو اذا لم يكن كما سبق .. فاعرض sal+(sal*0.6)
انظر الناتج !!
SAL SAL_AFTER
----- ----------
800 880
1600 1920
1250 1500
2975 3867.5
1250 1500
2850 3705
2450 3185
3000 4200
5000 8000
1500 1800
1100 1320
950 1045
3000 4200
1300 1560
طيب ...
اليك التحدي الاول !! وهو من ابسط التحديات التي اطرحها ,’,’,’,’
لو اردت ان اعرض مايلي :
JOB RANK
--------- ----
CLERK D
SALESMAN E
SALESMAN E
MANAGER C
SALESMAN E
MANAGER C
MANAGER C
ANALYST B
PRESIDENT A
SALESMAN E
CLERK D
CLERK D
ANALYST B
CLERK D
يعني ... مايلي
اذا كان PRESIDENT فالرتبة A
اذا كان ANALYST فالرتبة B
اذا كان MANAGER فالرتبة C
اذا كان CLERK فالرتبة D
اما اذا كان SALESMAN فالرتبة E
The Coder
15-01-2006, 02:50 AM
اليك مثال اخير ....
اذا راتب اقل من 1000 دولار ...... يزيد بنسبة 10%
اذا راتب اقل من 1500 دولار واكبر من 1000 دولار .. يزيد بنسبة 20%
اذا راتب اقل من 2000 واكبر من 1500 .. يزيد بنسبة 30%
اذا راتب اقل من 2500 واكبر من 2000 .. يزيد بنسبة 40%
اذا راتب اقل من 3000 واكبر من 2500 .. يزيد بنسبة 50%
اذا راتب اقل من 3500 واكبر من 3000 .. يزيد بنسبة 60%
اذا راتب اقل من 4000 واكبر من 3500 .. يزيد بنسبة 70%
اذا راتب اقل من 4500 واكبر من 4000 .. يزيد بنسبة 80%
اذا راتب اقل من 5000 واكبر من 4500 .. يزيد بنسبة 90%
اذا راتب اكبر من 5000 ,,,, يزيد بنسبة 100%
لاحظ ان الفرق بين الاحتمالات 500 !!
يعني ... انظر الجملة .. وحاول فهمها !!
مع العلم ان .....
Trunc(999/500)=1
Trunc(1499/500)=2
Trunc(1999/500)=3
……
select sal ,
decode(trunc(sal/500),0,sal+(sal*0.1)
,1,sal+(sal*0.1)
,2,sal+(sal*0.2)
,3,sal+(sal*0.3)
,4,sal+(sal*0.4)
,5,sal+(sal*0.5)
,6,sal+(sal*0.6)
,7,sal+(sal*0.7)
,8,sal+(sal*0.8)
,9,sal+(sal*0.9)
,sal+(sal*1.00))
SAL_AFTER from emp ;
والنتيجة كما يلي ... نتيجة احصائية بحته !!
SAL SAL_AFTER
----- ----------
800 880
1600 2080
1250 1500
2975 4462.5
1250 1500
2850 4275
2450 3430
3000 4800
5000 10000
1500 1950
1100 1320
950 1045
3000 4800
1300 1560
انتهت الدالة ... وبدينا في درس اليوم ...
شاهدنا كيف يمكننا ان نوجد مجموع رواتب الموظفين في القسم 30
انظر الجملة !!
select sum(sal) from emp
where deptno=30;
طيب .. اريد ان اعرض مجموع رواتب الموظفين في القسم 10 .. والقسم 20 والقسم 30
نستطيع بعمل ثلاث جمل .....
select sum(sal) from emp
where deptno=10;
select sum(sal) from emp
where deptno=20;
select sum(sal) from emp
where deptno=30;
طيب لو كان هنالك مليار قسم ؟؟
كيف اعرض مجموع الرواتب في كل قسم ؟؟
يعني عرض مجموع الرواتب لكل قسم في جملة واحدة !!
ماذا اعمل ؟؟
فكر فكر فكر فكر .....
اريد ان اعرض اعلى راتب للمحللين .. واعلى راتب للمدراء .. واعلى راتب للبائعين !!
ماذا اعمل ؟؟
هل تستطيع ان توجد الجملة ؟؟
صح !! بدوال المتعددة الصفوف .. لكن كيف ؟؟
فكر بالله عليك ....
لاحظ انني قسمت المجاميع على حسب الاقسام .. في طلبي الاول
ولاحظ انني قسمت المجاميع على حسب الوظيفة في طلبي الثاني
دوال المتعددة الصفوف لاتتقسم !!
هي توجد مجموعة صفوف واحدة فقط !! في جملة الاستعلام الواحدة !!
ركز .. مجموعة صفوف واحدة .....
اعيد واكرر .. ركز ما معنى مجموعة صفوف واحدة ؟؟
يعني تخيل مجموعة صفوف ... وهي صفوف القسم 30 ..... هذه مجموعة واحدة ....
هل نستطيع ان نوجد مجموعة صفوف القسم 20 ومجموعة صفوف القسم 30 ؟؟
بمعنى اخر .. هل نستطيع ان نوجد مجموعتي صفوف اثنتين ؟؟ او ثلاث ؟؟؟ او اكثر ؟؟؟
في الحقيقة لا تستطيع وحتى هذه اللحظة ...
لذا مالحل ؟؟ مالعمل ؟؟؟ من المنقذ هذه المرة ؟؟ هل هي دالة ؟؟ هل هو شرط ؟؟ هل هو سوبرمان ؟؟؟
انظر الى جملة الاستعلام التالية !! انظر جيدا .... احد الاغبياء كتبها بدون تفكير منطقي (في الحقيقة انا هو من كتبها !)
select ename,sum(sal) from emp ;
مالذي فعلته انا ؟؟
ماذا تعني الجملة السابقة ؟؟
بالله عليك قلي ... مالناتج من هذه الجملة ؟؟
ماذا تتوقع ان يكون الناتج ؟؟ فكر قليلا .....
هل فكرت ؟
طيب
انا شخصيا وجدت الغباء والبلاهة الشديدين في الجملة السابقة !!
مالذي سوف ينعرض ؟؟ طبعا سوف ينعرض الخطأ التالي !!
ORA-00937: not a single-group group function
لا عليك من الخطأ الان ..
ستعرف الحل ... وسوف اعدك انك ستعرفه افضل من أي شخص اخر في دورة اخرى او كتاب اخر ,’,’,’,’
سوف اجعلك تتعمق في مفهومه .. بشكل معقد وقاسي ..... لكي تتعامل مع أي قاعدة بيانات ضخمة !!
يجب ان تعرف ان صعوبة الامر ليس في الـ SQL !! بل في ضخامة الجداول , وكثرة البيانات , وتعقيد البناء وحساسية الموقف .. اذ انه ادنى غلطة ... تطردك من العمل وغرامات مادية وسجن ووو ..... !!
لذا يجب ان تكون متمكنا وتعرف مداخل ومخارج هذه اللغة بشكل قوي !!
انسى الان شيء اسمه لغة استرجاع البيانات select انسى امرها الان ...
هل انتهت ؟ لا لم تنتهي !!
انا فكرت مليا في تخطيها الان ... وان اقفز الى الامام لنتائج افضل
بامكاني استعرض كل شيء كالكتب التقليدية .. ولكن مالفائدة ؟؟ كان بامكاني اعطائك المراجع ... وانتهى كل شيء !!
سوف اتعمق في الـ SQL لانها روح قواعد البيانات !!
ثم اتعمق في اللغة المتطورة منها وهي PL-SQL وهي العقل المفكر والمدبر من لغة الـSQL أي الجزء المنطقي منها !!
وما بعدهما يهون , وبسيط !!
كيف تعمل التقارير وكيف تعمل النوافذ وكلام فاضي .. تحفظه في ايام بسيطة .. اسبوع اسبوعين بالكثير ولا يوجد معك مشاكل ,’,’,’
........
The Coder
15-01-2006, 02:59 AM
الان ما هي اقسام لغة الـ SQL ؟؟ نسينا ؟؟ نعم اعرف انك نسيت ,,,, الدرس السادس يا محترم !!
هي مايلي :
1- استرجاع البيانات (Data Retrieval)
وبها مصائب الـ select
2- لغة التلاعب بالبيانات (Data Manipulation Language) اختصارها DML
وهي تخص بتعديل , حذف , او اضافة البيانات والسجلات في جدول ما ....
3- التحكم بالعمليات (Transaction Control)
هذه خاصة بتثبيت وحفظ العمليات ...
4- لغة تعريف البيانات (Data Definition Language) اختصارها DDL
وهي التي تخص بتعديل , حذف او اضافة وانشاء الجداول وخصائصها (الاعمدة) وعلاقاتها ..
5- لغة التحكم بالبيانات (Data Control Language) اختصارها DCL
خاصة بالصلاحيات ..
افترض اننا انتهينا من القسم الاول .. ونحن في الحقيقة لم ننتهي !!
القسم الثاني : لغة التعامل او التلاعب بالبيانات (Data Manipulation Language) اختصارها DML
وبها ثلاث جمل !!
الجملة الاولى INSERT INTO وهي خاصة باضافة بيانات للجدول
الجملة الثانية UPDATE وهي خاصة بتعديل البيانات للجدول
الجملة الثالثة DELETE وهي خاصة بحذف بيانات من الجدول
يجب ان تعرف ان هذه الجمل الثلاث اختصاصها الصفوف !
يعني شغلها في الصفوف ... تضيف صفوف تعدل صفوف تحذف صفوف !! تنبه لذلك !!
الجملة الاولى INSERT INTO
انا صراحة .. طفشت من المعلومات التي اراها دائما في جدول emp
اريد ان اضيف معلومات من رأسي ....
ممممم .... مثلا اريد ان يكون هنالك موظف اسمه Bill ويأخذ راتب 4250 دولار ...وهو محلل .... واي معلومات اخرى ,,,
بجملة Insert into استطيع اضافته !!
اليك جملة الاضافة هذه
insert into emp values(7777,'BILL','ANALYST',7566,'20/01/80',4250,null,10) ;
يعني ادخل القيم الى الجدول emp
وللمتعسر في الانجليزية ..
Insert ادخال
Into الى
Values قيم (مجموع قيمة)
الان انسى شرحها التفصيلي وانظر الى النتيجة...
1 row created.
يقول لي .. انني عملت صفا واحدا !!
يا سلام ...الان .. هل ادخلناه فعلا .. انا لا اصدق .... يجب ان اراه .. يجب ان اتأكد !!
كيف اتأكد ؟؟ كيف اعرف ؟؟ اها .. افتكرت جملة قديمة جدا , لن انساها ابدا .. هذه هي الجملة :
select * from emp
where ename='BILL';
وسوف تظهر النتيجة التالية :
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
------ ---------- --------- ---------- -------- ---------- ---------- ----------
7777 BILL ANALYST 7566 20/01/80 4250 10
ياسلام .. اضفناه ... رائع !!
الان نرجع الى شرحها ...
insert into emp values(7777,'BILL','ANALYST',7566,'20/01/80',4250,null,10) ;
فكر لماذا وضعناها بهذا الترتيب ؟؟ الترتيب كما يلي
رقم الموظف , اسمه , مهنته,مديره,تاريخ تعيينه,راتبه,الراتب الإضافي, رقم القسم
لماذا لم نضع الراتب اولا ثم اسم الموظف ثانيا ثم رقم القسم ثالثا ؟؟
لماذا بهذا الترتيب بالذات !!
ولماذا الـ null ؟؟ لماذا لم نكتب فراغ إشارة الى القيمة الخالية ؟؟
انا جربت ... الفراغ والذي يمثل علامتي تنصيص احادية فارغة لا شيء بينها كما يلي
insert into emp values(7777,'BILL','ANALYST',7566,'20/01/80',4250,'',10) ;
هل لاحظتها !! انها ليست علامة تنصيص ثنائية !! بل علامتي تنصيص احادية !!
وسوف تضاف على انها قيمة خالية !! هل فهمت !!
لا تنسى ان التاريخ والنص ... بين علامتي تنصيص احادية ,,,,
الان لماذا وضعنا القيمة الاولى رقم وليس نص ؟؟ ولماذا وضغنا القيمة الثانية نص وليس رقم ؟؟؟
ان أي جدول مصمم بشكل معين ... قبل ان تضيف شيء ... تأكد من ترتيب الاعمدة بواسطة الجملة التالية :
select * from emp;
هل فهمت !!
انتبه !! احفظ تركيب جملة الإضافة !!
طيب لو غلطنا ... او تعمدنا ان نضيفه مرة ثانية ...
يعني نكتب الجملة نفسها مرة ثانية ... مالذي يحدث ؟؟؟
مالذي سوف ينتج ؟؟
لو جربنا فسوف نواجه الرسالة التالية !!
ORA-00001: unique constraint (SCOTT.PK_EMP) violated
خطأ !!
لماذا خطأ ؟؟ وماذا تعني الجملة السابقة ؟؟
اتركها الان ولكن سأخبرك لماذا !!
لانك اضفت قيمة مكررة في عمود رقم الموظف !! وهو مفتاح رئيسي .. لا يمكن ان يتكرر ولا يمكن ان يكون خاليا !!
جرب وان تضع قيم من عندك ... وان تضع رقم الموظف خالي !! أو ان تضع قيمة مكررة له !!
او ان تضع قيمة خالية في المفتاح الاجنبي (رقم القسم )
كلها تؤدي الى اخطاء !!
الان ... تخيل انك لا تعرف ترتيب الاعمدة ..
او انك تستعبط وتريد ان تضع من عندك ترتيب ... !! مالعمل ؟؟ ماذا تفعل يا عبيط ؟؟؟
اليك الجملة بشكلها المحسن الكامل !!
insert into emp(ename,sal,hiredate,mgr,empno,comm,deptno,job) values
('JONE',1500,'01/01/88',7782,7744,null,10,'SALESMAN');
يعني فتحنا قوس وذكرنا الاعمدة بترتيبنا الذي نرغبه !! .... ثم وضعنا القيم بالترتيب نفسه !!
لاحظ ان ترتيب القيم هو نفس ترتيب الاعمدة الذي وضعناها !!
لو وضعتها مختلفة عن بعض ... فاتق الله !! وضعها بنفس الترتيب الذي ذكرتها يا عبيط !!
وسوف تكون النتيجة كيف ؟؟ هل تعتقد انها بنفس الترتيب الذي ذكرته ؟؟ انظر مايلي :
select * from emp
where ename='JONE';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- -------- ---------- ---------- ----------
7744 JONE SALESMAN 7782 01/01/88 1500 10
بنفس ترتيب الجدول نفسه !! يعني هذا الترتيب المبني عليه هذا الجدول !!
بالرغم من اننا ادخلنا بترتيب عشوائي اخترناه ... فهو يخزنه على حسب ترتيبه في الجدول ,’,’,’
الان .. يجب ان لا يكون المفتاح الرئيسي والمفتاح الاجنبي خاليان
فيما عداهم .. لا ضير من كونها خالية !!
طيب ... احدهم يريد ان يضيف اسم ورقم موظف .. وقسمه فقط !! والبقية قيم خالية , اليك الجملة
مثلا الاسم ANY_ONE
والرقم 7000 وفي قسم رقم 90
insert into emp(ename,empno,deptno) values
('ANY_ONE',7000,90);
هل لاحظت ترتيب الاعمدة ؟؟ لم اذكر كل الاعمدة .. بل ذكرت الاعمدة التي اردتها ,,,
وبالترتيب الذي اريده ... انظر النتيجة الجميلة :
ORA-02291: integrity constraint (SCOTT.FK_DEPTNO) violated - parent key not found
خطأ موقع ومعتمد من قبل الهيئة الملكية الشرعية للأوراكل !!
تعرف لماذا هذا الخطأ ؟؟
لأننا اضفنا رقم قسم غير موجود اصلا في جدول الاقسام !!
انظر الى نتيجة الجملة التالية
select * from dept;
DEPTNO DNAME LOC
------- -------------- --------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
لا يوجد رقم قسم =90
هل فهمت لماذا ؟؟
لانه هناك في جدول الـموظفين مفتاح اجنبي !!
وهنا طبعا مفتاح رئيسي ,
الأوراكل لديها علم بذلك ... من قال له ؟؟ من غششه ؟؟ من اخبره بأن رقم القسم مفتاح اجنبي في جدول الموظفين ؟؟
وما هي المخاطر والمشاكل المحتملة عن وجود رقم 90 ؟؟أو عن وجود قيم خالية في المفتاح الاجنبي !!
هل تذكر الصفوف او السجلات اليتيمة !! ؟؟
هل تذكرها ؟؟ في الدرس الخامس على ما اعتقد !!
اذهب واقرأها ثانية !!
The Coder
15-01-2006, 03:08 AM
أصر على عدم إكمال مشوارك اذا لم تفهمها او نسيتها !!
وأصر على ان ترجع الى الدرس الخامس وبشدة !!
نرجع ...
لقد اخبر الأوراكل هو من عمل الجدول !!
وسوف ندرس كيف نعمل الجداول ونعمل هذا الربط بين الجداول , ان شاء الله قريبا
هل صعبة جملة الادخال Insert into ؟؟؟
ابدا ليست صعبة
هل انتهت ؟
لا لم تنتهي !!
هنالك جزئية متقدمة قليلا ..
مثلا عملنا جدول المدراء .. وبه الاعمدة التالية :
رقم الموظف
اسم الموظف
الراتب
القسم
واردت ان انسخ معلومات المليار مدير في جدول الموظفين !! ماذا اعمل ؟
لدي حلين !!
اما ان اكتبهم واحد تلو الاخر , وهذا الحل مريح جدا كما تعرف
فعملية نقل مليار مدير .. سهلة جدا لمدخل البيانات , وهو مبسوط وفي ثواني ينتهي منها !!!
الحل الثاني وهو ما سوف نستخدمه
الاستفسارات او الاستعلامات الفرعية !
لا عليك من هذا الاسم .. ولا تخف ولا تحزن .. وابشر بالفهم السريع لهذه الاستفسارات الفرعية sub-query
مجرد استفسارات عادية جدا وسوف تدرسها بتعمق شديد لقوتها وبعض تعقيدها !!
اليك النقل السريع في اللا وقت , ونسخ بالملي والسانتي ,
ولاحظ عدم وجود كلمة values في هذا النوع من الجملة !
insert into manager (empno,ename,sal,deptno)
select empno,ename,sal,deptno from emp where job='MANAGER';
في جملة الاستعلام , كأنه لا يقول اعرض كل من كان مهنته=مدير !!
بل يقول اعطي الصفوف التي اخترتها لجملة الادخال !!
يعني اعطي كل من كان مهنته = مدير الى جملة الادخال
لاحظ ترتيب الاعمدة في جملة الاستعلام مطابقة تماما في جملة الادخال !!
هل رأيتها ؟؟ ركز !! لو شقلبنا الترتيب ... حنروح في ستين نيلة ,
انتبه جيدا !!
الان اذا لم تفهم فكرة الاستفسارات الفرعية فلا تخف ... سوف اغطيها ان شاء الله , وسوف تفهمها اكثر
كل ما في فكرتها هي بدلا من اعرض , اعطي !!
وسوف نستخدمها في جملة الاستعلام ايضا !! فهي عظيمة النفع
الان اعتقد انني ارتكبت حماقة !!
ادخلت الموظف BILL في قسم غير قسمه !!
لقد اخطأت !! مالعمل ؟؟ ماذا افعل ؟
اعدله ؟ نعم اعدله !! ولكن كيف ؟؟
الجملة الثانية UPDATE
وهي خاصة بتعديل البيانات للجدول
اعيد واكرر !!
نحن نتعامل في لغة DML مع الصفوف .. مع السجلات !!
هل تفهم ذلك ؟ هل تذكر جملة الادخال ؟؟ كانت تدخل اعمدة جديدة ام سجلات (سجلات = صفوف) جديدة ؟
طبعا سجلات !!
فانتبه لهذه النقطة
الان اريد ان اعدل حماقاتي وان اجعل رقم قسم الموظف بيل الى القسم رقم 70
هل يجوز ؟؟ هل يصلح ؟؟ هل محلل عند اوراكل ام محرم ؟؟
طبعا لا يجوز !!
انت هكذا تعمل جريمة شنيعة بحق codd وبحق قواعد البيانات العلائقية كافة
لماذا ؟ لأنه لا يوجد قسم 70 في جدول الأقسام !!
وانت تعرف مخاطرها .....
الان ... اريد ان اجعله في القسم 30 !! اريد ان اعدله ...
اليك الحل .. جملة التعديل , جملة من اخطر الجمل !! جملة مخيفة فعلا !!
تعتبر الفلم المرعب لكل قاعدة بيانات !!
لماذا ؟ لأنها تصلح اخطائنا بكل سهولة ويسر , وتدمر احلامنا بنفس السهولة واليسر !!
بامكانها ان تعدل معلومات مليارات السجلات في .......... اقل من الثانية !!
وراحت المعلومات في الباي باي ,
الان انظر الى جملة التعديل ... بالعربي
عدل في جدول الموظفين قيمة رقم القسم الى 30 لكل السجلات التي رقم الموظف لديها = 7777
update emp
set deptno=30
where empno=7777;
وسوف تعرض النتيجة
1 row updated.
ياسلام ... صف واحد فقط تعدل !!
جميل ... الان و انا مطمئن , بامكاني ان ارى الجدول ,
الان هل تعرف لو لم نضع جملة الـشرط Where مالذي سوف يحدث ؟؟
سوف يقرأها البرنامج الغبي كما شاهدها ...
عدل في جدول الموظفين قيمة رقم القسم الى 30 لكل السجلات !!
وسوف تعدل جميعها , يعني تخيل تريليون سجل (تريليون = 1000 مليار) كلها سوف تعدل !!
وفي لمحة البصر ,’,’,’,’
فانتبه اخي , والله اني اريد لك الخير ,
اذا تذكرت جملة التعديل , فتذكر معها جملة الشرط !!
عود نفسك المقولة التالية " جملة الشرط مع جملة التعديل , جملة الشرط مع جملة التعديل .........."
جملة الشرط تتحكم في عدد السجلات , وما هي اصلا هذه السجلات فمثلا احد الاغبياء يريد ان يغير معلومات احد الموظفين (لاحظ احد وليس كل )والذي يدعى بـ Bill , المصيبه انه كتب هذا الامر
update emp set deptno=30
where ename='BILL';
ومالذي حدث ؟؟ الذي حدث ان حظه العاثر !! خانه هذه المرة وطعن في الظهر !!
لقد عرضت له هذه النتيجة
3000000 row updated.
ثلاث مليون سجل , قد تعدل
ثلاث مليون سجل , قد تغير
ثلاث مليون بيل قد تعدلت معلوماتهم
وجد انه يوجد 3 مليون موظف يدعى ببيل !!
لم نقل له كل من اسمه بيل !! بل قلنا له بيل الفلان الطيب الشخص الذي اوصافه كذا وكذا !!
انتبه لهذه النقطة !! اختر ما تريده في الشرط وكن حذرا !
الان اريد ان اعدل معلومات كل من اسمه بيل بمثل معلومات الموظف الطيب WARD
نرجع الى الاستعلامات الفرعية , او الاستفسارات الفرعية , او الاستعلامات الجزئية ..... سمها ما شئت ,
لا اريد ان ادوخك الان بها , ولكن للعلم الان ,
تعديل الثلاث مليون بيل (بيل = اسم لموظف وليس اسم لعملة !!) سهل جدا بالكتابة اليدوية , لكن انا لا اعرف معلومات الطيب WARD !! بافتراض انه لايوجد الا موظف واحد يدعى بـ WARD
اكرر ... موظف واحد فقط !! يدعى بـ WARD مثلا !!
كيف اعمل ؟
حلين .... اولا اذهب وارى معلومات الموظف ward ثم انسخ معلوماته على ورق ومن ثم اعدل الموظفين الذين اساميهم بيل بنفس المعلومات
الثاني هو ان استخدم الاستعلامات الفرعية وهي الاضمن !!
لانه في الحل الاول , لو يوجد 1000 عمود , (عمود = حقل) هل بالله عليك انسخهم على الورق قيمة قيمة ؟؟
او انتبه !! لو انك لم تكن تعرف معلومات الرجل الطيب !! ليس لك صلاحية ان تراها !! لا يحق لك ان تعرض معلوماته ... كيف تتصرف ؟
اذن الحل الثاني عملي اكثر و أأمن , وهو يصلح ايضا للحالة التي لا نعرف ماهي قيمها اكرر .... تصلح للحالة التي لا نعرف قيمها مثل انك لا تملك صلاحية رؤية ward ولا تعرف ما هي البيانات والقيم !!
اليك الحل
update emp
set (deptno,mgr)=(select deptno,mgr from emp where ename='WARD')
where ename = 'BILL' ;
Wow.. look at that
طبعا ركز في الاستعلام الفرعي , يقول الاستعلام الفرعي
اعطي رقم القسم و مدير الموظف ward لجملة التعديل ,
وتقول جملة التعديل ...
هاتي يا أيتها الاستعلام الفرعي قيمة رقم الموظف و رقم المدير لكي اعدل رقم قسم ورقم مدير كل من اسمه بيل ,
(اعرف ان لغتي العربية غبية ولكن ................... اكمل يا رجل )
لاحظ تطابق الاعمدة في جزئية set وفي جزئية الاستعلام الفرعي !!
نفس التطابق ونفس الحقول ونفس ما كنا نتوقعه !!
هنا حقلين , وهناك حقلين .
لو شقلبنا الترتيب , لو اضفنا حقل في جزئية واحدة , لو وضعنا عمود زائد في جزئية ... كلها اخطاء لا تغفر .
الان ياسلام ... النتيجة تقول لك هنالك ثلاث مليون بيل (اكرر .. بيل ليست عملة !! بل اسماء موظفين) قد تغيرت قيم مدرائهم و ارقام اقسامهم بنفس قيم الموظف الطيب ward
الان دعك من الاستفسارات الفرعية , بسيطة ولكن لها قوانين وشروط سوف ندرسها بتعمق اكثر .
الان .. اريد ان احذف الموظفين BILL و JONE الذان اضفناهما صباح هذا اليوم ...
كيف ؟
بالجملة الاكثر رعبا من التعديل !! انها الجملة المدمرة !! انها الجملة القاضية !!
انها جملة حذف وتدمير السجلات !!
The Coder
15-01-2006, 11:21 PM
الجملة الثالثة DELETE
وهي خاصة بحذف بيانات من الجدول أي حذف والتهام السجلات ولا شيء غير السجلات !!
نفس فكرة التعديل !!
يجب ان تحذر في وضع الشرط ... لان الشرط هو الذي يحدد مَنْ مِنَ السجلات سوف يتم إعدامه
نريد ان نحذف BILL و JONE
هيا نحذفهما !! لقد خربناهما ولعبنا في قيمهما كثيرا
delete emp
where ename='BILL' or ename = 'JONE';
الذي لا يعرف لماذا الـ or ولماذا لم تكن and فإنا لله وانا إليه لراجعون
الان سوف يحذف لنا كل من اسمه بيل او اسمه جون
وسوف تكون النتيجة
2 rows deleted.
اعيد واكرر .. انتبه للشرط !!
لو لم تضع الشرط , ستنسف ابو الجدول عن بكرة ابيه بقاذفة الصواريخ هذه !!
لو لم تتمعن في اختيار الشرط .. فسوف تذهب ضحايا من السجلات لا ذنب لها
فانتبه اخي ,
هنالك كلمة لا تسمن ولا تغني من جوع .. وهي from يعني بدلا من الجملة السابقة .. نكتبها بهذا الصيغة :
delete from emp
where ename='BILL' or ename = 'JONE';
لو اردنا حذف كل من هم في قسم WARD
لاحظ انني لا اعرف ما هو قسم الموظف ward !!
تخيل انني لا املك الصلاحية لرؤية قسمه !! مالحل ؟؟ مالعمل ؟ الاستفسارات الفرعية ,,,
الجملة كما تلي .. (اذا كنت تطبق فلا تكتب الامر التالي !! )
delete emp
where deptno=(select deptno from emp where ename='WARD') ;
بافتراض انه لا يوجد الا موظف واحد يدعى WARD
لاحظ انني اركز الان في الاستفسارات الفرعية على قيمة واحدة , صف واحد , WARD واحد
سوف تعرف فيما بعد عن الاستفسارات الفرعية .
اريد ان احذف القسم 10 من جدول الاقسام !!
مالعمل ؟
اليك الجملة (اكتبها ولا تخف )
delete dept
where deptno=10;
سوف يرفض البرنامج ذلك ويخبرك انه يوجد سجلات ابناء ,
وهي سجلات موجودة في جدول اخر يدعى بـ emp
فلا يجوز قتل ابيهم السجل صاحب رقم القسم 10 !!
والا فسوف ينتج عن ذلك السجلات اليتيمة ,
ويا عيني على الدرس الخامس لو مافهمت شي ... ارجع اليه !!
الان عرفنا ان نضيف , نعدل و نحذف البيانات .
وانتهينا من لغة الـ DML
ارتكبنا بعض الحماقات فيها , ولكن ... احدكم اخطأ وكتب الامر التالي بكل سهولة :
delete emp ;
واني اراه من الباكين .... واني ارى ان جدوله قد تدمر كليا , ولا يستطيع الان ان يطبق معنا
مسكين يا هذا ...
ولكن لا تخف !!
لا تقفل البرنامج يا رجل !!
انتظر !!
يوجد امر التراجع !! انتظرررررررر !!!!!
يظهر انني تأخرت كثيرا ..... المسكين اقفل وذهب الجدول سدى !!
هنالك اخر لم يقفل بعد بالرغم من انه يائس هو الاخر ,
اقول له ...تهانينا .. تستطيع ان تتراجع عن الحذف والتعديل
وذلك عبر لغة التحكم بالعمليات .... سوف نقفز اليها مباشرة ....
3- التحكم بالعمليات (Transaction Control)
هذه خاصة بتثبيت وحفظ العمليات ... او التراجع عن بعض العمليات ..
نقصد بالعمليات ماذا ؟؟عمليات استئصال القلب ؟؟ شرايين ؟؟
العمليات هي على سبيل المثال عمل جدول , اضافة حقل , حذف سجل , اضافة بيانات , تعديل البيانات .....
هذه هي العمليات ... هل فهمت ؟
اولا :COMMIT
هذا يحفظ العمليات التي قمت بها
فمثلا قمنا باضافة احدهم , ثم حذفنا اخر , ثم عدلنا ثالث ....
ثم كتبنا هذا الامر ... فسوف يتم حفظ ما فعلناه ,
في الحقيقة هذا الامر يكتب اوتوماتيكي اذا كتبنا الامر التالي :
SQL>EXIT
أي خروج , لذا فتنبه لهذه النقطة .
لو مثلا لم تكتب الامر EXIT , وضغطت على علامة X الموجودة في اعلى النافذة (الصورة 1001)
http://img9.picsplace.to/img9/6/1001.jpg
فسوف لن يحفظ لك العمليات التي عملتها .. جرب واضف موظف , ثم اغلق البرنامج من علامة الـ X ,
عندما تفتح البرنامج , وتبحث عنه فسوف لن تجده لانك لم تحفظ العملية .
ثانيا :ROLLBACK
هذا يقوم بالتراجع عن ما فعلته من عمليات ,,
احذر !! لو مثلا حصل ما يلي :
قمت صباحا
شغلت البرنامج
اضفت موظف اسمه احمد ,
عدلت اسمه من احمد الى خالد ,
عدلت اسمه من خالد الى سامي
ثم كتبت ROLLBACK
فمالذي يحدث ؟؟
ماهو اسم الموظف الان ؟؟ وهل يوجد الموظف المضاف قبل قليل اصلا ؟
بالطبع لا ....
لايوجد موظف ,لاننا تراجعنا عن كل العمليات !!
طيب لو مثلا حصل مايلي :
قبل النوم .....
شغلت البرنامج
اضفت الموظف عبدالله
عدلت اسمه من عبدالله الى محمد
كتبت الامر commit
عدلت اسمه من محمد الى مصطفى
ثم كتبت الامر rollback
فمالذي سوف تتوقعه ؟؟؟ وهل يوجد الموظف الذي أضفته قبل قليل اصلا ؟ وما اسمه ؟
انتبه !! سوف يكون الموظف موجود , واسمه .......
ليس مصطفى !! بل اسمه محمد !!
لان الـ rollback ترجع لآخر نقطة تم الحفظ فيها , ونحن أضفنا عبد الله ثم سميناه بمحمد ثم حفظنا ثم عملنا بعض العمليات
ولما تراجعنا , فسوف نتراجع للنقطة الأخيرة عند الحفظ !
الان تخيل معي المنظر :
1- اضفنا الموظف سامي
2- عدلنا اسمه الى خالد
3- غيرنا رقمه
4- غيرنا قسمه
5- اضفنا موظف اخر اسمه عبدالله
6- حذفنا خالد
7- حذفنا عبدالله
تخيل اننا نريد ان نرجع الى النقطة 3
او تخيل اننا نريد ان نرجع الى النقطة 5
أو تخيل اننا بعد ان رجعنا الى النقطة 5 نريد ان نرجع الى النقطة 2
لا تنفع اذن commit لكي تكون نقاط حفظ !!
بل تنفع كحفظ نهائي لا رجعة له ,لذا نريد نقاط حفظ مؤقته .. مالعمل ؟؟؟ ماذا نفعل
اليك الامر التالي
SQL>SAVEPOINT A
وهذا الامر يخبرنا اننا حفظنا بشكل مؤقت , واسم النقطة هي A
الان انظر كيف القصة تغيرت (القصة=story وليس القصة التي في مقدمة الرأس !!)
1- اضفنا الموظف احمد
2- اضفنا الموظف خالد
3- SAVEPOINT the_add
4- عدلنا اسم احمد الى محمد
5- عدلنا اسم خالد الى سامي
6- SAVEPOINT the_update
7- حذفنا محمد
8- حذفنا سامي
9- savepoint the_delete
10- اضفنا الموظف سليم
الان لو كتبنا الامر ....
SQL> ROLLBACK TO the_delete
فسوف نرجع للنقطة التاسعة !! يعني كأننا لم نضيف سليم .
الان وبعد ان تراجعنا الى النقطة التاسعة .....
نريد ان نرجع الى النقطة السابعة .. نستطيع ؟؟ لا نستطيع
الان لا وجود للموظفين محمد وسامي
نستطيع ان نعود الى النقطة السادسة ... عبر الامر التالي :
SQL> ROLLBACK TO the_update
واو .. الموظفين موجودين الان !!
تذكر .. نحن الان في أي نقطة ؟؟ في النقطة السادسة .. والتي تسمى بـ the_update
الان لدينا خيارين .. اما ان نعود الى البداية او الى النقطة التي تسمى the_add والتي تتواجد في النقطة الثالثة
اعيد واذكرك الان ... اننا في النقطة السادسة !
كيف نرجع للبداية .. بكتابة الامر التالي :
SQL> ROLLBACK
كيف نرجع لنقطة the_add ؟؟ بكتابة الامر التالي :
SQL> ROLLBACK TO the_add
تخيل اننا قفزنا من النقطة السادسة (التي نتواجد بها حاليا ) الى نقطة البداية !! بكتابة الامر السابق ذكره ....
هل يتواجد موظفين احمد و خالد ؟؟
طبعا لا !
هل نستطيع الرجوع الى النقطة التاسعة ؟؟؟
طبعا لا !!!! انتبه .... انتبه جيدا !!
الان تخيل اننا في النقطة السادسة .. هل نستطيع العودة للنقطة المستقبلية وهي التاسعة !؟ لا لا نستطيع !!
تخيل اننا في النقطة الثالثة ... هل نستطيع التقدم الى المستقبل وان نذهب الى النقطة السادسة ؟؟ لا !!
هل فهمت ؟؟
اذن .....
هي نقاط تخزين مؤقته .... تنفعنا كثيرا وتخدمنا كثيرا , فلا تنساها ابدا ... لعلك تتندم يوما على عمل شيء ... فتتذكر انك عملت نقطة تخزين وترجع اليها , فسوف تفرح كثيــــــــــــــــــرا صدقني ,’,’,’,’,’,’,’
الان انتهينا من لغة الـ DML و لغة التحكم بالعمليات .... تقريبا ...
سوف نواجه بعض الامور فيهما , وسوف نرجع اليهما اذا لزم الامر ....
الان ... عرفنا ان نضيف نعدل ونحذف بيانات (سجلات بكلمة اخرى) في جدول ما ... ولكن كيف نضيف حقول !! مثلا
او كيف نضيف جدول اصلا !! طبعا عبر لغة تعريف البيانات .
4- لغة تعريف البيانات (Data Definition Language) اختصارها DDL
وهي التي تخص بتعديل , حذف او إضافة و إنشاء الجداول وخصائصها (الاعمدة) وعلاقاتها ..
هذه اللغة طويلة الى حد ما ... فانتبه ,
وتنبه لشيء اخر , وهو الحفظ !! سوف تتشتت كثيرا , لذا حاول ان تعمل عملية الفهرسة (التلخيص الذاتي) لكي لا تتشتت ,’,’,’,’,’
- البيانات ... وما أدراك مالبيانات .
هي القيم ... الموجودة في الجداول , والتي اما ان تكون أرقام , تواريخ , نصوص
الان اريدك ان تنسى أرقام تواريخ نصوص !!
وأريدك الان ان تتعرف الى أنواع البيانات الحقيقية في الأوراكل !!
The Coder
15-01-2006, 11:25 PM
اولا : Char وهو الخاص بالنصوص ....
اذا قال لك ان حقل ENAME من نوع CHAR(10) مثلا , فماذا تعني ؟؟
تعني ان الحقل ENAME نوعه نص , ويستوعب كحد أقصى 10 حروف للاسم الواحد !!
طيب واحد اسمه LEE هل يستوعبه ؟ نعم .... لأنه اقل من او تساوي 10
طيب واحد اسمه SADFJAPJFASDPJF هل يستوعبه الحقل ؟ لا يستوعبه لان الحروف اكبر من 10 ...
ثانيا : Varchar2 هذا الخاص بالنصوص ايضا ...
نفس الفكرة تخيل ان حقل ENAME من نوع VARCHAR2(10) فهذا يعني انه يستوعب 10 حروف للاسم الواحد .
في الحقيقة ... انه بينهما فرقين ... الفرق الاول .. الحجم ,
الـ char يأخذ كحد أقصى 2000 حرف أي اننا لو قلنا CHAR(2000) فهو صحيح , ولو قلنا CHAR(2001) فهو خطأ ,مالحل ؟؟ مالعمل ؟؟ نريد 2001 حرف !! مثلا لحقل العنوان !! .... الحل هو الـ varchar2 والذي يأخذ كحد أقصى 4000 حرف
الفرق الثاني , في الحقيقة انني لم افهمه , لأنه اولا لا يوجد عليه مثال في منهجين مختلفين !! يقولون ولا يمثلون او يشرحون , لذا فسوف ابحث فيها فيما بعد ان شاء الله , لن يرتاح لي بال حتى ارى ما كان قصدهم فيه !! فانتظرني .
ثالثا : number
وهي للأرقام طبعا , مثلا حقل الرواتب SAL فهو من نوع NUMBER(7,2) أي يكتب بهذه الصيغة :
Sal number(7,2)
ما معنى السبعة وما معنى الاثنين ؟؟؟؟
معنى السبعة ان حده الأقصى سبعة أرقام !!
اما معنى الاثنين فهو كم عدد بعد الفاصلة العشرية ؟
أي بمعنى اخر العدد :
99999.99
عدد مقبول وهو صحيح .. لماذا لانه سبعة ارقام ..... عدها ... هل عددتها ؟
منها رقمين عشريين ...
طيب احدهم اضاف الى الحقل sal هذا الرقم :
999999.9 هل هذا صحيح ؟؟
طبعا خطأ !!
لماذا ؟؟ صحيح انه سبعة ارقام .. ولكن يجب ان تنظر انه حدد خمسة ارقام للاعداد العشرية !!
كيف ؟
نحن قلنا ان حقل sal من نوع number(7,2)
يعني 7-2=5
خمس اعداد صحيحة كحد اعلى ....
وعددين عشريين (الاعداد العشرية هي الاعداد التي يمين الفاصلة ) سوف يعرضان فقط !!
يعني اكبر عدد بامكاننا ان نضعه هو 99999.99 واصغر عدد طبعا 0.00
لو وضعنا مثلا 100000.00 فهو خطأ !!
طيب احدهم اضاف الى الحقل sal هذا الرقم :
9999.999999999 هل هذا صحيح ؟؟
في الحقيقة انه صحيح لماذا ؟؟ ما هو السبب ؟ الم نقل ان حد الاعداد العشرية رقمين ؟؟
لماذا هذه صحيحة و شكلها خطأ !!
انا اخبرك ....
نحن حددنا ان الاعداد العشرية عددين صح ؟
طيب هو اوتوماتيكيا اذا شاهد اكثر من عددين عشريين فسوف يقربه !!
يقربه كيف ؟
انت قلت اننا وضعنا كحد اقصى عددين عشريين صح ؟
طيب انظر العدد هذا :
1.214235
سوف ينظر كم حددنا من اعداد عشرية ...
سوف يرى انها اثنين ,
سوف يرى العدد الثالث وهو الرقم 4
اكبر من او يساوي الخمسة ؟؟ لا
اذن كل الاعداد التي يمين العدد الثالث بما فيهم العدد الثالث ..... قص !!
ويصبح العدد 1.21
وسوف يخزن كما هو .... 1.21
طيب مثال اخر ....
1.425167
ينظر كم حد الاعداد العشرية ..
يجدها اثنين ....
ينظر الى العدد الثالث وهو الخمسة ....
هل اكبر من او يساوي خمسة ؟؟ نعم !!
اذن قص العدد الثالث وكل الاعداد التي يمينه واضف واحد للعدد الثاني
يصبح الناتج : 1.43
الان تخيل واحد قال
Sal number
ماذا يعني ؟؟ يعني ان الحقل sal يستوعب عدد ضخم من الارقام يصل الى 127 رقم ... هل تعرف ما معنى 127 رقم ؟؟؟؟
يعني 99999999999999999......... افففف ... تعبت وانا اكتب !!!
يعني مئة وسبعة وعشرون ...... رقم تسعة بامكاننا ان نضعها !!
اما الاعداد العشرية . فحدث ولا حرج ...... لذا فهو يقرب بطريقة معقدة قليلا فتجاهل الوضع ....
الان ..... لو عندنا حقل ... أي حقل ... اسمه وليكن any_column وهو رقم ...
اذا كنت تريد عرضه بشكل عادي ..... فاجعل دائما الاعداد العشرية اصغر من الاعداد الصحيحة ...
يعني المثال التالي صحيح
Any_column number(10,9)
اما لو وضعت :
Any_column number (9,10)
فمالذي سوف يحدث ؟؟
هذا تحدي ثاني !! للمساعدة .. اعمل جدول جديد (سوف تعرف كيف في هذا الدرس )وبه هذا العمود واجلس جرب .. اضف قيم من عندك .....
رابعا : date
وهو التاريخ , وما أدراك مالتاريخ , يستوعب أوتوماتيكيا 14712 ما قبل الميلاد الى 319999 ميلادي ...
كيف اتوماتيكيا ؟ يعني بدون ان نحدد له حد .. مثل ما فعلنا سابقا في CHAR(2000) مثلا , هو يكتب مجرد DATE.
خامسا : LONG
مثلا اريد حقل يتكون من اكثر من 4000 , هل استخدم معه VARCHAR2 ؟؟؟ طبعا لا
تستخدم الـLONG وطبعا لا يمكن تحديد عدد معين مثل CHAR(40) ولكن يكتب كما هو مجرد LONG مثل الـتاريخ .
الـ LONG يصل حده الى اكثر من 2000000000 (اثنين مليار) حرف !!!
لا اعلم لماذا وضعوه ولم اشاهد حقل نوعه LONG ولا اعتقد انني سوف اشاهده , لانه اكيد للمشاريع الضخمة جدا .
يكفي عليك هذه الانواع , ولا اخفيك انه يوجد اربع او خمس اخرى , ووالله لا اعرف اصلا في أي شيء تستخدم , ولكن لو تفرغت فسوف ابحث فيهم . ولكن معظمها للحقول ذو كمية استيعاب ضخمة جدا لأغراض الصور والرسومات كبيرة الحجم .
الان نرجع لمحورنا الرئيسي .
الجداول ...
الان نستعرض أوامر لغة DDL
DESC : لاستعراض بناء جدول ما .
CREATE TABLE : لإنشاء الجداول .
ALTER TABLE : للتعديل في بناء الجدول .
RENAME TABLE : لتعديل اسم الجدول
DROP TABLE : لحذف الجدول نهائيا .
TRUNCATE TABLE : لحذف السجلات !!؟؟
COMMENT : لاضافة التعاليق التذكيرية على الجداول والاعمدة .
"واو .. كثيرة ... معقدة .. صعبة !!
ماذا تفعل .. اترك الأوراكل ... انها صعبة جدا !! "
هذا قول بعضكم , انهم سارقو الطاقات !! انهم المحبطون لأنفسهم و محبطون لمن بجانبهم .... انهم الهاضمين لحقوق انفسهم .... انهم المتشائمون .
تالله انها بسيطة , وسوف نسردها على السريع الطاير , ولن نكثر فيها الكلام لانها .... منطقية بالنظر ..
أي مشاكل راسلنا او اعرض مشكلتك في موضوع الاستفسارات .
الان ... نبدأ على بركة الله
الامر DESC :
ما رأيك في الجدول DEPT ؟؟؟
هل تذكره ؟؟؟
اعتقد ان له بعض الحقول منها DEPTNO وهو رقم , ولكن لا اعرف كم يستوعب , مارأيك ؟؟؟ هل نشاهد ذلك ؟ لنشاهد ذلك :
DESC DEPT;
الامر الخاص بالكشف عن تركيب وبناء الجداول .. استخدمناه مع الجدول DEPT
والنتيجة كانت :
Name Null? Type
-------- -------- -------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
هل فهمت شيء ؟؟
يستعرض هنا اسماء الحقول NAME في الجدول DEPT
وهل هذا الحقل من الممكن ان يكون فارغا ام لا NULL?
ويستعرض ايضا نوعه TYPE , هل رقم هل نص , وكم يستوعب !!
لاحظ انه في الحقل DEPTNO يقول انه ليس من الممكن ان يكون فارغا (NOT NULL)
هل فهمت ؟
كيف اعرف ما اذا كان الحقل الفلاني مفتاح اساسي ام اجنبي ؟؟؟؟؟؟؟ هذا ما ستعرفه في الدرس القادم , ترقب
هذا كل شيء ,’,’,’,’
ماذا تنتظر ؟؟؟ هيا جرب وانظر الى الجدول EMP وانظر بنائه وتركيبه .
الامر CREATE TABLE:
مثلا اريد ان أنشئ الجدول التالي :
اسم الجدول : DEP
حقول الجدول :
DNO NUMBER(1)
DNAME VARCHAR2(10)
LOCATION VARCHAR2(12)
طبعا انا انتقيت الحد الاقصى لاسم الاقسام 10 حروف ..
وانتقيت الحد الاقصى للموقع .. وهو 11 حرف ..
وطبعا رقم القسم جعلته رقم .... أي يستوعب 1 أو 2 أو ...... 9 فقط .
بالله عليك هل تعتقد ان هذه الارقام اتت عبطا ؟؟؟
طبعا بالمنطق فكر ... ما هو الاسم الاطول الذي من الممكن ان يكون في هذا الحقل ؟
يعني مثلا رقم القسم ... لو جعلته ثلاثة ارقام , هل ينفع ؟؟ طبعا ينفع , ولكن لماذا اجعله ثلاث ارقام (ثلاث ارقام أي كحد اقصى 999) وانا اعرف انه لا يوجد لدي الا بضع اقسام يمكن اربع او ستة اقسام ... واذا كثرت تسعة اقسام كحد اقصى ؟؟
لماذا التهم الذاكرة وابطيء من عمل النظام ؟؟ لا تستغرب !! تخيل اننا نلعب في نظام ضخم جدا , وبه مليارات السجلات , وانت تأتي يا باش مهندس , وتضيف خانة رقم او خانتين على الفاضي بدون أي تفكير منطقي ؟؟؟
مالذي تتوقعه ان يحدث ؟؟
انتبه لهذه المسألة .
الان نريد ان نعمل الجدول السابق ... اليك الامر :
create table dep (
dno number(1),
dname varchar2(10),
location varchar2(11) );
والنتيجة :
Table created.
كأنه يقول "اعمل جدول dep وبه الاعمدة التالية ......."
صعب ؟؟ جدا معقد !!
هيا انظر الان الى تركيبته وبناءه عبر الامر desc , واستمتع بمشاهدة اول جدول تعمله ^^ .
عظيم جدا ....
الان .... انتبه جيدا ... الجزئية التالية صعبة قليلا ...
الان ... نريد ان نعمل جدول يدعى بـ EP مثلا .....
اريده مثل الـ emp .... في بعض الحقول .. وفي جميع السجلات ...... ماذا اعمل ؟؟
اريد ان انسخ حقول وسجلات الجدول emp في جدول جديد يدعى بـ EP مثلا ,
لماذا ؟؟ لا تسألني لماذا ..
كل ما اريده هو ان اعمل نسخة احتياطية سرية لجدول الـ emp في جدول يدعى EP , ماذا اعمل ؟؟
هل نستطيع فعل ذلك ؟؟ هل تتخيل معي الوضع ؟؟ هل من الممكن ان انسخ جدول كامل بكل مافيه .. من سجلات واعمدة في جدول اخر في امر واحد فقط ؟؟؟ الان نرى ذلك .
The Coder
15-01-2006, 11:31 PM
اليك الأمر .... كأننا نستخدم الاستفسار الفرعي .. هل تذكره ؟؟
create table ep
as
select * from emp ;
يالله .... الان اكتب جملة الاستعلام التالية .. وانظر مالذي حدث !!
select * from ep;
سوف تشاهد نفس ما تشاهده في الجدول emp
ياسلام ... والله تقنية رائعة ..
انظر الاستفسار الفرعي (select * from emp) كأنه لا يقول اعرض !! بل يقول ضع النتيجة في الجدول الجديد !!
والله عظيمة هذه الاستفسارات الفرعية ..... وقوية الطريقة هذه ....
اولا عمل جدول ..
ثم عمل الحقول .. أوتوماتيكيا ...
ثم وضع السجلات ... أيضا أوتوماتيكيا !!
يعني تخيل لو قلت لك انقل كل معلومات الجدول emp يدويا ... كم تأخذ ؟؟ هذا وهي 14 سجل تقريبا .
متى نستخدم هذه الطريقة ؟ أو لماذا نستخدمها ؟؟
اذا كنا نريد ان نعمل نسخة احتياطية لجدول ما !!
اذا كنا نريد ان نعمل جدول مبسط من بعض الحقول ... مثلا نريد ان نعمل جدول يشبه لجدول الموظفين ولكن اريد ان تكون حقوله ename و empno فقط على سبيل المثال
اريد الان ان اعمل جدول .... ولكن به حقلين .. ename و empno الموجودين في جدول الـ emp
صراحة .. اريد ان اسميهما هذان الاسمان eno بدلا من empno , و nameبدلا من ename
لاحظ .. انتبه ... توقف !! ....
اني ارغب في السجلات جميعها ولكن اريد وضع هذان الحقلان فقط .....
نفترض ان اسم الجدول .... مممممم .... وليكن emp_2
create table emp_2 (eno , name)
as
select empno,ename from emp ;
انظر كيف اخترنا اسماء الاعمدة في جدولنا الجديد ... صحيح نفس قيم الجدول emp
صحيح نفس السجلات .. ولكن اسماء اخترناها من رؤوسنا !! ياسلام على المرونة ...
لاحظ انني وضعت eno اولا ثم name
وفي الاستفسار الفرعي وضعت empno اولا ثم ename
وكانني اقول .. الاول مع الاول .. والثاني مع الثاني .. وهكذا ... يعني طابق الترتيب .. مهم الترتيب !!
الان اليك التحدي الثالث
اريد ان اعمل جدول يسمى بـ annual_emp_30
وبه الحقول التالية
Eno
Ename
Sal
Annual_sal
The_date
الـ Eno هو نفس الحقل الذي يدعى بـ empno في جدول الموظفين
الـ annual_sal هو عبارة عن sal*12
الـ the_date هو نفسه الـ hiredate في جدول الـ emp
الجدول به نفس سجلات جدول الموظفين ولكن ليس كل السجلات !! بل فقط سجلات موظفي القسم 30 .....
ماهو السؤال ؟؟؟ أعطيني يا نظر عيني الامر اللازم لعمل هذا الجدول ولكن بطريقتين مختلفتين !! انا ذكرت طريقة واحدة .. وتوجد طريقة اخرى قد درسناها منذ زمن !! ماهي ؟
الامر ALTER TABLE :
ارتكبت حماقة !!
لم ارغب في الجدول dep كما كان في السابق ..
لقد واجهتني عقبة !!
لقد واجهت اسم قسم يمتد الى 20 حرف !!
وانا وضعت 10 حروف كحد اقصى !!
حماقة اخرى عملتها !!
لا يرغب المدير في الحقل location اريد حذفه ... مالعمل
حماقة ثالثة !!
نسيت حقل قد طلب مني .... وهو :
Dep_code varchar2(20)
وهو كود خاص للقسم ... له اغراض امنية لا اعرف ما بداخله .
نسيت ان اضيفه !!
مالعمل ؟؟ من المنقذ ؟؟ من يستطيع عمل كل ذلك ؟؟
دعنا الان نعدل الحقل dname ونجعله يستوعب 20 حرف .
alter table dep
modify (dname varchar2(20) );
دعنا الان نحذف الحقل location
alter table dep
drop column location ;
الان سوف نضيف الحقل الجديد .....
alter table dep
add(dep_code varchar2(20));
هل شاهدت الحذف , التعديل , الاضافة ؟؟
سهلة جدا .... كلها تندرج تحت الامر ALTER TABLE .... سوف اشرحها ببعض التفصيل بعد قليل ....
الان لدينا جدول dep ... واريد ان اضيف فيه بعض القيم ....
أي قيم ولتكن مايلي :
insert into dep values (1,'any_name','10150115');
مارأيك ان نستعرضه ؟
select * from dep ;
DNO DNAME DEP_CODE
--- -------------------- ---------
1 any_name 10150115
شكله جميل .... هل ترى الحقل dep_code ؟؟ من الافضل ان يكون رقم ... مارأيك ؟
هل نستطيع تعديله ؟ طبعا !!
alter table dep
modify (dep_code number) ;
(لاحظ ان number لم نحدده بحد اقصى ...)والنتيجة كانت .....
ORA-01439: column to be modified must be empty to change datatype
يقول لي ... يجب ان يكون الحقل لايوجد به بيانات ...
الدالة تريد ان تحول من نص الى رقم .... ولكن يوجد بيانات .....
فهي خائفة ان تحول ... ويكون هنالك بيانات نصية فيها ABC وحروف اخرى .....
ولما تحوله الى رقم ... تتفاجئ بهذه القيم ...
فاذا كنت تريد ان تحول من نص الى رقم ... او تاريخ الى نص ........ الخ
فيجب ان يكون الحقل فارغ !!
الان انا مصر على ان يكون هذا الحقل عدد ... ماذا اعمل ؟؟
اريد ان اجعل الحقل فارغ ... بدون ان المس البيانات الاخرى في الحقول الاخرى كيف ؟؟؟
هل تعرف ؟؟ فكر .......
بسيطة .... اليك الامر !!
update dep set dep_code =null;
فقط ..... هذا كل شيء ....
صعبة ؟؟؟ مستحيلة ؟؟ فكر بمثل هذه الطرق .....
الان كل القيم بهذا الحقل ... فااااارغة ... اما البيانات الاخرى لم نمسسها بسوء .
الان نغير نوع الحقل ..... وقلوبنا مطمئنة ...... ولم يدمر طموحنا شيء :
alter table dep
modify (dep_code number) ;
الان لو كان عندنا أي حقل من نوع varchar2 واردنا تحويله الى char هل يلزم ان نفرغ بيانات الحقل ؟؟
لا .... لا يحتاج ذلك لانه من نص الى نص .. فلا داعي لافراغ البيانات .
The Coder
15-01-2006, 11:36 PM
طيب ... عرفنا ان الـ dname هو نص حده 20 حرف ..
واضفت النص التالي : any_name
صحيح ؟
كم حرف هذا النص ... ثماني حروف ...
وهو اكبر عدد موجود في هذا الحقل .. اكرر اكبر حقل موجود !!
واردنا ان نعدل ونقلل الحقل dname الى 10 حروف .. هل يجوز ؟؟
طبعا يجوز .. لان اكبر عدد حروف موجود في الحقل هو ثمانية ....
اردنا ان نقلل الحقل dname الى 5 حروف .. هل نستطيع ؟؟
لا ... لا نستطيع ... سوف تعرض لنا الرسالة التالية :
ORA-01440: column to be modified must be empty to decrease precision or scale
أي ان هنالك بيانات في الحقل .. حروفها اكثر من 5 حروف !!
لذا لا يجوز ان تقلل من حجم الحقل .. والا فسوف تفقد البيانات !!
ياسلام ... هذه البرمجة على الاصول .
انا لم اكتفي بعد .. اريد ان احذف جميع الحقول ... اريد ان اخرب الجدول ...
alter table dep
drop column dep_code;
Table altered.
alter table dep
drop column dname;
Table altered.
alter table dep
drop column dno;
ORA-12983: cannot drop all columns in a table
اوبس ... لم استطع حذف كل الاعمدة ؟؟
ممممم يظهر انه يجب ان يكون عمود واحد على الأقل في الجدول ... انتبه لهذه النقطة .
كما شاهدنا ان الامر ALTER TABLE يستطيع عمل الثلاث عمليات (إضافة , حذف , تعديل )
وهو متخصص في الحقول (الاعمدة) وتركيب الجدول كما شاهدنا .....
بخلاف الأوامر التي في DML والتي تخصصت في السجلات والبيانات التي فيها .
هنالك نقطة... لا يمكنك التراجع عن الحذف او الإضافة او التعديل في لغة الـ DDL!!
الان سوف تدخل في تسمية الجداول ....
الامر RENAME TABLE :
اسم dep لا يعجبني ...... اريد تغييره الى depart!!
... اليك الامر
rename dep to depart;
يا الله !
صعب جدا هذا الامر !
معقد لدرجة انني سوف اتركه الان وانتقل الى الامر التالي .
الامر DROP TABLE :
اريد قتل الجدول dep ... اااقصد depart .
لا اريده ... اريد امحاء كل ما فيه ...
كيف ؟ يقفز احدكم ويقول ... بسيطة , نعمل الامر التالي :
delete depart;
وينتهي كل شيء !!
اقول تعال يا سيدي , انت حذفت السجلات , ولكن مازال الجدول موجود , والدليل هو :
select * from depart;
سوف يخبرك انه لا يوجد سجلات به ....
no rows selected
أي انه مازال موجود !!
أي انه لم يتم حذفه نهائيا !!
اريد هذه الرسالة بدلا من السابقة :
ORA-00942: table or view does not exist
ينفي تماما انه لا يوجد جدول !!
اليك الامر .... والذي يعد اقوى وابشع وافضع القتلة !!
والذي اخطر من امر delete و update
والذي لا رجعة في قتلته !!
انه drop table
سوف يقتل الجدول ... ويقتل البيانات عن بكرة ابيها !! حتى لو كانت مليارات البيانات !!
سوف يمحو جميع الروابط المرتبطة بالجدول ... سوف و سوف و سوف .....
انتبه جيدا يا فتى .. انت تلعب بمستقبل أمم !! انظر الى تركيبته البسيطة جدا جدا جدا ....
drop table depart ;
سوف يمحوه عن ارض الواقع وبكل هدوء ..... الى اللقاء يا depart ... فلن نراك ثانية .
Table dropped.
(هيا اذهب وامسح جميع الجداول التي عملناها في هذا الدرس فلن نحتاجها !! .... لا تمسح emp والجداول المهمة الأخرى !!)
الامر TRUNCATE TABLE :
هذا الامر نفس الامر الموجود في اللغة DML ولكن يختلف باختلافين ..
لا رجعة فيه ....
وانه يحرر سعة التخزين !! ....
نعرف انه لا رجعة فيه لانه من اوامر DDL , ولكن غير موضح ما معنى انه يحرر سعة التخزين !!
لذا فسوف اسأل عنها وما معناها تماما !! فانظرني واعذرني .
truncate table e;
وسوف تذهب جميع السجلات في الباي باي مع بقاء الجدول .
لايوجد هنا شرط ولا هم يحزنون .. فقط حذف كل السجلات .
الامر COMMENT
("")انتبه للتهجئة !! ليست مثل commit
انها comment أي تعليق ...
الم تشاهد اذا قال احدهم لا تعليق بالانجليزي ؟
طبعا يقول NO COMMENT
تعرف ... انت الان ماشاء الله عليك حافظ جداولك جدول جدول ...
وعارف الحقول كلها حقل حقل ...
وكما تعرف ان الحقول والجداول أسمائها خلفة !!
خلفة أي شكلها عبيط !!
تأتي وتنظر الى emp ..... بالله عليك هل هذه اصلا كلمة في قاموس الانجليزية ؟؟
ويأتي الاخر بعمود empno .... لو قلتها لاحد الأمريكيين على سبيل المثال ... لا يعرف عما تتحدث ...
بالمختصر المفيد ...بعد ستين سنة ... تأتي المخابرات الفيدرالية تطالبك ببعض المعلومات السرية التي عملتها في عام 2006 ....
وتأتي انت وتعرض emp وتعرض sal ..... للاسف
بعد ستين سنة سوف تعرف كل شيء ... ولا يتبقى عليك الا تذكرها اصلا !!
يعني سوف تنسى .... صدقني سوف تنسى السنة القادمة اذا ربي أحيانا معظم الحقول والجداول .. فما بالك بعد ستين سنة ؟؟؟!!!
مالحل ... مالعمل ....
الحل هو COMMENT تعليق .... ملاحظات ... هذه ما سوف تتذكره ....
الاوراكل عملت لك اربع جداول محترمة للتعاليق !!
انت اضف التعليق الذي تريده , واستعرضه من تلك الجداول الأربع .
الان اريد ان اكتب عن الجدول emp معلومة ...
أي انه جدول خاص بمعلومات الموظفين ..... هيا لنكتب ذلك ...
COMMENT ON TABLE EMP
IS 'THE_INFORMATION OF EMPLOYEES';
هل شاهدت النص !!! .... هو إضافة تعليق لجدول الموظفين ..
الان نضيف لأحد الاعمدة ... وانت اضف للاعمدة الباقية .... اوكيه !!
COMMENT ON COLUMN EMP.EMPNO
IS
'THE NUMBER OF EMPLOYEES ... IT IS PRIMARY KEY ';
هنا شيء جديد !!
لماذا ذكرنا اسم الجدول هنا ؟
كأنه يقول ان العمود empno الخاص بالجدول emp , هل فهمت !!
لو مثلا عندنا جدول يدعى بـ emp_2 وبه حقل يدعى empno , بالله عليك كيف يفرق الأوراكل بينهما !!؟؟
انظر كيف التكنيك , اريد الحقل empno الذي في جدول emp_2 اكتبها هكذا :
Emp_2.empno
اريد الحقل empno الذي في جدول emp اكتبها هكذا :
Emp.empno
هذا التكنيك هو الذي سوف نعتمده فيما بعد , فافهمها الان .
انتهى التعليق ...... وانتهينا من ddl
اوه اسف نسيت الجداول الاربعة !!
طبعا اريد ان اتحدث قليلا عن المستخدمين , فنحن الان ندخل بمستخدم يدعى scott ,
هذا المستخدم لديه جداول خاصة به هو لوحده , ولا احد يراها غيره والمدير او من له صلاحيات اكبر .
اذا كان هنالك مستخدم اخر اسمه مثلا abc ولديه هو الاخر جداول , هل استطيع ان اراها واتعامل معها ؟
بالطبع اذا كانت لدي صلاحية اعلى .
الان كل ما اريده منك معرفة انه يوجد جداول لكل مستخدم خاصة به .
نرجع لموضوعنا وهو الجداول الاربعة , وهي جداول خاصة بالتعاليق .
The Coder
15-01-2006, 11:47 PM
user_col_comments وهو جدول به تعاليق comments الاعمدة , والخاصة بالمستخدم الحالي
all_col_comments وهو جدول به تعاليق الاعمدة والخاصة بالمستخدمين اجمعهم
user_tab_comments وهو جدول به تعاليق الجداول والخاصة بالمستخدم الحالي
all_tab_comments وهو جدول به تعاليق الجداول والخاصة بالمستخدمين اجمعهم
يعني ايش المستخدم الحالي ؟
يعني انت الان تدخل بمسمى Scott , و اسكوت هذا هل هو طيارة ؟ صاروخ ؟؟
بل مستخدم . انت دخلت بهذا المستخدم , اذن المستخدم الحالي الذي انت عليه هو Scott
هيا لننظر الى تعاليق جداول الرجل الطيب Scott , ولكن اولا دعنا نرى بناء الجداول الاربعة .
desc user_col_comments;
Name Null? Type
----------------------------------- -------- ---------------
TABLE_NAME NOT NULL VARCHAR2(30)
COLUMN_NAME NOT NULL VARCHAR2(30)
COMMENTS VARCHAR2(4000)
desc all_col_comments;
Name Null? Type
--------------------------- -------- --------------
OWNER NOT NULL VARCHAR2(30)
TABLE_NAME NOT NULL VARCHAR2(30)
COLUMN_NAME NOT NULL VARCHAR2(30)
COMMENTS VARCHAR2(4000)
desc user_tab_comments;
Name Null? Type
---------------------------- -------- --------------
TABLE_NAME NOT NULL VARCHAR2(30)
TABLE_TYPE VARCHAR2(11)
COMMENTS VARCHAR2(4000)
desc all_tab_comments;
Name Null? Type
---------------------------- --------- --------------
OWNER NOT NULL VARCHAR2(30)
TABLE_NAME NOT NULL VARCHAR2(30)
TABLE_TYPE VARCHAR2(11)
COMMENTS VARCHAR2(4000)
الان بامكانك ان ترى جميع التعاليق الخاصة بالمستخدمين جميعهم , والتي على الجداول ...
ولكن لا تنسى انها سوف تكون ضخمة !!
لذا يفضل ان تكتب اولا :
set linesize 10000;
والان تعاليق المستخدمين على جداولهم (اعتقد ان لدى اسكوت الصلاحية لرؤيتها )
select * from all_tab_comments ;
النتيجة ضخمة !! طلعت عندي اكثر من 1600 سجل
لا لا نريد فقط المستخدم اسكوت ... كيف ؟ لديك طريقين .....
الاول : من جدول تعاليق الجداول لكل المستخدمين ....
select * from all_tab_comments
where owner='SCOTT';
الثاني وهو الاسهل طبعا :من جدول تعاليق الجداول للمستخدم الحالي (اسكوت في مثالنا)
select * from user_tab_comments;
الان نرى تعاليق المستخدمين على اعمدة (حقول ) جداولهم :
select * from all_col_comments
النتيجة جدا ضخمة ...
لا لا نريد فقط تعاليق المستخدم اسكوت على الاعمدة .. كيف ؟لديك طريقتين ...
الاولى :من جدول تعاليق الاعمدة لكل المستخدمين
select * from all_col_comments
where owner='SCOTT';
الثانية وهي الاسهل طبعا :من جدول تعاليق الاعمدة للمستخدم الحالي (اسكوت في مثالنا )
select * from user_col_comments;
اعطيك تحدي بسيط !!
وهو التحدي الرابع ,
اريد ان تعمل تعليق على أي جدول , واي عمود به ....
ثم تستعرض تعليق الجدول فقط , وليس كل الجداول ,
ثم تستعرض تعليق العمود فقط , وليس كل الاعمدة !!
انتهت رحلتنا في كوكب DDL
اريدك ان تعرف بعض المعلومات التي ارى انه من المهم ان تعرف عنها وهي ....
هنالك نوعين من الجداول !!
جداول المستخدم user tables
وجداول اخرى تسمى بـ Data Dictionary
جداول المستخدم نعرفها وهي مثل emp,dept…… أي الجداول التي ينشئها المستخدم ,
والجداول الاخرى من انشأها ؟ ليس المستخدم , بل الاوراكل نفسه !!
لماذا هذه الجداول الاخرى ؟ لكي يخزن بها بعض المعلومات المهمة للبرنامج نفسه وفي نفس الوقت ليست مهمة لنا كثيرا .
على ماذا تحتوي ؟ على معلومات عن قواعد البيانات , بعض المعلومات التي لا اعلم كثيرا منها ولكن ... لنستعرض هذه الجداول وليكن ما يكن :
set linesize 10000;
هذا الامر لكي يجعل السطر يتحمل 10000 حرف ... لذا فأول ما تشغل البرنامج اكتبه لكي تعرض الجداول بشكل سلس وواضح .... وخاصة اذا كانت جداول كبيرة !!
الان اريدك ان تعرف ثلاث جداول ... وهي
User_tables
وهو جدول به معلومات عن جداول المستخدم .... يعني اول ما تنشيء جدول .. تأتي بعض المعلومات التي يريدها البرنامج في هذا الجدول .... وانا شخصيا فهمت بعض هذه المعلومات ..
الذي فهمتها هي : اسم الجدول , هل هو متاح للمشاهدة ام لا , عدد السجلات الموجودة به ,معدل طول السجل الواحد يعني كم حرف وعدد ووو .... ,اخر وقت عد تم الدخول عليه ,واخرى لا اعلمها .
جرب واكتب الامر التالي :
select * from user_tables;
سوف تعرض لك معلومات كثيرة عن جداول موجودة لديك تعلمها واخرى لا تعلمها , طبعا لا يمكننا المس بهذا الجدول ولا بغيره من جداول النظام .
مارأيك لو ترى اسماء الجداول بواسطة الاستعلام التالي :
select table_name from user_tables;
النتيجة التي ظهرت عندي :
TABLE_NAME
------------------------------
BIN$zh6K7mL3TQSEjFVbw8huPA==$0
BIN$CdOCgSM0RVe9oZZa3a7yYw==$0
BIN$0HH1em/pSYGnFZh44HJRbw==$0
BIN$osPd+65HQRWuHRThb+5mrg==$0
BIN$8E2pLO9KS/2S+IX45TNq5A==$0
EMP_2
ANNUAL_EMP_30
EP
BIN$6BmCVHt5QJ+2kgFtGw15dw==$0
BIN$u1ury6+3TR2Z4hKShyoYdg==$0
E
BIN$2td3bfKwR/+G9k4rFB72QQ==$0
BIN$1HvD1IMCQhOnrSP7pNbAQg==$0
BIN$orKQ6c4BQOCBXgSBC1dgHQ==$0
BIN$aVeWAgZdTeKcyOVUJ9D9YA==$0
A
SALGRADE
BONUS
EMP
DEPT
يظهر ان بعض الجداول ..... لا اعرف كيف اتت ولكن ..... لا يهم .
الجدول الثاني :user_objects
وهو جدول شبيه بالسابق ..
اريد ان تعرف شيء الان , وهو object اوبجيكت .....
وهو أي شيء موجود على الـقرص الثابت hard disk يسمى بـ object , نخص في كلامنا هذا .. الملفات !!
الجدول قلنا منذ زمن بعيد انها مجرد ملف , لذا فتوجد بعض الملفات الاخرى غير الجداول سوف تعرف بعض منها فيما بعد .
هذا الجدول (اقصد به user_objects) يعرض معلومات كل الملفات او الاوجكت الموجودة لديك والتي تخص اوراكل طبعا .
بعض المعلومات التي فهمتها انا هي :
اسم الاوبجكت,نوع الابجكت هل جدول ام شيء اخر (ستعرفونه فيما بعد) ,تاريخ انشاء الاوبجيكت (معلومة مهمة للتجسس) ,اخر عملية DDL اجريت عليه (معلومة اخرى مهمة ) , هل متاح و لنا صلاحية بالتعامل معه ام لا .
The Coder
16-01-2006, 12:09 AM
الان اكتب الامر التالي :
select * from user_objects ;
لكي ترى كل ما فيه , وترى مالديك من مصائب تعلمها و اخرى لا تعلمها .
الان اريد ان استعرض تاريخ إنشاء جدولنا الخاص بالموظفين ..
انا شخصيا نفسي منذ زمن اعرف متى انشيء .... عبر هذا الاستعلام .
select created from user_objects
where object_name ='EMP';
سوف تعرض لك تاريخ إنشائه .. اذا أردت المعلومات الاخرى فما عليك الا كتابة :
select * from user_objects
where object_name ='EMP';
الجدول الثالث وهو جدول user_catalog
به معلومات طفيفة عن الجداول الموجودة لديك .... فقط اسم ونوع الجدول , لا اعرف ما قصده بنوع الجدول ولكن لايهم .. المهم انه والله اعلم ان هذا الجدول يعرض ما انشأته انت وفقط انت ....
اما جدول user_tables فهو لما تمتلكه من جداول ...سواء انت انشأته او انشأه غيرك .
بامكانك ان تكتب احد الاستعلامين :
select * from user_catalog ;
او اختصارا ....
select * from cat;
والسلام ختام .
سوف نتكلم في الدرس القادم عن الصلاحيات وما هي الصلاحيات ولماذا الصلاحيات وكيف نتعامل مع الصلاحيات
وربما عن القيود وما هي القيود ولماذا القيود وكيف نتعامل مع القيود .
ولا يبقى علينا الان الا التذكير والتلخيص لأوامر الـDDL والـ DML
الكلمات الحمراء في الصور ... هي ما يجب كتابته كما هو بدون تعديل او نقصان .
الكلمات الزرقاء في الصور .. هي ما يجوز لك كتابته او حذفه .. لا فرق فهي زيادة لا غير .
الصورة 1002 تلخيص للـ DML ولغة التحكم بالعمليات :
http://img9.picsplace.to/img9/6/1002.jpg
الصورة 1003 تلخيص للـ DDL :(الصورة كبيرة نسبيا)
http://img8.picsplace.to/img8/6/1003.jpg
The Coder
16-01-2006, 12:15 AM
اانتهى الدرس .. وكلي امل بان تنتفعو به
وان تتمتعو بالدرس ...
....
التحديات بين السطور ....
ابحثو عنها ,’,’,’,’,’,’,’
والى لقاء اخر في الدرس القادم ....
The Coder
20-01-2006, 05:34 AM
السلام عليكم
ظروف المت بي ..
سوف اتأخر اسبوع من تاريخه
اسف اسف اسف
..
سوف نسرع ان شاء الله ....
بعد اكثر من اسبوع,,,,
فاعذروني يا شباب
king.romance
22-01-2006, 09:22 PM
التميز للمتميزين دائما ارجو من الله ان يوفقق ومن اهل المنتدى وبالنيابة عنهم اشكرك على الموضوع الرائعوالجميل وادعوا الله ان يوفقق مرة اخرى
ســــــــــــلام
king.romance
22-01-2006, 09:25 PM
التميز للمتميزين دائما ارجو من الله ان يوفقق ومن اهل المنتدى وبالنيابة عنهم اشكرك على الموضوع الرائعوالجميل وادعوا الله ان يوفقق مرة اخرى
ســــــــــــلام
http://proxy.guardster.com/cgi-bin/nph-proxy.cgi/111100A/687474702f7777772e73686b6f6d616b6f2e636f6d2f41726162696325323073686b6f6d616b6f2f73686b6f6d616b6f2532 30617261626963253230776974682532306672616d652f50616e6f72616d612f626967253230706963747572657325323061 6e642532306172746963616c732f70616c6d2532307069632e676966 (http://www.grank.com/in.php?id=elsa7er3)
king.romance
22-01-2006, 10:02 PM
ياريت شكل الدرس يتعدل اكثرمن كدة
علشان يحث الناس انهم يقراءوة
وشكرا على المعلومات:أفكر: :أفكر: :أفكر:
http://www.webmistris.us/dancerssphere_webmistris2.gif
The Coder
27-01-2006, 07:09 AM
ياريت شكل الدرس يتعدل اكثرمن كدة
علشان يحث الناس انهم يقراءوة
وشكرا على المعلومات:أفكر: :أفكر: :أفكر:
http://www.webmistris.us/dancerssphere_webmistris2.gif
السلام عليكم ,,
شكرا لك اخي ....
مارأيك ؟؟ تريد دروس فلاش او فيديو ؟
لو لدي وقت طويل , ولو لدي خدمة نت سريعة , ولو لدى القارئين نت سريع ,,
لعملت دروس صوت وصورة وفلاش ,,,,
بس ...العين بصيرة , واليد قصيرة يا صاحبي ^^
شكرا لك ثانية
هانى الفقى
30-01-2006, 02:17 AM
ياجماعه والله الشخص الى اسمه
InternetMaster
ملوش حل وشرحه لمفاهيم قواعد البيانات فى الجوان وكان الأستاذ جافا ادانا اللينك
عموما هو فى موقعarabteam2000 فى قواعد البيانات بأكسس وليست موجوده فى قواعد البيانات لأوركل لأنى دخت لغايه ما لقتها وحبيت افيد اللى عايز يستفيد.
على فكره انا لسه بقرأ من يومين اتنين بس وكنت عايز أقل حاجه انى ان شاء الله هخلص خلال يومين الشرح بتاع جافا وانترنت مستر لانى عندى حماس مش ذيكم متكاسلين وان شاء الله هبقى أحسن منكم لانى بذاكر باخلاص وهحل الواجب من اول درس الى اخر درس وابعته للاستاذ جافا وربنا يسهلى الحال ويسهلكم جميعا يارب
The Coder
30-01-2006, 11:52 AM
ياجماعه والله الشخص الى اسمه
InternetMaster
ملوش حل وشرحه لمفاهيم قواعد البيانات فى الجوان وكان الأستاذ جافا ادانا اللينك
عموما هو فى موقعarabteam2000 فى قواعد البيانات بأكسس وليست موجوده فى قواعد البيانات لأوركل لأنى دخت لغايه ما لقتها وحبيت افيد اللى عايز يستفيد.
على فكره انا لسه بقرأ من يومين اتنين بس وكنت عايز أقل حاجه انى ان شاء الله هخلص خلال يومين الشرح بتاع جافا وانترنت مستر لانى عندى حماس مش ذيكم متكاسلين وان شاء الله هبقى أحسن منكم لانى بذاكر باخلاص وهحل الواجب من اول درس الى اخر درس وابعته للاستاذ جافا وربنا يسهلى الحال ويسهلكم جميعا يارب
اهلا بك يا فقي .. ^^
يعجبني حماسك .. والى الامام ^^
والدرس الخامس ... كله للاستاذ الكبير ... انترنت ماستر ..
والذي اختفى بالمرة .. ولا اعرف اين ارضه الان ...
المهم ... ضع حلول واجباتك في موضوع استفسارات اوراكل ..
وضع ملاحظاتك واسألتك هناك ^^
يالله شد حيلك ^^ ... وادعيلي
The Coder
01-02-2006, 07:06 AM
بسم الله الرحمن الرحيم
الدرس الحادي عشر
اسم الدرس : جملة الاستعلام select والدوال
نوع الدرس : تطبيقي
صعوبة الدرس : **** من *****
اهميــة الدرس : ****** من ***** (Over)
درجة احتراف لغةSQL المتوقعة بعد هذا الدرس : **** من ***** (متوسط متقدم )
الوقت المتوقع منك لفهم الدرس : ثماني ساعات .
المتوقع منك في هذا الدرس :
- معرفة الشروط والقيود .
- معرفة اجزاء جملة select .
- التعامل مع دوال المتعددة الصفوف وحل مشاكلها .
هيا لنؤركل ^^
السلام عليكم
وجهت بعض المشاكل المتعلقة ببرنامج SQL PLUS , تجدني اكتب جملة ما , وكلي ثقة انها صحيحة مئة بالمئة , واذا بالبرنامج يعطيني خطأ !!
اذا واجهت هذه المشكلة , اعد كتابة الجملة مرة ثانية يدويا وسوف تحل مشكلتك , اعيد واكرر !! ... اذا واجهت المشكلة ... اعد كتابتها يدويا , وما بقي عليك الا معرفة ان هذه المشكلة هي احد أسباب تأخر الدرس !!
,,,
الان ....
الـ Constraints او ما تسمى بالقيود , مجرد شروط نضعها على أعمدة الجداول.
شروط نريدها في عمود ما من جدول ما ...
اليك طريقتين في انشاء هذه القيود ...
الطريقة الاولى : ان تنشئ هذه القيود وقت انشاءك للجدول
الطريقة الثانية : ان تنشئ هذه القيود بعد انشاء الجدول ..
لم تفهم ؟ طيب
هل تذكر امر إنشاء الجداول ؟
ماهو الامر ؟؟
اليك مثال للتذكير :
create table abc (
abcno number ,
abcname varchar2(20) );
انشأنا جدول يدعى بـ abc
بامكاننا ان نتبع الطريقة الاولى , وهي ان ننشيء القيود وقت انشاء الجدول ....
قبل البدء ...
الان اين المفتاح الرئيسي ؟
لا احد يعرف !!
حتى الأوراكل بنفسها لا تعرف ..
بالله عليك كيف تعرف ؟
طيب اين المفتاح الاجنبي ؟ هل يوجد مفتاح اجنبي ؟ لا احد يعلم
مالحل ؟
الحل هو إضافة القيد Primary key
ما هو هذا القيد ؟
هو شرط ... ان لا تتكرر القيم ... وان لا تكون خالية !!
هل فهمت ما معنى هذا القيد .... سوف نستعرض انواع القيود ...
هنالك خمس شروط ... اااقصد خمس قيود , هي :
القيد Check :
هذا قيد يحصر العمود ويجبر العمود ان يكون بين قيمتين ....
مثلا نريد العمود deptno الموجود في جدول dept ان تكون قيمه ما بين 10 و 90 فقط ,
يعني لو اضاف احدهم صف جديد في جدول الاقسام كما يلي :
insert into dept values
( 99 , 'ANY' , 'LOCATION' );
فانه خطأ ,
الامر السابق صحيح .... جدا صحيح
ولكن انا اريد ان تكون القيم ما بين 10 و 90 !!
يعني اريد ان تظهر خطأ لكل من يجرؤ ان يضيف عدد ليس بين الـ 10 و الـ 90 .. اريد ان يرفض أوراكل هذا العمل ....
الحل هو القيد check
صاحبنا check يحدد القيم التي نريدها ,
الان نحن نتبع الطريقة الاولى ... (وقت انشاء الجدول ) ... :
create table A
( ano number check (ano between 20 and 40 ) );
عملنا جدول يدعى بـ A , ولديه عمود يدعى ano , العمود هذا يجب ان تكون قيمه بين الـ 20 والـ 40 ..
عملنا القيد check وقت انشاء الجدول ... يعني سوف ينشئ الجدول .... ثم ينشئ القيد , هذه الطريقة الاولى ..
الان تأكد بنفسك هل القيد يعمل جيدا !!
insert into A values (22) ;
سوف يضيف بدون أي مشاكل ... لان القيمة بين 20 و 40 ....
والان دعنا نرى لو اضفنا قيمة ليست بين 20 و 40
insert into A values (10) ;
سوف يعمل لك فضيحة مدوية ... ويقول "لا لا لا ... لا يجوز !! يوجد قيد .. يقيدني بان تكون القيم ما بين 20 و 40"
الان ...الطريقة الثانية بعد انشاء الجدول ....
بالله عليك ... اريد ان اضع القيد check في عمود deptno في جدول الاقسام , كيف ؟
هل احذف الجدول ... وتذهب جميع بياناته !! ... ثم اعمل الجدول مرة ثانية واعمل معه القيد ؟؟؟؟؟؟؟
طبعا غير معقول ان نعمل هذا الغباء .
اليك امر ليس بغريب عليك ... وسوف يضيف القيد الى أي جدول عملناه منذ زمن .
alter table dept
add constraint dept_deptno_ck check(deptno between 10 and 90 ) ;
واو ... ماهذا !!
الامر alter الخاص بتعديل خصائص الاعمدة وحذفها واضافتها الى جدول سبق وان عملناه سابقا !
ها هو الامر الرائع يظهر لنا ثانية كحلال لمشكلتنا ...
يقول في السطر الاول "عدل الجدول الخاص بالاقسام"
ويقول في السطر الثاني "اضف قيد بمسمى dept_deptno_ck ... وهو قيد check .. للعمود deptno على ان يكون قيم هذا العمود ما بين 10 و 90"
لاحظ المسمى dept_deptno_ck , من كتب هذا المسمى ؟؟
هل تصدق انه انا !
يعني بامكانك ان تكتب ما شئت , لكن المسمى العالمي , والطريقة العالمية المثلى هي ان تكتب اسم الجدول , ثم اسم العمود ثم نوع القيد !! كيف ؟ سوف تعرف بعد قليل .
لماذا هذا المسمى ؟؟ وما فائدته ؟ سوف تعرف بعد قليل .
هل تعرف ان تضيف هذا القيد في جداول اخرى ؟؟
بقي علي ان اخبرك ان تتنبه الى هذا القيد , لو وضعنا هذا القيد على عامود deptno , وجعلنا القيم ما بين 20 الى 90 مثلا , هل هذا صحيح ؟ بالنظر صحيح .. لكنه خطأ , لانه يوجد قيم سابقة ليست بين 20 و 90
(القسم 10) , سوف يخبرك انه من المستحيل عمل ذلك لانه يوجد قيم في الجدول منافية للشرط .
سنعود بعد قليل ^^
The Coder
01-02-2006, 07:09 AM
القيد Primary key:
هذا قيد يجعل قيم العمود المراد وضع القيد عليه .. لا تتكرر ولا تكون خالية .
الان سوف نعمل هذا القيد بالطريقة الاولى على جدول جديد ويدعى B :
create table B
( bno number primary key , bname varchar2(10) ) ;
سهلة ؟
اعتقد انها سهلة ....
عملنا جدول B وبه عمودين .. احدهما حددناه ان يكون مفتاح اساسي .... هذا كل شيء .
الان الطريقة الثانية :
... هل تذكر مثالنا السابق .. حينما عملنا الجدول A ؟
يوجد عمود واحد وهو ano , اريده مفتاح اساسي ... كيف ؟
فكر .. فكر .. فكر ...
alter table A
add constraint a_ano_pk primary key(ano);
نفس الشيء ... يوجد مسمى , ثم كلمة primary key ثم بين قوسين العمود المراد وضع القيد .
القيدUnique :
قيد يجعل قيم عمود ما , لا تتكرر . معنى unique بالعربي ... وحيد .
الان بالطريقة الاولى , نعمل جدول يدعى بـ c ولديه عمود cno , نريد هذا قيم هذا العمود لا تتكرر ....
create table c
( cno number unique , cname varchar2(10) );
بمجرد إضافة كلمة unique , وانتهى كل شيء .
بالطريقة الثانية ... ممممم هل تذكر الجدول B الذي عملناه قبل قليل ؟
يوجد عمود يسمى bname , اريده عمود ذو قيم لا تتكرر .....
alter table B
add constraint b_bname_uk unique(bname) ;
لاحظ المسمى b_bname_uk , وهو مسمى من عندي , بامكانك وضع ماشئت , وبامكانك اتباع طريقتي .
يجب ان نضع اسم العمود المراد وضع أي قيد فيه بين قوسين .
القيدNot null :
قيد يجعل قيم عمود ما , لا يمكن ان تكون خالية .
اليك الطريقة الاولى ...
create table d
( dno number not null ) ;
عملنا الجدول d , وبه عمود dno , وجعلنا قيم هذا العمود لا يمكن ان تكون خالية ... جرب وادخل قيم خالية , سوف يعطيك خطأ
اليك الطريقة الثانية ...
على جدول B , عمود bname , وضعنا به القيد الخاص بعدم التكرار ... صح ؟
الان اريد ان اضيف القيد الخاص بعدم وجود قيم خالية .... هل يجوز ان نضيف قيدين على عمود ؟؟ طبعا نعم ..
لكن يوجد مشكلة مع هذا القيد , انه لا يمكن اضافته بالامر alter و add ....
بل بالامر التالي :
alter table b
modify (bname varchar2(20) not null) ;
وهو تعديل العمود اصلا !!
أي كأنك سوف تعدل العمود وخصائصة , ثم تضع هذا القيد .
هذا هو القيد الوحيد الغريب , والبقية تستخدم add . افهم ذلك ...
.
القيد Foreign key (references):
قيد يجعل عمود ما مفتاح اجنبي , أي انه ينشيء علاقة ما بين جدولين .
انتبه الى نقطة مهمة !!
يجب ان يكون المفتاح الاساسي الذي سنجعله مفتاح اجنبي في الجدول الثاني .. مساوي كقيمة للمفتاح الاجنبي .. ومطابق لصفاته !!
الان دعنا ننشئ جدولين , اولهما يدعى بالمتهم h والاخر المدعي g
create table h
( hno number ,
hname char );
اوبس .... نسيت ان اضع القيد PRIMARY KEY ... ما رأيك ان نجرب ماذا سيحصل ؟ لنرى :
create table g
( gno number ,
ho number references h(hno) ) ;
عملنا عمود يدعى بـ ho , وهو مفتاح اجنبي .. للمفتاح الرئيسي الموجود في الجدول h
لكن اسمه هناك hno .... هل تعتقد ان وضع اسم للمفتاح الاجنبي غير اسم المفتاح الاساسي خطأ ؟؟ في الحقيقة لا ...
لا يوجد خطأ في ذلك ..
الان انظر النتيجة :
no matching unique or primary key for this column-list
خطأ !! ؟؟؟
يقول انه لايوجد مفتاح اساسي !!
اوه صحيح .. نسيت ان اضع القيد PRIMARY KEY على العمود hno ....
alter table h
add constraint h_hno_pk primary key (hno) ;
الان .... نكرر العملية ونحن مرتاحو البال .
create table g
( gno number ,
ho number references h(hno) ) ;
وسوف يربط بين الجدولين ...
سوف يخبر هذا الامر أوراكل .. بأنه يوجد علاقة وثيقة واتصال عميق بين الجدول h و g
وسوف يعيشون بسلام وأمان معا ,,,
الان بالطريقة الثانية ....تخيل لدينا جدولين اخرين ...
احدهما U والاخر يدعى T
هيا لننشئهما .....
create table u
( uno number primary key ) ;
create table t
( tno number , uno number ) ;
الان اريد العمود uno في جدول الـ t مفتاح اجنبي يشير الى المفتاح الاساسي uno الموجود في جدول u
اليك الامر ولاحظ ان uno الاولى التي بين قوسين ... هي العمود الخاص بالجدول t والثانية هي الخاصة بالجدول h
alter table t
add constraint t_uno_fk foreign key (uno) references u(uno) ;
هل رأيت المسمى ؟؟ هل رأيت foreign key ؟؟؟ هل وهل وهل ؟؟
الان عملنا الرابط الوثيق بالطريقة الثانية (الطريقة الثانية = بعد انشاء الجداول ...)
الان انتهينا من انواع القيود ...
الان ... يوجد شيئين لم اطلعك عليهما , وهو "على مستوى العمود" والاخر "على مستوى الجدول"
صراحة استغرب من هذان الشيئان ... فلا اعرف لماذا عملوها هكذا .... الان سوف اريك شيء اخر .... جدول جديد
وهو تابع للجداول التي تكلمنها عنها , والتي تسمى بـ Data Dictionary ,,, هل تذكرها ؟
جدول يعرض جميع القيود لدى جداولك , الجدول يدعى user_constraints
هيا اذهب واستعرض محتوياته ....
set linesize 10000 ;
لكي يعرض الجداول بشكل مقبول .... (كأنه يقول ... اجعل حجم السطر 10000 حرف ....)
الان اكتب جملة الاستعلام التالية ....
وهي عرض كل القيود التي على الجدول B
select * from user_constraints where table_name='B' ;
OWNER CONSTRAINT_NAME C TABLE_NAME SEARCH_CONDITION
------------- ------------------------------ - ----------------------- -----
SCOTT B_BNAME_UK U B
SCOTT SYS_C005555 C B "BNAME" IS NOT NULL
SCOTT SYS_C005549 P B
هل تذكر تلك المسميات ؟؟
B_BNAME_UK احد هذه المسميات ...
وقد عرض هنا !!
هل تشاهد المسميين SYS_C005555 و SYS_C005549 ؟ من اسماهما ؟؟
انه الأوراكل !!
هل المسميات هذه مهمة ؟ ولماذا ؟ ستعرف بعد قليل ....
هل تشاهد تلك الرموز ؟ U C P ….
هي رموز تشير الى القيود ..
P أي Primary key
C أي check أو not null
U أي unique
R أي references (وهو الخاص بـ foreign key )
العمود search_condation يعرض الشروط الخاصة بالقيد check والقيد not null
الان ...
لو عملنا جدول جديد .. وبه مفتاح اساسي ... هل نستطيع تسميته بهذا الامر :
create table XYZ
( xyzno number primary key ) ;
طبعا لا نستطيع تسميته .
انظر الى جملة الاستعلام التالية ...
select * from user_constraints where table_name='XYZ' ;
النتيجة سوف تكون ....
OWNER CONSTRAINT_NAME C TABLE_NAME SEARCH_CONDITION
---------- ------------------------- - ----------------- -----
SCOTT SYS_C005562 P XYZ
لاحظ هذه التسمية SYS_C005562 .. أوراكل سماها .
الان نريد ان نحذف القيود جميعها من جدول ما ... كيف ؟
مالعمل ؟
اريد ان احذف القيد Primary key مثلا من جدول xyz
كيف ؟
يا ترى كيف ؟؟
The Coder
01-02-2006, 07:11 AM
هل تصدق انها بتلك التسميات !!
الان لنحذف قيد المفتاح الاساسي من جدول xyz
alter table xyz
drop constraint SYS_C005562 ;
واو .... alter ,, ذلك الامر الرائع تكفل ايضا بحذف القيود عبر جملة drop constraint ثم ذكر مسمى القيد المراد حذفه .
الان اكتب جملة الاستعلام السابق ذكرها ....
select * from user_constraints where table_name='XYZ' ;
والنتيجة هي :
no rows selected
لقد نسف الامر alter بجملته drop constraint القيد الخاص بالمفتاح الأساسي !!
ولا وجود له الان . باي باي يا مفتاح يا أساسي ... لقد كنت طيب معنا .
الان لدينا مشكلة ... وهي التسميات !!
كيف نعرف التسميات ؟
هل نذهب الى الجدول user_constraints ونأخذ من هناك المسمى لكي يتم حذف القيد الذي نريده ؟
اعتقد انه حل لا بأس به ... ولكن الحلو ما يكملش .... واليك مشكلة اخرى ...
مارأيك ان نعمل جدول يدعى بـ W ولديه من الابناء .. ااقصد من الاعمدة wno و www وهما عمودين ذوي بيانات رقمية .... انا سوف اضع لهما القيد عدم التكرار .... كما يلي :
create table W
( wno number unique , www number unique ) ;
هيا لنستعرض عضلات وقيود الجدول W
select * from user_constraints where table_name='W' ;
انظر وتمتع بالنتيجة ... وحتى اشعار اخر ... اريد ان احذف القيد الخاص بـالعمود www وليس العمود wno
OWNER CONSTRAINT_NAME C TABLE_NAME SEARCH_CONDITION
----------- ------------------------- - ----------------- -----
SCOTT SYS_C005563 U W
SCOTT SYS_C005564 U W
هيا .. اخبرني أي من المسميين احذفه ؟
هل SYS_C005563 ام SYS_C005564 ؟؟
أي منهما هو الذي يمثل العمود www ؟؟؟
طبعا يجب ان تذهب الى جدول اخر ... وترى اسم العمود , واسم الجدول , ومسمى القيد ..... ثم ترجع وتأخذ المسمى ... ثم تحذف القيد ....
انا كسول جدا ... اعتبرها معضلة ... وذهاب وعودة و تعب ....
اليك الجدول ... والذي سوف يعرض اسم العمود + مسماه ..
select * from user_cons_columns ;
الان نريد حل لهذه المعضلة (لا ارى انها مشكلة .. ولكن اريد تجربة طريق اخر !! هذا كل شيء ) , نريد ان نسمي القيود عندما ننشئها !! كيف ؟
اعتقد انه يوجد حلين ... وقد تعرف احدهما !!
حل بالطريقة الاولى (تسمية و انشاء القيود وقت انشاء الجدول ) و حل بالطريقة الثانية (انشاء القيود بعد انشاء الجدول)!!
في الحقيقة ان الطريقة الثانية مررنا بها !! وعملناها !!
أي انك تعمل الجدول ... ثم تضيف القيود كما ترغب وهو حل لا بأس به . وانا اعرف انك فكرت بها اصلا .
اما الحل بالطريقة الاولى ... عرفنا اننا نستطيع انشاء القيود وقت انشاء الجدول , ولكن لم نعرف كيف نسميها !!
الان ركز فقط بالطريقة الاولى ... الطريقة الاولى يوجد بها طريقتين (بدأت الامور تتعقد اكثر !!)
على مستوى العمود و على مستوى الجدول .
الذي عملناه هو مستوى العمود ... الان ننشيء جدولين وبها قيود على مستوى الاعمدة ...
الجدول الاول وهو الخاص بجدول السيارات , والاخر هو جدول الزبائن
الزبون الواحد يستطيع ان يمتلك اكثر من سيارة
السيارة الواحدة تمتلك للزبون الواحد ...
لو بتفكر قليلا .... حتعرف فين نضع المفتاح الاجنبي !!
العلاقة واحد لمتعدد .
فكر أين نضع المفتاح الاجنبي .....
هل فكرت ؟ صحيح .... في جدول السيارات .
الان ننشئ جدول الزبائن .... وبه رقم الزبون كمفتاح أساسي ... واسمه كقيم يجب ان تكون غير خالية ...ثم عمره والذي يجب ان يكون ما بين 18 و 30 ...
create table customer (
cno number primary key ,
cname varchar2(10) not null ,
cage number check (cage between 18 and 30 ) ) ;
يا سلام ...
الان جدول السيارات ...
create table cars (
carno number primary key ,
carname varchar2(10) not null ,
carage number check (carage between 0 and 10) ,
carpanel number unique ,
cno number references customer(cno) ) ;
يا سلام ...
رقم السيارة كمفتاح أساسي , اسم السيارة كقيم لا يمكن ان تكون خالية , و عمر السيارة المتوفرة والتي تصلح للبيع وهو ما بين 0 و 10 سنين , ولوحة السيارة وهو رقم لا يتكرر ابدا , واخير رقم العميل المالك لها كمفتاح اجنبي !!
لاحظ انه مثال عبيط من رأسي !! تحليليا خطأ في خطأ ...
لكن تقنيا .. لقد جمعت كل القيود في هذين الجدولين كتلخيص !!
ارجع لهما وقت نسيانك لشيء ! فقد ينفعانك كثيرا .
مع العلم انهما بمستوى الاعمدة ....
التحدي الاول ...الان تخيل لو اردنا ان نجعل لاسم العميل قيدين !!
أي انه غير خالي , و ايضا لا يمكن ان يتكرر !! كيف ؟؟ اريدها بطريقتين ! وهو كتحدي .... لكن انتظر !
اقرأ الدرس كاملا ... ثم اجب على هذا التحدي ... لان الطريقة الاولى تعرفها والطريقة الثانية اتية في الطريق .
ولكي اكون واضحا معك .. اليك اجابة خاطئة .. لكي لا تفكر فيها بتاتا :
create table customer (
cno number primary key ,
cname varchar2(10) not null ,
cname varchar2(10) unique ,
cage number check (cage between 18 and 30 ) );
وستكون النتيجة هي .......
ORA-00957: duplicate column name
(لقد كررت اسم عمود !!)
الان اريدك ان تعرف انه لو حذفنا جدول العملاء .... فسوف يرفض اخونا الأوراكل .... اليك ما يلي :
drop table customer ;
سوف يقول لك ... ان هنالك مفتاح اجنبي في جدول اخر(جدول السيارات) .. مرتبط ارتباط وثيق مع جدول العملاء ...
ORA-02449: unique/primary keys in table referenced by foreign keys
اذن مالعمل ؟؟؟؟
حذف هذا الارتباط او حذف ذلك الجدول الاخر (جدول السيارات) الذي به المفتاح الاجنبي
الان انشأنا القيود بالطريقة الاولى .... على مستوى العمود ... وقد عرفنا ذلك ..
اليك انشاء القيود بالطريقة الاولى ايضا ولكن على مستوى الجداول ...
اريدك ان تحذف كل الجداول التي عملناها هذا الصباح .... بما فيها جدولي السيارات و العملاء (عملاء = زبائن)
اليك انشاء القيود على مستوى الجدول :
create table customer (
cno number ,
cname varchar2(10) ,
cage number ,
constraint customer_cno_pk primary key (cno) ,
constraint customer_cname_uk unique(cname) ,
constraint cusotmer_cage_ck check(cage between 0 and 10 ) ) ;
يتم فيها سرد الاعمدة بشكل طبيعي بدون قيود .. وبعد الانتهاء من الاعمدة .. يتم سرد القيود بشكلها الذي تراه ...
وهو اولا كلمة constraint ثم المسمى ....
المسمى عادة وبالطريقة المعروفة والاصلية .... اسم الجدول ثم _ ثم اسم العمود المراد وضع القيد فيه , ثم _ ثم نوع القيد ..
نوع القيد اذا كان uk فمعناه القيد unique
واذا كان pk فمعناه Primary key
واذا كان fk فمعناه foreign key
واذا كان ck فمعناه check
اما القيد not null فانه لا يمكن وضعه على مستوى الجدول !!
لا اعرف لماذا .. ولا اعرف ما هو القصد الغبي وراء منع وضع هذا القيد بالذات , ولكن .... انا لله وانا اليه لراجعون.
نرجع الى محور حديثنا ...
ولا تنسى اننا نتبع الطريقة الاولى (الطريقة الاولى = انشاء القيود وقت انشاء الجدول) وهذه الطريقة الاولى على مستوى الجدول , ولا تنسى انها حل لتسمية القيود , ليس كمثل الطريقة الاولى على مستوى العمود !!
يجب وضع اسم العمود المراد الحاق القيد الخاص به ...
فمثلا السطر الاخير :
constraint cusotmer_cage_ck check(cage between 0 and 10 )
لاحظ انه ذكر العمود cage .... بين قوسين ..
والسطر ما قبل الاخير ذكر اسم العمود بين قوسين ... وهلم جر .
الان لاحظ الجدول الثاني (اعيد واكرر .. الطريقة الاولى .. على مستوى الجدول )
create table cars (
carno number ,
carname varchar2(10) ,
carage number ,
carpanel number ,
cno number ,
constraint cars_carno_pk primary key(carno) ,
constraint cars_carage_ck check( carage between 0 and 10 ),
constraint cars_carpanel_uk unique(carpanel) ,
constraint cars_cno_fk foreign key (cno) references customer(cno) );
كل شيء واضح الان ... انتبه الى جزئية المفتاح الاجنبي !!
foreign key (cno)
الـعمود cno هو العمود التابع للجدول cars أي لسان حاله يقول "هذا مفتاح اجنبي ... للعمود cno "
واما الجملة التالية :
references customer(cno)
فكأنه يقول ... "يشير الى جدول العملاء ( عمود cno ) "
الان ... اذهب وانظر الى الجدول الخاص بعرض القيود ... سوف ترى المسميات واضحة وصريحة , ولا يوجد أي مشكلة :
select * from user_constraints where table_name='CUSTOMER';
OWNER CONSTRAINT_NAME C TABLE_NAME SEARCH_CONDITION
------------ ------------------------------ - ----------------- -----
SCOTT CUSOTMER_CAGE_CK C CUSTOMER cage between 0 and 10
SCOTT CUSTOMER_CNO_PK P CUSTOMER
SCOTT CUSTOMER_CNAME_UK U CUSTOMER
هل رأيت المسميات .. واضحة هاه ,
The Coder
01-02-2006, 07:17 AM
الان انظر الى قيود الجدول الاخر :
select * from user_constraints where table_name='CARS';
النتيجة كانت :
OWNER CONSTRAINT_NAME C TABLE_NAME SEARCH_CONDITION
---------- -------------------------- - ---------------- -----
SCOTT CARS_CARAGE_CK C CARS carage between 0 and 10
SCOTT CARS_CARNO_PK P CARS
SCOTT CARS_CARPANEL_UK U CARS
SCOTT CARS_CNO_FK R CARS
للتذكير ... ما فائدة المسميات ؟ لماذا المسميات مهمة لهذه الدرجة ؟
لكي نحذف القيود بسرعة وبشكل عملي اكثر ولكي نحل معضلتنا تلك .. هل تذكرها (ارجع الى الجدول W )
هيا لنحذف القيد الخاص بالمفتاح الأساسي بجدول العملاء !!
alter table customer
drop constraint customer_cno_pk ;
والنتيجة :
ORA-02273: this unique/primary key is referenced by some foreign keys
خطأ !!
يقول انه يوجد مفتاح اجنبي يعتمد على هذا المفتاح الأساسي ... طيب ... حاضر يا سيد أوراكل ... سوف نحذف هذه العلاقة ثم نرجع ونحذف القيد Primary key أو ............ بطريقة اخرى وهي :
alter table customer
drop constraint customer_cno_pk cascade ;
إضافة كلمة cascade والذي سوف يمحي العلاقة برمتها , أي انه سوف يمحي القيد الخاص بالمفتاح الأساسي , و القيد الاخر الخاص بالمفتاح الاجنبي في الجدول الاخر .. تأكد بنفسك ... اذهب وشاهد ذلك في جدول القيود user_constraints
الان نحذف القيود جميعها من جدول السيارات ... مارأيك
(باعتبار انك لم تكتب الامر الذي يحتوي على cascade)
alter table cars
drop constraint cars_cno_fk ;
alter table cars
drop constraint cars_carage_ck ;
alter table cars
drop constraint cars_carpanel_uk ;
alter table cars
drop constraint cars_carno_pk ;
select * from user_constraints where table_name='CARS';
no rows selected
وبالمثل .. في جدول العملاء ... لو اردت ان تجرب .
لا ادري هل يوجد فرق فعلي بين "على مستوى الاعمدة" و "على مستوى الجداول" ؟
المناهج لم تتحدث فعليا عن فرق جدير بالذكر ... انما انا استنتجت الفرق الخاص بمسميات القيود .
بقي شيء واحد نسيته !! التحدي ثاني ....
وهو القيد not null كيف نحذفه ؟
باعتبار ان احد الاعمدة به قيم لا يمكن ان تكون خالية ... حاول ان تحذف هذا القيد ....
هيا اذهب و امسح جميع الجداول التي عملناها صباح هذا اليوم ... فلا حاجة لنا بها !!
انتهينا من دوخة القيود ...
والان لنرجع الى الوراء .... الى الماضي , ونذكر شيء قد نسيناه , الا وهو جملة الاستعلام select
توقفنا في نقطة مهمة جدا في الدوال المتعددة الصفوف ... وعرفنا ما الفرق بين المتعددة الصفوف والاحادية الصف ....
واخر مثال كان :
select ename,sum(sal) from emp ;
وكانت النتيجة جميلة ورائعة ....
ORA-00937: not a single-group group function
الان , اريد ان اعرف .... مجموع الرواتب الكلية للقسم 30 و مجموع الرواتب الكلية للقسم 20 و مجموع الرواتب الكلية للقسم 10 (الرواتب الكلية = الرواتب الأساسية + الرواتب الإضافية )
اريد ان اعرضهم لكي أقارن مثلا ...
ماذا اعمل ...
اليك حل عبيط و متعب ..... متعب كثيرا .... ويمكن يحتاج ورقة وقلم ... و آلة حاسبة ,
select sum(sal) from emp
where deptno=30 ;
SUM(SAL+NVL(COMM,0))
--------------------
11600
elect sum(sal + nvl(comm , 0) ) from emp
here deptno =20 ;
SUM(SAL+NVL(COMM,0))
--------------------
10875
select sum(sal + nvl(comm , 0) ) from emp
where deptno =10 ;
SUM(SAL+NVL(COMM,0))
--------------------
8750
حل رائع ...
تكتب كل قسم ... على حدة ...
وترى النتائج متفرقة ...
تخيل انه 100 قسم ؟؟؟؟؟
هل تكتبها مئة مرة ؟ وتسجل البيانات مئة مرة ؟ لا لا ,, هذا غباء
الان سوف تتعلم شيء جديد ....
انظر الى الصورة اولا ... (الصورة 1101)
http://img8.picsplace.to/img8/8/1101.jpg
الصورة توضح عرض اكبر قيمة في القسم 10 , واكبر قيمة في القسم 20 واكبر قيمة في القسم 30 ....
الجدول الذي في اليسار هو جدول الموظفين ... أي عرض منه رقم القسم و الراتب ....
الجدول الذي في اليمين ... هو ما نريده !! ....
لو قلنا :
select max(sal) from emp ;
فإنه سوف يعرض لنا ...
MAX(SAL)
--------
5000
اذن نريد استخدام الدوال ذوات الصفوف المتعددة , ونريد تقسيم الناتج ...
دوال متعددة الصفوف .. نتيجتها صف واحد , ونحن نريد صف متعدد , لذا تنبهوا اولئك المبرمجين (مبرمجو أوراكل) , وعملو شيء يسمى بـ group by
جملة group by :
Group معناها بالعربي .... مجموعة , تقسيم .....
وكأن معنى هذه الجملة "تقسيم بحسب ".....
وكما شاهدنا ... نريد تقسيم ناتج الدالة ذات الصف المتعدد على حسب ماذا ؟؟ على حسب رقم القسم ...
الان انظر الى الحل ....
اريد عرض مجموع رواتب الموظفين في قسم 10 و مجموع رواتب الموظفين في قسم 20 ومجموع رواتب الموظفين في قسم 30 في جملة استعلام واحدة ,
select sum(sal) from emp
group by deptno ;
وكأنه يقول .. اعرض مجموع الرواتب ... مقسمة بحسب رقم القسم !!
انظر الى الناتج :
SUM(SAL+NVL(COMM,0))
--------------------
8750
10875
11600
يااااا سلام ... رائع
The Coder
01-02-2006, 07:19 AM
الان نطورها قليلا , ونضع الرواتب الكلية :
select sum(sal+nvl(comm,0) ) from emp
group by deptno ;
SUM(SAL+NVL(COMM,0))
--------------------
8750
10875
11600
ممممم لا تعجبني النتيجة هكذا ...
اريد ان اضيف رقم القسم بجانب النتائج ....
select deptno , sum(sal+nvl(comm,0) ) from emp
group by deptno ;
والان دعنا نرى النتيجة ... بشكلها الجميل :
DEPTNO SUM(SAL+NVL(COMM,0))
------ --------------------
10 8750
20 10875
30 11600
الان اقتنعت ...
لنجرب دالة القيمة الاعلى max للرواتب ...
select deptno , max(sal) from emp
group by deptno ;
DEPTNO MAX(SAL)
------ ----------
10 5000
20 3000
30 2850
الان ... انا لم اكتفي .. اريد تعقيد الامور !!
اريد ان اعرض اسم صاحب اكبر راتب و قسمه ... مقسما النتائج على حسب رقم القسم ..
ما رأيك في هذا الحل :
select ename,deptno,max(sal) from emp
group by deptno ;
فكر في حلي ...
هل هو صحيح ؟؟ ولماذا ؟
لماذا هو صحيح ؟ لماذا هو خاطئ ؟؟
في الحقيقة .. هو خاطئ مئة بالمئة !!
لماذا خاطئ ؟ وضعنا سابقا العمود deptno فصار الحل صحيح ... ولكن عندما اضفنا ename اصبح خاطئ !!
لماذا يا ترى ؟
اذا لم تفهم لماذا ... فسوف تضطر لقرائة عدة سطور مملة (ما بين علامتي التنصيص) ... اقرأها او لا تقرأها , الخيار لك ... سوف تستغرق قرائتها اقل من دقيقتين ونصف ...
"
انظر هذه الجملة .. للتذكير:
select deptno , max(sal) from emp
group by deptno ;
في الجملة قلنا (اعرض رقم القسم , و أعلى راتب ..... و قسم النتائج بحسب رقم القسم) .... ما معنى هذا ؟؟
معناه انه لو يوجد لدينا الأقسام 10 و 20 و 30 و 40 مثلا ...
- سوف يقسم الصفوف الى اربع مجموعات , المجموعة الاولى و بها الصفوف التي تحتوي على القسم 10
والمجموعة الثانية تخص الصفوف التي تحتوي على القسم 20 ...... الخ
- المجموعة الاولى مثلا بها 5 صفوف ... وكل من هذه الصفوف تتبع القسم 10 صح ؟
أي ان المجموعة الاولى همها واحد , لغتها واحدة , قسمها واحد , تشترك في صفة واحدة وهي القسم 10
المجموعة الثانية تشترك في صفة واحدة وهي القسم 20 ... لا احد يشترك معها في هذه الصفة
كذلك المجموعة الثالثة والرابعة .....
- مثلا المجموعة الاولى ... هل تشترك في اسم الموظف و اسم الموظفين جميعهم اسم واحد ؟؟ لا
هل تشترك في الراتب أي ان جميع الرواتب فيها راتب واحد ؟؟ طبعا لا .... الرواتب مختلفة بين كل صف وصف في المجموعة الاولى ...
- الان بعد تقسيمها الى مجموعات نعمل اهم خطوة... وهي ضم كل صفوف المجموعة الواحدة لتمثل صف واحد !! انتبه ... فهذه اهم خطوة يجب التنبه فيها , الان .... قبل ان نضم... هل توجد دالة من نوع المتعددة الصفوف لنقل مثلا نعم توجد دالة .... إنها دالة max ... أي اكبر راتب موجود في هذه المجموعة .
- سوف يختار اكبر راتب ...و ينشئ عمودين هما رقم القسم , واكبر راتب لكي يمثلان المجموعة الاولى ....
وهكذا مع المجموعات الاخرى
- اذن الخلاصة هي انه بإمكاننا ان نعرض رقم القسم لاننا وضعناه في جملة group by , ولا يمكننا ان نعرض عمود اخر كاسم الموظف ..., لذا لا تضع عمود لم يذكر في جملة group by
"
الان .... لنعقد الامور اكثر واكثر ....
الان تخيل انه لدينا الف قسم ... واريد ان اعرف اكبر مجموع رواتب كل قسم ...
أي انه بعد معرفة مجموع رواتب كل قسم ... كما شاهدنا سابقا , اريد ان اعرف اكبر مجموع !!
لو نظرنا الى مايلي :
DEPTNO SUM(SAL+NVL(COMM,0))
------ --------------------
10 8750
20 10875
30 11600
لعرفنا ان اكبر مجموع بين الثلاثة هو 11600
طيب .... تخيل انه الف قسم الان ... كيف تعرف وبسرعة ما هو اكبر مجموع ؟؟
فكر قليلا .... الجواب في رأسك وانت لا تعلم ....
اليك الحل :
select max(sum(sal+nvl(comm,0) ) ) from emp
group by deptno ;
والنتيجة ...
MAX(SUM(SAL+NVL(COMM,0)))
-------------------------
11600
كل مافعلناه .... هو مايلي ..
Max(sum(….) )
وكما نعرف ... الدوال ترجع بقيمة (تخرج قيمة)
دالة الـ sum هنا اخرجت لنا قيم .. وهي ثلاث صفوف ... (مجموع رواتب كل قسم من الأقسام الثلاثة ...)
هل عرضت لنا ثلاث صفوف ؟ لا !!
من استقبلها ؟ انها الدالة max , استقبلتها بكل سرور , واختارت القيمة الاعلى منها , ثم عرضته لنا
هل فهمت الفكرة ! اعتقد انها سهلة .
الان اليك التعقيد العالمي .....
تخيل انه يوجد لدينا جدول الطلبة .. مجرد تخيل لهذا الجدول ...به الاعمدة التالية :
رقم الطالب ... رقم الكلية .. عدد الأترام ... ومعدل الطالب .
اريدك ان تنسخ هذا الجدول كما هو .... :
create table stud(
stu_no number ,
col_no number ,
trm_no number ,
avg_po number(3,2),
constraint stud_stu_no_pk primary key(stu_no) );
Stu_no رقم الطالب .
Col_no رقم الكلية.
trm_no رقم اخر ترم درسه .
Avg_po معدل الطالب .
الان .. انسخ جميع الصفوف كما هي , ثم الصقها في البرنامج SQL PLUS* ... :
insert into stud values (10 ,1,1,3.74) ;
insert into stud values (20 ,1,1,5.00) ;
insert into stud values (30 ,1,1,4.85) ;
insert into stud values (40 ,1,2,3.12);
insert into stud values (50 ,1,2,3.66);
insert into stud values (60 ,1,2,4.02);
insert into stud values (70 ,1,2,2.00);
insert into stud values (80 ,1,2,2.88);
insert into stud values (100,2,1,4.89);
insert into stud values (110,2,1,4.00);
insert into stud values (120,2,2,1.89);
insert into stud values (130,2,3,4.61);
insert into stud values (140,2,3,4.22);
insert into stud values (150,2,3,4.57);
insert into stud values (160,2,3,4.64);
insert into stud values (170,2,3,3.01);
insert into stud values (180,2,4,4.42);
insert into stud values (190,2,4,3.64);
insert into stud values (200,2,4,4.99);
insert into stud values (210,2,4,4.50);
insert into stud values (220,3,1,3.32);
insert into stud values (230,3,1,2.23);
insert into stud values (240,3,1,3.73);
insert into stud values (250,3,2,4.77);
insert into stud values (260,3,3,2.40);
insert into stud values (270,3,3,2.93);
insert into stud values (280,3,3,3.40);
insert into stud values (290,3,3,3.66);
insert into stud values (300,3,4,2.71);
insert into stud values (310,3,4,4.17);
insert into stud values (320,3,5,4.98);
insert into stud values (330,3,5,2.53);
insert into stud values (340,3,5,4.24);
يا سلام ... الان انظر الى الجدول الجديد :
select * from stud ;
The Coder
01-02-2006, 07:21 AM
الان اريد ان اعرض عدد الطلبة الذين اخذو عدد اترام معين , في الكلية الواحدة ,
أي انه يخبرني ان هنالك ثلاث طلاب يأخذون الترم الثاني في الكلية الاولى , وهنالك طالبين يأخذون الترم الثالث في الكلية الاولى , وان هنالك طالب واحد يأخذ الترم الاول في الكلية الثانية .... وهكذا ...
اريدك ان تفكر في السوال .. لا تفكر في الاجابة ..
يجب ان تفهم السوال , لكي تعيش المشكلة والتجربة . لاحظ انه يجب استخدام الدالة count , وهي دالة متعددة الصفوف ... اذا فهمت السوال , فحاول ان تجد الاجابة .... لا اعتقد انك ستجدها طالما انني لم اخبرك .
النتيجة ستكون بهذا الشكل .....
NUMBER_OF_STUDENT COL_NO TRM_NO
----------------- ---------- ----------
3 1 1
5 1 2
2 2 1
1 2 2
5 2 3
4 2 4
3 3 1
1 3 2
4 3 3
2 3 4
3 3 5
في الصف الاول .... يقول انه يوجد ثلاث طلبة في الكلية رقم واحد يدرسون الان الترم الاول ,
وفي الصف الثاني ... يقول انه يوجد خمس طلبة في الكلية رقم واحد ايضا , يدرسون الترم الثاني .
اليك الحل ....
select count(*) number_of_student , col_no , trm_no
from stud
group by col_no , trm_no ;
جملة التقسيم group by احتوت على عمودين !!
لاحظ انني وضعت رقم الكلية و الترم لكي اعرضهما ... أي كلاهما باستطاعتنا عرضهما ولا يوجد مشاكل .. لماذا ؟ لانهما ذكرا في جملة الـ group by...
العملية معقدة جدا , لو كان هنالك تقسيمات اكثر من عمودين .
في الجملة السابقة سوف يقسم الصفوف الى ثلاث مجموعات (لانه يوجد ثلاث كليات)
ثم يقسم كل مجموعة من هذه المجموعات على حسب رقم الترم ...
أي انه بعد تقسيمه الى ثلاث مجموعات ينظر الى المجموعة الاولى من الصفوف ... ويجدها 8 صفوف ...
الصفة المشتركة بينهما هي ان رقم الكلية هو 1
نأتي للتقسيم الاخر ...
وهو على حسب عدد الاترام ...
الثمانية صفوف التي بالمجموعة الاولى سوف تقسم الى مجموعتين(لانه في الصفوف الثمانية لا يوجد الا ترمين , الاول والثاني !!)... الاولى منها صفوف الطلبة الذين يدرسون في الترم الاول , والثانية هي صفوف الطلبة الذين يدرسون في الترم الثاني ... لو وجد ترم اخر مثلا .. سوف يكون هنالك مجموعة ثالثة .... وهلم جر ... الان لدينا مجموعتين في الكلية رقم 1 ...
اذا كنت ما زلت غير مقتنع ... اذا كنت لا تفهم بلغة الكتابة ... اذا لم تعرف كيف اتت النتيجة السابقة ... اذا لم ترد ان تقرأ اصلا ... انظر الصورة :
http://img5.picsplace.to/img5/18/1102.jpg
لاحظ انه في حلنا السابق .. كتبنا مايلي :
group by col_no , trm_no
لو قلبناها وجعلناها هكذا :
group by trm_no , col_no
مالذي سوف يحدث ؟
ستكون نفس النتائج , ولكن بترتيب مختلف ...
في الاولى يقسم المجموعات بارقام الكليات ثم بالاترام ,
الثانية يقسم المجموعات بالاترام ثم بالكليات ...
انظر النتائج واستنتجها بنفسك ...
select count(*) number_of_student , col_no , trm_no
from stud
group by trm_no , col_no ;
NUMBER_OF_STUDENT COL_NO TRM_NO
----------------- ---------- ----------
3 1 1
2 2 1
3 3 1
5 1 2
1 2 2
1 3 2
5 2 3
4 3 3
4 2 4
2 3 4
3 3 5
الان ... اريدك ان تتعرف على جملة الترتيب , والتي تجاهلتها منذ البداية لشيء ما في نفسي .
جملة Order by :
اريد ترتيب جدول الموظفين تصاعديا على حسب رواتبهم ...
تصاعديا يعني Ascending ... من تحت الى فوق , يعني يصعد ... يعني من الصغير الى الكبير .
تنازليا يعني Descending ... أي العكس .
اليك الجملة ....
select ename,sal from emp
order by sal asc;
ENAME SAL
---------- ----------
SMITH 800
JAMES 950
ADAMS 1100
WARD 1250
MARTIN 1250
MILLER 1300
TURNER 1500
ALLEN 1600
CLARK 2450
BLAKE 2850
JONES 2975
SCOTT 3000
FORD 3000
KING 5000
الان تنازليا ...
select ename,sal from emp
order by sal desc ;
ENAME SAL
---------- ----------
KING 5000
SCOTT 3000
FORD 3000
JONES 2975
BLAKE 2850
CLARK 2450
ALLEN 1600
TURNER 1500
MILLER 1300
WARD 1250
MARTIN 1250
ADAMS 1100
JAMES 950
SMITH 800
The Coder
01-02-2006, 07:24 AM
بإمكاننا ان نتجاهل كلمة ASC , أي لو كتبنا :
select ename,sal from emp
order by sal ;
سوف يتم عرضها تصاعديا , لذا فبامكانك تجاهل ASC .
الان تعال لنعقد بعض الامور , ونخلط group by مع order by ولنرى النتائج ...
على فكرة , group by ترتب النتيجة تصاعديا بشكل اوتوماتيكيا , أي :
select deptno from emp
group by deptno ;
DEPTNO
------
10
20
30
اريد ان اعرض مجموع رواتب الموظفين لكل قسم , بشكل تنازلي .
select sum(sal) , deptno from emp
group by deptno
order by sum(sal) desc ;
SUM(SAL) DEPTNO
-------- ----------
10875 20
9400 30
8750 10
هل لاحظت جملة الترتيب ؟ رتبنا ماذا ؟ هل رتبنا الرواتب ؟ بل رتبنا مجموع الرواتب ..... اذا لم تفهم مالذي حدث فاقول لك .... ركز قليلا في الجملة ... اذا لم تفهم لماذا حدث ما حدث .. فاقول لك صبرا وسوف تعرف لماذا .
طيب , فكر لو كتبنا هكذا :
select sum(sal) , deptno from emp
order by sum(sal) desc
group by deptno ;
فهذا يعتبر خطأ !!
اذن يجب ان تكتب جملة التقسيم group by ثم جملة الترتيب order by
انظر ما يلي :
select sum(sal) , deptno from emp
group by deptno
order by sal desc ;
فهذا الامر .... خطأ !!
لان order by قال "رتب بحسب الرواتب " , فنقول له , لقد قسمنا الناتج وضمينا الناتج , ونتوقع منك يا order by ان ترتب على حسب رقم القسم او على حسب مجموع الرواتب فقط لا غير .
بإمكاننا ان نعمق مفهوم الترتيب اكثر , ونقول لك ..
اريد ان اعرض جدول الموظفين على حسب رقم القسم تصاعديا , ويكون كل قسم مرتب فيه الرواتب تنازليا .
DEPTNO SAL ENAME
------------ ----- ------
10 5000 KING
10 2450 CLARK
10 1300 MILLER
20 3000 SCOTT
20 3000 FORD
20 2975 JONES
20 1100 ADAMS
20 800 SMITH
30 2850 BLAKE
30 1600 ALLEN
30 1500 TURNER
30 1250 WARD
30 1250 MARTIN
30 950 JAMES
اليك الامر ...
select deptno,sal,ename from emp
order by deptno asc ,sal desc;
الان .... انا ارى في النتيجة السابقة لا تعجبني .
هنالك اثنين تعملون في القسم نفسه ... و يأخذون الراتب نفسه , احدهما SCOTT والاخر FORD
وهنالك اثنان آخران نفس الحالة ...
لو انه يوجد الف شخص يعملون في نفس القسم , لهم نفس الراتب .. اريد ترتيبهم على حسب القسم تصاعدي , ثم الراتب تنازليا , ثم الاسم تصاعديا !! فكما شاهدنا في النتيجة السابقة , وضع scott اولا ثم ford وانا اريده بالعكس .. وترتيب الاسم تصاعدي أي من A الى Z
select deptno,sal,ename from emp
order by deptno asc ,sal desc,ename asc ;
والان ستكون النتيجة :
DEPTNO SAL ENAME
------ ---------- ------
10 5000 KING
10 2450 CLARK
10 1300 MILLER
20 3000 FORD
20 3000 SCOTT
20 2975 JONES
20 1100 ADAMS
20 800 SMITH
30 2850 BLAKE
30 1600 ALLEN
30 1500 TURNER
30 1250 MARTIN
30 1250 WARD
30 950 JAMES
اعتقد انني سئمت وزهقت من هذا الموضوع , وطولت فيه
مثال اخير :
select col_no , to_char(avg(avg_po) ,'0.00') , trm_no , count(*) number_of_student
from stud
group by col_no , trm_no
order by col_no , avg(avg_po) ;
COL_NO TO_CH TRM_NO NUMBER_OF_STUDENT
------ ----- ---------- -----------------
1 3.14 2 5
1 4.53 1 3
2 1.89 2 1
2 4.21 3 5
2 4.39 4 4
2 4.45 1 2
3 3.09 1 3
3 3.10 3 4
3 3.44 4 2
3 3.92 5 3
3 4.77 2 1
جملة HAVING :
الان اريد ان اعرض مجموع رواتب الموظفين في كل قسم , بشرط ان يكون مجموع الراتب لقسم ما اكبر من 9000 دولار !!
فكر .... فكر .... فكر ......
انظر الى الحل الصحيح ... :
select sum(sal),deptno
from emp
where sum(sal) > 9000
group by deptno;
والنتيجة سوف تكون ....
ORA-00934: group function is not allowed here
خطأ مع مرتبة الشرف .!!!!
The Coder
01-02-2006, 07:26 AM
لا يمكننا استخدام الدوال المتعددة الصفوف مع جملة الشرط where , لذا لزم علينا اختراع جملة شرطية جديدة خاصة بالدوال المتعددة الصفوف , الا وهي having .
select sum(sal),deptno
from emp
group by deptno
having sum(sal) > 9000 ;
select sum(sal),deptno
from emp
group by deptno
having sum(sal) > 9000 ;
SUM(SAL) DEPTNO
-------- ----------
10875 20
9400 30
هل فهمت ؟ سهلة جدا , كأنها where لكنها خاصة بالنتائج النهائية لجملة التقسيم !!, هل تفهم ما معنى النتائج النهائية ؟ أي انظر فيما يلي :
select sum(sal),deptno
from emp
group by deptno ;
انظر الى النتيجة النهائية ...
SUM(SAL) DEPTNO
-------- ----------
8750 10
10875 20
9400 30
طيب .. من النتيجة النهائية , اريد ان اعرض منها فقط , كل ارقام القسم التي هي اكبر من 10 .... :
select sum(sal),deptno
from emp
group by deptno
having deptno>10 ;
انظر الناتج :
SUM(SAL) DEPTNO
-------- ----------
10875 20
9400 30
بعد ان قسم الى مجموعات ... وعرف الناتج ... طبق جملة الشرط having , ثم عرض علينا الناتج النهائي .
مع العلم انه لو قلنا :
select sum(sal),deptno
from emp
group by deptno
having sal > 1000 ;
فهو خطأ !! , واعتقد انك تعرف لماذا .
الان دعنا نضع كل شيء في جملة واحدة !
اريد ان اعرض وظائف و مجموع الرواتب لكل وظيفة والتي هي اكبر من 4000 دولار , بشرط ان لا تكون هذه الوظيفة وظيفة مدير , ومرتبه ترتيبا تنازليا على حسب مجموع الرواتب !!
بالله عليك فكر قليلا , لان هذا المثال من اعقد ما يكون ..
فكر فكر فكر فكر فكر فكر .........
هل فكرت ؟ اليك الحل :
select job,sum(sal)
from emp
where job <> 'MANAGER'
group by job
having sum(sal) > 4000
order by sum(sal);
هل تصدق ان هذا المثال الشامل الكامل لدرس اليوم !!
احفظ الترتيب ... (clause = جزئية او جملة ... )
Select clause
From clause
Where clause
Group by clause
Having clause
Order by clause
الان .. ما رأيك ان تكتشف حقيقة برنامج الأوراكل في ترجمة جمل الـ SQL ؟؟
مع العلم ان هذا استنتاجي ورأيي الخاص !! , اعتقد انه 90% صحيح , لكن الله العالم كيف عملوا طريقة ترجمة هذه الجمل , انا اجتهدت واختبرت كثيرا , واعتقد انه بإمكاني عمل برنامج شبيه ببرنامج SQL PLUS*
ترتيب قرائة برنامج الأوراكل :
اذا لم ترغب بالقرائة ... او انك لم تفهم السطور القادمة , يكفيك فقط ان تعرف ان البرنامج سوف ينفذ اولا الجملة الشرطية where ثم group by ثم having ثم أخيرا order by
اليك مثالنا السابق :
select job,sum(sal)
from emp
where job <> 'MANAGER'
group by job
having sum(sal) > 4000
order by sum(sal);
اولا : يذهب الى from clause
يرى ما هو الجدول ... ثم يذهب ويبحث عنه اذا لم يجده فسوف يعطيك خطأ بأنه لم يجد الجدول .. اذا وجده يذهب للخطوة الثانية
ثانيا : يذهب الى where clause (اذا وجده اصلا)
يرى الشرط هل هو صحيح اصلا او لا , اذا كان صحيحا يبدأ ويطبق الشرط على الجدول , ثم ينسخ الى الذاكرة الناتج (لنسميه الناتج أ ).
ثالثا : يذهب الى group by clause (اذا وجده اصلا)
يرى هل العمود المراد تقسيم الناتج ( الناتج أ ) .. موجود اصلا في الجدول او لا !!
اذا لا ... فهذا خطأ .
طبعا اذا وجد عمودين , يقسم بالاول ثم يقسم بالثاني ...
المهم يقسم على حسب الاعمدة الموجودة , ثم يخزن في الذاكرة الناتج مقسما (لنسميه الناتج ب ) .
رابعا : يذهب الى having clause (اذا وجده اصلا )
سوف يرى , هل الشرط صحيح او لا .. بمعنى هل الشرط يتناسب مع التقسيم (الناتج ب) او لا ...
في الحقيقة ان having اصلا لا يأتي نفعها فعليا الا اذا وجد group by .
الان سوف يطبق الشرط الموجود في الجملة having على الناتج المقسم ( الناتج ب ) ومن ثم يكون الناتج الاخير في الذاكرة ( لنسميه الناتج ج )
خامسا : يذهب الى order by clause
سوف يرى اولا هل الاعمدة التي في order by موجودة في الناتج ج ؟؟ او لا
اذا وجدها .. فسوف يرتبها على حسب الاعمدة المذكورة ... ويكون الناتج د .....
سادسا :الان يذهب الى select clause , ويرى الاعمدة الموجودة به , والتي نريد ان نعرضها ,
- يرى هل الاعمدة المذكورة موجودة اصلا في الجدول او لا ... اذا لا يعطي خطأ ويتوقف .
- يرى هل يوجد دالة متعددة الصفوف او لا , اذا لا يطابق الاعمدة المذكورة مع النتيجة د واذا طابقت يعرض فقط صفوف الاعمدة المذكورة , ويتجاهل البقية .
- اذا وجد دالة متعددة الصفوف , فإنه ينظر في الناتج د , ويطبق الدالة على كل صف في الناتج د
The Coder
01-02-2006, 07:27 AM
الان هذه الخطوات الخمسة نطبقها بشكل عملي على حسب المثال السابق :
select job,sum(sal)
from emp
where job <> 'MANAGER'
group by job
having sum(sal) > 4000
order by sum(sal);
اولا : يذهب الى from clause
يرى الملف ... اااقصد الجدول emp موجود ولا زال على قيد الحياة .
ثانيا : يذهب الى where clause (اذا وجده اصلا)
نعم يجد الجملة الشرطية هذه , والتي تقول كل الصفوف التي لا تحتوي على العمل "مدير"
سوف يكون الناتج أ :
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17/12/80 800 20
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7839 KING PRESIDENT 17/11/81 5000 10
7844 TURNER SALESMAN 7698 08/09/81 1500 0 30
7876 ADAMS CLERK 7788 23/05/87 1100 20
7900 JAMES CLERK 7698 03/12/81 950 30
7902 FORD ANALYST 7566 03/12/81 3000 20
7934 MILLER CLERK 7782 23/01/82 1300 10
ثالثا : يذهب الى group by clause (اذا وجده اصلا)
سيجده يقول ترتيب بواسطة الـ job , نعم هذا عمود موجود في النتيجة أ
الان سوف يقسمه ويضم الناتج ويتجاهل الاعمدة ما عدى الاعمدة الموجودة في الـ group by
انظر الناتج ب :
JOB
---------
ANALYST
CLERK
PRESIDENT
SALESMAN
رابعا : يذهب الى having clause (اذا وجده اصلا )
سيجد الشرط يقول ... sum(sal) >4000
ينظر الى الناتج ب .... ويعمل الآتي :
- يجد أول صف هو (العمل = analyst)
- يبحث في جدول الـ emp (الجدول الأصلي الذي به جميع الصفوف !!) عن جميع الصفوف التي ( job <> 'MANAGER' ) و التي (job ='ANALYST') فسوف يكون الناتج ...
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- -------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7902 FORD ANALYST 7566 03/12/81 3000 20
- قلنا ان الشرط sum(sal) >4000 , مجموع الرواتب هنا ... 6000 ... هل هو اكبر من 4000 ؟ نعم انه اكبر ...
اذن ANALYST ستكون في القائمة ....
- يرجع الى الصف الذي يليه ثم ينفذ الخطوات السابقة ..
في النهاية سوف يكون لدينا ... الناتج ج :
JOB
---------
ANALYST
CLERK
PRESIDENT
SALESMAN
(بالصدفة وجد كل الوظائف ... مجموع رواتبها اكبر من 4000)
خامسا : سوف يذهب الى order by clause والذي يطلب ترتيب على حسب مجموع الرواتب ..
سوف يمر على كل صف في الناتج ج
- فمثلا .. يرى ANALYST , ويذهب الى الجدول emp (الجدول الأصلي الذي به جميع الصفوف !!)...
- يبحث عن كل الصفوف التي يكون العمل فيها لا يساوي مدير , والتي يكون العمل فيها يساوي ANALYST
ثم تظهر له عدة صفوف , ويبدأ يحسب مجموع الرواتب في هذه الصفوف .....
- انتهى من ANALYST , يبدأ في الصف التالي ....
- في النهاية وبعد ان حفظ مجاميع الرواتب لكل صف في الناتج ج .... يبدأ يرتب بطريقته الخاصة !! وبالتالي تظهر النتيجة د :
JOB
---------
CLERK
PRESIDENT
SALESMAN
ANALYST
مرتبة على حسب مجموع الرواتب .
سادسا :الان يذهب الى select clause , ويرى الاعمدة الموجودة به , والتي نريد ان نعرضها ,
موجود يا سيدي ... الـ job .... اذن مقبولة لانها موجودة في النتيجة د وسوف تكون في الحسبان للعرض ,
وموجود شيء اخر وهو ... sum(sal)
سوف يوجدها لكل صف في النتيجة د كما عملنا في الخطوة الخامسة ... ومن ثم يعرضها .
انتهت الخطوات ....
وما بقي عليك الا معرفة انه من الممكن ان تكون طريقتي هذه غير كفئ 100% , اعتقد لو أمعنا وفكرنا , من المؤكد انه يوجد طريقة اخرى أسهل و أفضل .
الان دعنا نعطي بعض الأمثلة . من جدول stud السابق ....
اريد عرض عدد الطلبة الذين حصلوا على معدل ما بين 1 و 1.99 أي المعدل الذي عدده الصحيح واحد .
وعدد الطلبة الذين حصلوا على معدل ما بين 2 و 2.99اي المعدل الذي عدده الصحيح اثنين ..... الخ
أي اريد الناتج كما يلي :
the avg the number of students
------- ----------------------
1 1
2 7
3 9
4 15
5 1
فكر قليلا !!
يجب ان تعرف حله بنفسك .. واجه المشكلة بنفسك ..
اليك الحل :
select trunc(avg_po) "the avg" , count(*) "the number of students"
from stud
group by trunc(avg_po) ;
انظر الى الحل ..
كم هو سهل ...
فكر لو حللنا هكذا .. هل ستصبح صحيحة ؟؟ :
select avg_po "the avg" , count(*) "the number of students"
from stud
group by trunc(avg_po) ;
في الحقيقة خاطئة !!
هل avg_po نفس trunc(avg_po) ؟؟
انا شخصيا كنت اعتقد انهما متساويتين في العمل , وكنت اعتقد ان الحل السابق كان صحيح !!
لكن ظهر لي الخطأ فعرفت ان :
Group by trunc(avg_po)
سوف يظهر لي نتيجة غير :
Group by avg_po
فكر فيها .. , ستجد انه من المخزي عمل مثل الجملة السابقة !! فكر وارسم على ورق الناتج .
الان , اريد ان اعرض المعدل الحسابي ( المعدل الحسابي هو مجموع القيم مقسوم على عددها !! ) لمعدلات كلية ما والذين اخذو ترم ما ...
أي مثلا .. اريد عرض المعدل الحسابي لمعدلات جميع الطلبة في الكلية الاولى والذين درسوا ترم واحد كمجموعة ...
و عرض المعدل الحسابي لمعدلات جميع الطلبة في الكلية الاولى والذين درسوا ترمين كمجموعة اخرى ... وهكذا !!
اريد النتيجة كما يلي :
AVG COL_NO TRM_NO NUMBER_OF_STUDENT
----- ---------- ---------- -----------------
1.89 2 2 1
3.09 3 1 3
3.10 3 3 4
3.14 1 2 5
3.44 3 4 2
3.92 3 5 3
4.21 2 3 5
4.39 2 4 4
4.45 2 1 2
4.53 1 1 3
4.77 3 2 1
فكر ....
اليك الحل :
select to_char(avg(avg_po) ,'0.00') "AVG" , col_no , trm_no , count(*) number_of_student
from stud
group by col_no , trm_no
order by avg(avg_po) ;
تم تقسيم الصفوف على حسب رقم الكلية , وعدد الأترام !!
... فكر فيها ..... وحاول فهمها بطريقتك .
الان اريد تعميق التقسيم ... لقد قمت بالتجارب كثيرا .. واخترعت امثلة كثيرة ...
جاء دورك لكي تخترع انت بنفسك امثلة ... لان ذلك يزيد من عمق فهمك ...
اليك مثال اخير نختم به الدرس .. واعتقد انه سهل عليك الان ,’,’,’
في جدول الطلبة stud اريد عرض كم عدد الطلبة الذين اخذو معدل عدده الصحيح موحد , وقسمهم موحد , و لهم نفس عدد الأترام ,
أي عدد الطلبة الذين اخذوا معدل بين 1 و 1.99 في الكلية الاولى , وعدد اترامهم ترم واحد ...
وعدد الطلبة الذين اخذوا معدل بين 1 و 1.99 في الكلية الاولى ... وعدد اترامهم ترمين ...
.....
.....
.....
أي اريد النتيجة كما يلي :
COL_NO TRM_NO TRUNC(AVG_PO) NUMBER_OF_STUDENT
------ ---------- ------------- -----------------
1 1 3 1
1 1 4 1
1 1 5 1
1 2 2 2
1 2 3 2
1 2 4 1
2 1 4 2
2 2 1 1
2 3 3 1
2 3 4 4
2 4 3 1
2 4 4 3
3 1 2 1
3 1 3 2
3 2 4 1
3 3 2 2
3 3 3 2
3 4 2 1
3 4 4 1
3 5 2 1
3 5 4 2
و الحل .... ؟؟
The Coder
01-02-2006, 07:28 AM
اليك الحل ....
select col_no ,trm_no ,trunc(avg_po), count(*)number_of_student
from stud
group by col_no , trm_no , trunc(avg_po) ;
فكرته تقسيم بحسب ثلاث اعمدة ....
حاول رسم التقسيم ..... وفهمها , طبق وجرب وفكر وارسم وخطط وتعذب واشقى واتعب ...... وفي النهاية سوف تفهم مالم يفهمه غيرك .
الان انتهى الدرس ...
سوف تتعرف في الدرس القادم على الصلاحيات , و ربط الجداول , والاستعلامات الفرعية ....
واعتقد ان الدرس القادم هو اخر درس في الـ SQL والدرس الذي بعده سوف يكون تمارين وامثلة وحل لأسئلة اختبارات شهادات أوراكل المعتمدة ان شاء الله ... لذا ترقب
عجماني
01-02-2006, 10:26 AM
بصراحه احببتك في الله
صح شرحك طويل بس ممتع ومفيد
الى الامام يابرفسور
The Coder
01-02-2006, 07:30 PM
بصراحه احببتك في الله
صح شرحك طويل بس ممتع ومفيد
الى الامام يابرفسور
شكرا لك يا عجماني ....
و انا كنت قاصد تطويل الدرس ... لان بعضهم لا يستطيع الفهم كثيرا .. من الكلام المختصر ^^
الناس اجناس يا سيدي ^^
سلااااااااام
allahome
02-02-2006, 04:29 PM
بسم الله الرحمن الرحيم
أخى العزيز ...
بارك الله فيك و جعله الله فى ميزان حسناتك
اخى الفاضل
انا اقوم الآن و معى بعض الزملاء المتخصصين بعمل موسوعه كبيره تكو