صفحة 5 من 12 الأولىالأولى 12345678910 ... الأخيرةالأخيرة
النتائج 61 إلى 75 من 169

الموضوع: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

  1. #61
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء


    طيب ... اريد وضع ارقام كسرية ... ولتكن .. ثلاث خانات !!

    يعني بهذا الشكل
    $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 في المدخل الثاني ؟؟ اذن هذا المستخدم يريدني ان اعرض له صباحا ام مساء !! "

    هل فهمت الفكرة ؟؟

    انا متأكد ان هنالك من لم يفهم .. وأغلق الدرس كله ...


  2. #62
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    اليك مثال .. فيه تلاعب في الطريقة هذه ....

    طيب .. لا اريد عرض الساعات : الدقائق : الثواني

    اريد عرض الدقائق : الثواني : الساعات ثم صباحا ام مساء
    ...

    واو .. ملخبطة ... ولكنني اريد عرضها بالشكل السابق
    !!

    ماذا اعمل ؟

    اليك الجملة ....


    كود:
    
    
    كود:
    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

    وهكذا ....

  3. #63
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء


    الان دارت الايام ,,,
    كود:
    
    
    كود:
    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;



    هاها ... الان تغلبنا على الدالة .. وسوف تعرض النتيجة ماذا ؟؟؟ ركز في انها على مستوى الشهر !!

    من يعرف ؟؟

    لا احد يعرف ؟؟

    ؟؟؟؟

    ؟؟؟

    ؟؟

    ؟

  4. #64
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء


    طيب النتيجة ستكون :
    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

    العمل :
    ???? اعتقد قص التاريخ ؟؟

    الأمثلة :

    هل تذكرها ؟؟

    نفس تلك الموجودة في قص الاعداد ... ولكن هذه المرة ... التواريخ ....
    ندخل في الأمثلة ....


    [
    code]

    select trunc(to_date('15/08/2006','dd/mm/yy'),'month') from dual;
    [/code]
    مالنتيجة لو كانت
    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



    دوال لأغراض
    الأرقام ... صورة 29




    دوال لأغراض التواريخ .. صورة 39



    دوال لأغراض التحويل !! صورة 49






    هل انتهت الدوال الاحادية ... هل تخلصنا منها الى الأبد ؟؟ هل نبدأ في دوال المتعددة الصفوف ونرتاح ؟؟

    لا لا لا .. لا ...

    بقيت دالة واحدة لا تصنف ضمن الدوال السابقة !!

  5. #65
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    الدالة :
    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 وهو رقم .... ماذا نعمل ؟؟؟

    مشكلة الاستحضار الان بدأت لديكم
    ....

    و
    أظن ان مشكلة الحفظ بدأت قبلها لديكم ....

    ممممم .... هههههه ... سوف اجعله تعذيب .. أأقصد تحدي ,,

    وهو التحدي الرابع

    انتهت رحلتنا في كوكب ... الدوال الاحادية الصف ,’,’,’,’,’,’,’


  6. #66
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء


    2) الدوال المتعددة الصفوف
    Multi-Row Function

    اولا وقبل كل شيء .... مالفرق بين الدوال الاحادية الصف ... والمتعددة الصفوف ؟؟

    تعرف ؟؟

    انظر المثال التالي .. (الصورة 59)












    انظر الى الجدول في المنتصف ...

    يمين ... ستجد دالة تسمى بـ
    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 فهو الحرف جيم ...(الخامس الاكبر)

    فهمت ؟؟؟


  7. #67
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء


    الدالة :
    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 ;

    معنى السطر الثاني ... عندما لا يساوي الراتب الإضافي صفرا

    والنتيجة تكون .. ثلاثة !!

    تنبه لهذه الدالة ... قد تكون هنالك اخطاء كهذه لم اذكرها انا .. وقد لا تهتم اليها ,,,

    هل هذا كل شيء عن الدوال المتعددة ؟؟

    هل هي بهذه السهولة ؟؟

    هل انتهينا منها ؟؟

    هل توجد مصاعب اكثر ؟؟

    هذا ما سنعرفه في الدرس القادم ^^
    ,’,’,’,’,’,’,’,’,’,’,’,’,’,’,’

  8. #68
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    تنبه ان الدرس القادم .. صعب قليلا ... ومسلي اكثر من هذه الدوال !!

    الدوال يجب ان تحفظها عن بكرة ابيها !!

    قد تكون كثيرة ..

    قد تكون ملخبطة ..

    قد تطفش منها ...

    قد تكون مملة !!

    ستختفي هذه الأعراض
    اذا تمكنت منها ..... صدقني ,,,


    وصلى الله على نبينا محمد وعلى اله وصحبه وسلم

    التحديات للتذكير وهي موجودة بين السطور
    .... أرجو منك عرضها في موضوع الاستفسارات ,,,


    التحدي الاول ...
    تخيل انه يوجد موظفين أرصدتهم في البنك مايلي ..
    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 ;

    كانت نتيجتها اقل من مجموع الرواتب .. وهي من المفترض ان تكون اكثر !!

    فسر لي .. لماذا ظهرت النتيجة اقل ؟؟

    واخبرني مالحل .. وما العمل ؟؟ ما الجملة البديلة ؟؟

  9. #69
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    بسم الله الرحمن الرحيم

    الدرس العاشر
    اسم الدرس : جملة الاستعلام
    select والدوال

    نوع الدرس : تطبيقي

    صعوبة الدرس : *** من *****

    اهميــة الدرس : ****** من ***** (
    Over)

    درجة احتراف لغة
    SQL المتوقعة بعد هذا الدرس : *** من ***** (متوسط )

    الوقت المتوقع منك لفهم الدرس :
    10 ساعة (ساعتين فهم و 8 ساعات تطبيق )

    متطلبات تتوفر فيك : التطبيق


    المتوقع منك في هذا الدرس :

    - اتقان جزء من هذه اللغة 100 %

    - معرفة اضافة , تعديل , وحذف البيانات من الجدول عبر لغة
    DML

    - معرفة التراجع والحفظ

    - معرفة انشاء , تعديل , حذف الجداول والحقول عبر لغة
    DDL


    هيا لنؤركل ^^

    السلام عليكم

    قبل البدء .. اكتشفت دالة جديدة ....

    المشكلة في تعدد المناهج ....

    لا ادري هل يوجد غير هذه الدالة ..... ولكن اذا وجدتها فسوف اعرضها في الدروس القادمة ان شاء الله ’,’,’,’,’,

    الدالة صعبة قليلا ...

    ليست كالدوال السابقة !!

    الدالة قد تجعلك تكره الـ
    SQL .. وقد تحببك فيها ,’,’,’

    اما هذه الدالة فهي ....

    الدالة :
    DECODE

    العمل :
    ????

    الأمثلة :
    لو لدينا مجموعة احتمالات ..... فمثلا ...

    انا كمدير عام .. اريد ان ارفع مرتبات الموظفين .... بنسبة معينة ...

    فكل محلل ارفع راتبه بنسبة 5
    0%

    و كل مدير ارفع راتبه بنسبة 4
    0%

    و كل كاتب .. ارفع راتبه بنسبة
    20%

    وكل بائع .. ارفع راتبه بنسبة 1
    0%

    وطبعا ارفع راتبي بنسبة
    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%

    هكذا اعدل وافضل !!

    سنعود ...


  10. #70
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    اليك الجملة .... وكلي ثقة انك فكرت اصلا في الحل ...

    اولا يا اصحاب الرياضيات ... يا احباب الرياضيات .. يا ضعاف الرياضيات ..

    كيف نعرف ان هذا الراتب اقل من كذا وكذا ؟؟ واكبر من كذا وكذا ؟؟

    المسئلة هذه بسيطة .... فمثلا ... 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



  11. #71
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    اليك مثال اخير ....




    اذا راتب اقل من 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 أي الجزء المنطقي منها !!

    وما بعدهما يهون , وبسيط !!

    كيف تعمل التقارير وكيف تعمل النوافذ وكلام فاضي .. تحفظه في ايام بسيطة .. اسبوع اسبوعين بالكثير ولا يوجد معك مشاكل ,’,’,’

    ........

  12. #72
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء


    الان ما هي اقسام لغة الـ
    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 ؟؟أو عن وجود قيم خالية في المفتاح الاجنبي !!

    هل تذكر الصفوف او السجلات اليتيمة !! ؟؟

    هل تذكرها ؟؟ في الدرس الخامس على ما اعتقد !!

    اذهب واقرأها ثانية !!

  13. #73
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    أصر على عدم إكمال مشوارك اذا لم تفهمها او نسيتها !!

    وأصر على ان ترجع الى الدرس الخامس وبشدة !!

    نرجع ...

    لقد اخبر الأوراكل هو من عمل الجدول !!

    وسوف ندرس كيف نعمل الجداول ونعمل هذا الربط بين الجداول , ان شاء الله قريبا

    هل صعبة جملة الادخال
    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 الذان اضفناهما صباح هذا اليوم ...

    كيف ؟

    بالجملة الاكثر رعبا من التعديل !! انها الجملة المدمرة !! انها الجملة القاضية !!

    انها جملة حذف وتدمير السجلات
    !!


  14. #74
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    الجملة الثالثة
    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)


    فسوف لن يحفظ لك العمليات التي عملتها .. جرب واضف موظف , ثم اغلق البرنامج من علامة الـ
    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

    وهي التي تخص بتعديل , حذف او إضافة و إنشاء الجداول وخصائصها (الاعمدة) وعلاقاتها ..

    هذه اللغة طويلة الى حد ما ... فانتبه ,

    وتنبه لشيء اخر , وهو الحفظ !! سوف تتشتت كثيرا , لذا حاول ان تعمل عملية الفهرسة (التلخيص الذاتي) لكي لا تتشتت ,’,’,’,’,’
    -
    البيانات ... وما أدراك مالبيانات .

    هي القيم ... الموجودة في الجداول , والتي اما ان تكون أرقام , تواريخ , نصوص

    الان اريدك ان تنسى أرقام تواريخ نصوص !!

    وأريدك الان ان تتعرف الى أنواع البيانات الحقيقية في الأوراكل
    !!


  15. #75
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    مشاركة: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    اولا :
    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 , ماذا اعمل ؟؟

    هل نستطيع فعل ذلك ؟؟ هل تتخيل معي الوضع ؟؟ هل من الممكن ان انسخ جدول كامل بكل مافيه .. من سجلات واعمدة في جدول اخر في امر واحد فقط ؟؟؟ الان نرى ذلك .


صفحة 5 من 12 الأولىالأولى 12345678910 ... الأخيرةالأخيرة

ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •