الان انظر الى قيود الجدول الاخر :
كود: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)
الصورة توضح عرض اكبر قيمة في القسم 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
يااااا سلام ... رائع