• 0
  • مالي خلق
  • أتهاوش
  • متضايق
  • مريض
  • مستانس
  • مستغرب
  • مشتط
  • أسولف
  • مغرم
  • معصب
  • منحرج
  • آكل
  • ابكي
  • ارقص
  • اصلي
  • استهبل
  • اضحك
  • اضحك  2
  • تعجبني
  • بضبطلك
  • رايق
  • زعلان
  • عبقري
  • نايم
  • طبيعي
  • كشخة
  • صفحة 7 من 12 الأولىالأولى ... 23456789101112 الأخيرةالأخيرة
    النتائج 91 إلى 105 من 169

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

    1. #91
      التسجيل
      26-07-2005
      الدولة
      Australia
      المشاركات
      3,368
      المواضيع
      68
      شكر / اعجاب مشاركة

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

      الان انظر الى قيود الجدول الاخر :











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




      يااااا سلام ... رائع




      التعديل الأخير تم بواسطة The Coder ; 01-02-2006 الساعة 06:33 AM

    2. #92
      التسجيل
      26-07-2005
      الدولة
      Australia
      المشاركات
      3,368
      المواضيع
      68
      شكر / اعجاب مشاركة

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

      الان نطورها قليلا , ونضع الرواتب الكلية :
      كود:
      select sum(sal+nvl(comm,0) ) from emp
      
      group by deptno ;


      كود:
      SUM(SAL+NVL(COMM,0))
      
      --------------------
      
      8750
      
      10875
      
      11600
      ممممم لا تعجبني النتيجة هكذا ...

      اريد ان اضيف رقم القسم بجانب النتائج ....
      كود:
      select deptno , sum(sal+nvl(comm,0) ) from emp
      
      group by deptno ;
      والان دعنا نرى النتيجة ... بشكلها الجميل :
      كود:
      DEPTNO SUM(SAL+NVL(COMM,0))
      
      ------ --------------------
      
      10 8750
      
      20 10875
      
      30 11600
      الان اقتنعت ...

      لنجرب دالة القيمة الاعلى
      max للرواتب ...


      كود:
      select deptno , max(sal) from emp 
      
      group by deptno ;


      كود:
      DEPTNO MAX(SAL)
      
      ------ ----------
      
      10 5000
      
      20 3000
      
      30 2850
      الان ... انا لم اكتفي .. اريد تعقيد الامور !!

      اريد ان اعرض اسم صاحب اكبر راتب و قسمه ... مقسما النتائج على حسب رقم القسم ..

      ما رأيك في هذا الحل :
      كود:
      select ename,deptno,max(sal) from emp 
      
      group by deptno ;
      فكر في حلي ...

      هل هو صحيح ؟؟ ولماذا ؟

      لماذا هو صحيح ؟ لماذا هو خاطئ ؟؟

      في الحقيقة .. هو خاطئ مئة بالمئة !!

      لماذا خاطئ ؟ وضعنا سابقا العمود
      deptno فصار الحل صحيح ... ولكن عندما اضفنا ename اصبح خاطئ !!

      لماذا يا ترى ؟

      اذا لم تفهم لماذا ... فسوف تضطر لقرائة عدة سطور مملة (ما بين علامتي التنصيص) ... اقرأها او لا تقرأها , الخيار لك ... سوف تستغرق قرائتها اقل من دقيقتين ونصف ...
      "
      انظر هذه الجملة .. للتذكير:

      كود:
      select deptno , max(sal) from emp 
      
      group by deptno ;

      في الجملة قلنا (اعرض رقم القسم , و أعلى راتب ..... و قسم النتائج بحسب رقم القسم) .... ما معنى هذا ؟؟

      معناه انه لو يوجد لدينا الأقسام
      10 و 20 و 30 و 40 مثلا ...



      -
      سوف يقسم الصفوف الى اربع مجموعات , المجموعة الاولى و بها الصفوف التي تحتوي على القسم 10

      والمجموعة الثانية تخص الصفوف التي تحتوي على القسم 20 ...... الخ



      -
      المجموعة الاولى مثلا بها 5 صفوف ... وكل من هذه الصفوف تتبع القسم 10 صح ؟

      أي ان المجموعة الاولى همها واحد , لغتها واحدة , قسمها واحد , تشترك في صفة واحدة وهي القسم 10

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

      كذلك المجموعة الثالثة والرابعة .....



      -
      مثلا المجموعة الاولى ... هل تشترك في اسم الموظف و اسم الموظفين جميعهم اسم واحد ؟؟ لا

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



      -
      الان بعد تقسيمها الى مجموعات نعمل اهم خطوة... وهي ضم كل صفوف المجموعة الواحدة لتمثل صف واحد !! انتبه ... فهذه اهم خطوة يجب التنبه فيها , الان .... قبل ان نضم... هل توجد دالة من نوع المتعددة الصفوف لنقل مثلا نعم توجد دالة .... إنها دالة max ... أي اكبر راتب موجود في هذه المجموعة .



      -
      سوف يختار اكبر راتب ...و ينشئ عمودين هما رقم القسم , واكبر راتب لكي يمثلان المجموعة الاولى ....

      وهكذا مع المجموعات الاخرى



      -
      اذن الخلاصة هي انه بإمكاننا ان نعرض رقم القسم لاننا وضعناه في جملة group by , ولا يمكننا ان نعرض عمود اخر كاسم الموظف ..., لذا لا تضع عمود لم يذكر في جملة group by

      "
      الان .... لنعقد الامور اكثر واكثر ....

      الان تخيل انه لدينا الف قسم ... واريد ان اعرف اكبر مجموع رواتب كل قسم ...

      أي انه بعد معرفة مجموع رواتب كل قسم ... كما شاهدنا سابقا , اريد ان اعرف اكبر مجموع !!

      لو نظرنا الى مايلي :
      كود:
      DEPTNO SUM(SAL+NVL(COMM,0))
      
      ------ --------------------
      
      10 8750
      
      20 10875
      
      30 11600
      لعرفنا ان اكبر مجموع بين الثلاثة هو 11600

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

      فكر قليلا .... الجواب في رأسك وانت لا تعلم ....



      اليك الحل :
      كود:
      select max(sum(sal+nvl(comm,0) ) ) from emp 
      
      group by deptno ;
      والنتيجة ...
      كود:
      MAX(SUM(SAL+NVL(COMM,0)))
      
      -------------------------
      
      11600

      كل مافعلناه .... هو مايلي ..
      Max(sum(….) )
      وكما نعرف ... الدوال ترجع بقيمة (تخرج قيمة)

      دالة الـ
      sum هنا اخرجت لنا قيم .. وهي ثلاث صفوف ... (مجموع رواتب كل قسم من الأقسام الثلاثة ...)

      هل عرضت لنا ثلاث صفوف ؟ لا !!

      من استقبلها ؟ انها الدالة
      max , استقبلتها بكل سرور , واختارت القيمة الاعلى منها , ثم عرضته لنا

      هل فهمت الفكرة ! اعتقد انها سهلة .

      الان اليك التعقيد العالمي .....

      تخيل انه يوجد لدينا جدول الطلبة .. مجرد تخيل لهذا الجدول ...به الاعمدة التالية :

      رقم الطالب ... رقم الكلية .. عدد الأترام ... ومعدل الطالب .

      اريدك ان تنسخ هذا الجدول كما هو .... :

      كود:
      create table stud(
      
      stu_no number ,
      
      col_no number ,
      
      trm_no number ,
      
      avg_po number(3,2),
      
      constraint stud_stu_no_pk primary key(stu_no) );
      Stu_no
      رقم الطالب .

      Col_no
      رقم الكلية.

      trm_no
      رقم اخر ترم درسه .

      Avg_po
      معدل الطالب .

      الان .. انسخ جميع الصفوف كما هي , ثم الصقها في البرنامج
      SQL PLUS* ... :

      كود:
      
      
      كود:
      
      
      كود:
      insert into stud values (10 ,1,1,3.74) ; insert into stud values (20 ,1,1,5.00) ; insert into stud values (30 ,1,1,4.85) ; insert into stud values (40 ,1,2,3.12); insert into stud values (50 ,1,2,3.66); insert into stud values (60 ,1,2,4.02); insert into stud values (70 ,1,2,2.00); insert into stud values (80 ,1,2,2.88); insert into stud values (100,2,1,4.89); insert into stud values (110,2,1,4.00); insert into stud values (120,2,2,1.89); insert into stud values (130,2,3,4.61); insert into stud values (140,2,3,4.22); insert into stud values (150,2,3,4.57); insert into stud values (160,2,3,4.64); insert into stud values (170,2,3,3.01); insert into stud values (180,2,4,4.42); insert into stud values (190,2,4,3.64); insert into stud values (200,2,4,4.99); insert into stud values (210,2,4,4.50); insert into stud values (220,3,1,3.32); insert into stud values (230,3,1,2.23); insert into stud values (240,3,1,3.73); insert into stud values (250,3,2,4.77); insert into stud values (260,3,3,2.40); insert into stud values (270,3,3,2.93); insert into stud values (280,3,3,3.40); insert into stud values (290,3,3,3.66); insert into stud values (300,3,4,2.71); insert into stud values (310,3,4,4.17); insert into stud values (320,3,5,4.98); insert into stud values (330,3,5,2.53); insert into stud values (340,3,5,4.24);

      يا سلام ... الان انظر الى الجدول الجديد :

      كود:
      select * from stud ;

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

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

      الان اريد ان اعرض عدد الطلبة الذين اخذو عدد اترام معين , في الكلية الواحدة ,


      أي انه يخبرني ان هنالك ثلاث طلاب يأخذون الترم الثاني في الكلية الاولى , وهنالك طالبين يأخذون الترم الثالث في الكلية الاولى , وان هنالك طالب واحد يأخذ الترم الاول في الكلية الثانية .... وهكذا ...

      اريدك ان تفكر في السوال .. لا تفكر في الاجابة ..

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

      النتيجة ستكون بهذا الشكل .....







      كود:
       
      NUMBER_OF_STUDENT COL_NO TRM_NO
       
      ----------------- ---------- ----------
       
      3 1 1
       
      5 1 2
       
      2 2 1
       
      1 2 2
       
      5 2 3
       
      4 2 4
       
      3 3 1
       
      1 3 2
       
      4 3 3
       
      2 3 4
       
      3 3 5


      في الصف الاول .... يقول انه يوجد ثلاث طلبة في الكلية رقم واحد يدرسون الان الترم الاول ,


      وفي الصف الثاني ... يقول انه يوجد خمس طلبة في الكلية رقم واحد ايضا , يدرسون الترم الثاني .

      اليك الحل ....





      كود:
       
      select count(*) number_of_student , col_no , trm_no
       
      from stud
       
      group by col_no , trm_no ;




      جملة التقسيم
      group by احتوت على عمودين !!


      لاحظ انني وضعت رقم الكلية و الترم لكي اعرضهما ... أي كلاهما باستطاعتنا عرضهما ولا يوجد مشاكل .. لماذا ؟ لانهما ذكرا في جملة الـ
      group by...






      العملية معقدة جدا , لو كان هنالك تقسيمات اكثر من عمودين .


      في الجملة السابقة سوف يقسم الصفوف الى ثلاث مجموعات (لانه يوجد ثلاث كليات)

      ثم يقسم كل مجموعة من هذه المجموعات على حسب رقم الترم ...







      أي انه بعد تقسيمه الى ثلاث مجموعات ينظر الى المجموعة الاولى من الصفوف ... ويجدها 8 صفوف ...


      الصفة المشتركة بينهما هي ان رقم الكلية هو 1

      نأتي للتقسيم الاخر ...

      وهو على حسب عدد الاترام ...

      الثمانية صفوف التي بالمجموعة الاولى سوف تقسم الى مجموعتين(لانه في الصفوف الثمانية لا يوجد الا ترمين , الاول والثاني !!)... الاولى منها صفوف الطلبة الذين يدرسون في الترم الاول , والثانية هي صفوف الطلبة الذين يدرسون في الترم الثاني ... لو وجد ترم اخر مثلا .. سوف يكون هنالك مجموعة ثالثة .... وهلم جر ... الان لدينا مجموعتين في الكلية رقم 1
      ...








      اذا كنت ما زلت غير مقتنع ... اذا كنت لا تفهم بلغة الكتابة ... اذا لم تعرف كيف اتت النتيجة السابقة ... اذا لم ترد ان تقرأ اصلا ... انظر الصورة :















      لاحظ انه في حلنا السابق .. كتبنا مايلي :






      group by col_no , trm_no








      لو قلبناها وجعلناها هكذا :






      group by trm_no , col_no






      مالذي سوف يحدث ؟


      ستكون نفس النتائج , ولكن بترتيب مختلف ...

      في الاولى يقسم المجموعات بارقام الكليات ثم بالاترام ,

      الثانية يقسم المجموعات بالاترام ثم بالكليات ...

      انظر النتائج واستنتجها بنفسك ...










      كود:
       
      select count(*) number_of_student , col_no , trm_no
       
      from stud
       
      group by trm_no , col_no ;


      كود:
       
      NUMBER_OF_STUDENT COL_NO TRM_NO
       
      ----------------- ---------- ----------
       
      3 1 1
       
      2 2 1
       
      3 3 1
       
      5 1 2
       
      1 2 2
       
      1 3 2
       
      5 2 3
       
      4 3 3
       
      4 2 4
       
      2 3 4
       
      3 3 5


      الان ... اريدك ان تتعرف على جملة الترتيب , والتي تجاهلتها منذ البداية لشيء ما في نفسي .


      جملة
      Order by :






      اريد ترتيب جدول الموظفين تصاعديا على حسب رواتبهم ...


      تصاعديا يعني
      Ascending ... من تحت الى فوق , يعني يصعد ... يعني من الصغير الى الكبير .

      تنازليا يعني
      Descending ... أي العكس .

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











      كود:
       
      select ename,sal from emp
       
      order by sal asc;

      كود:
       
      ENAME SAL
       
      ---------- ----------
       
      SMITH 800
       
      JAMES 950
       
      ADAMS 1100
       
      WARD 1250
       
      MARTIN 1250
       
      MILLER 1300
       
      TURNER 1500
       
      ALLEN 1600
       
      CLARK 2450
       
      BLAKE 2850
       
      JONES 2975
       
      SCOTT 3000
       
      FORD 3000
       
      KING 5000


      الان تنازليا ...






      كود:
       
      select ename,sal from emp
       
      order by sal desc ;


      كود:
       
      ENAME SAL
       
      ---------- ----------
       
      KING 5000
       
      SCOTT 3000
       
      FORD 3000
       
      JONES 2975
       
      BLAKE 2850
       
      CLARK 2450
       
      ALLEN 1600
       
      TURNER 1500
       
      MILLER 1300
       
      WARD 1250
       
      MARTIN 1250
       
      ADAMS 1100
       
      JAMES 950
       
      SMITH 800


      التعديل الأخير تم بواسطة The Coder ; 01-02-2006 الساعة 06:37 AM

    4. #94
      التسجيل
      26-07-2005
      الدولة
      Australia
      المشاركات
      3,368
      المواضيع
      68
      شكر / اعجاب مشاركة

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

      بإمكاننا ان نتجاهل كلمة
      ASC , أي لو كتبنا :

      كود:
      select ename,sal from emp
      
      order by sal ;
      سوف يتم عرضها تصاعديا , لذا فبامكانك تجاهل
      ASC .

      الان تعال لنعقد بعض الامور , ونخلط
      group by مع order by ولنرى النتائج ...

      على فكرة ,
      group by ترتب النتيجة تصاعديا بشكل اوتوماتيكيا , أي :

      كود:
      select deptno from emp
      
      group by deptno ;


      كود:
      DEPTNO
      
      ------
      
      10
      
      20
      
      30
      اريد ان اعرض مجموع رواتب الموظفين لكل قسم , بشكل تنازلي .

      كود:
      select sum(sal) , deptno from emp
      
      group by deptno 
      
      order by sum(sal) desc ;


      كود:
      SUM(SAL) DEPTNO
      
      -------- ----------
      
      10875 20
      
      9400 30
      
      8750 10
      هل لاحظت جملة الترتيب ؟ رتبنا ماذا ؟ هل رتبنا الرواتب ؟ بل رتبنا مجموع الرواتب ....
      . اذا لم تفهم مالذي حدث فاقول لك .... ركز قليلا في الجملة ... اذا لم تفهم لماذا حدث ما حدث .. فاقول لك صبرا وسوف تعرف لماذا .

      طيب , فكر لو كتبنا هكذا :

      كود:
      select sum(sal) , deptno from emp
      
      order by sum(sal) desc
      
      group by deptno ;
      فهذا يعتبر خطأ !!

      اذن يجب ان تكتب جملة التقسيم
      group by ثم جملة الترتيب order by

      انظر ما يلي :
      كود:
      select sum(sal) , deptno from emp
      
      group by deptno 
      
      order by sal desc ;
      فهذا الامر .... خطأ !!

      لان
      order by قال "رتب بحسب الرواتب " , فنقول له , لقد قسمنا الناتج وضمينا الناتج , ونتوقع منك يا order by ان ترتب على حسب رقم القسم او على حسب مجموع الرواتب فقط لا غير .


      بإمكاننا ان نعمق مفهوم الترتيب اكثر , ونقول لك ..

      اريد ان اعرض جدول الموظفين على حسب رقم القسم تصاعديا , ويكون كل قسم مرتب فيه الرواتب تنازليا .
      كود:
      DEPTNO SAL ENAME
      
      ------------ ----- ------
      
      10 5000 KING
      
      10 2450 CLARK
      
      10 1300 MILLER
      
      
      
      20 3000 SCOTT
      
      20 3000 FORD
      
      20 2975 JONES
      
      20 1100 ADAMS
      
      20 800 SMITH
      
      
      
      30 2850 BLAKE
      
      30 1600 ALLEN
      
      30 1500 TURNER
      
      30 1250 WARD
      
      30 1250 MARTIN
      
      30 950 JAMES
      اليك الامر ...

      كود:
      select deptno,sal,ename from emp
      
      order by deptno asc ,sal desc;
      الان .... انا ارى في النتيجة السابقة لا تعجبني .

      هنالك اثنين تعملون في القسم نفسه ... و يأخذون الراتب نفسه , احدهما
      SCOTT والاخر FORD

      وهنالك اثنان آخران نفس الحالة ...

      لو انه يوجد الف شخص يعملون في نفس القسم , لهم نفس الراتب .. اريد ترتيبهم على حسب القسم تصاعدي , ثم الراتب تنازليا , ثم الاسم تصاعديا !! فكما شاهدنا في النتيجة السابقة , وضع
      scott اولا ثم ford وانا اريده بالعكس .. وترتيب الاسم تصاعدي أي من A الى Z





      كود:
      select deptno,sal,ename from emp
      
      order by deptno asc ,sal desc,ename asc ;
      والان ستكون النتيجة :
      كود:
      DEPTNO SAL ENAME
      
      ------ ---------- ------
      
      10 5000 KING
      
      10 2450 CLARK
      
      10 1300 MILLER
      
      20 3000 FORD
      
      20 3000 SCOTT
      
      20 2975 JONES
      
      20 1100 ADAMS
      
      20 800 SMITH
      
      30 2850 BLAKE
      
      30 1600 ALLEN
      
      30 1500 TURNER
      
      30 1250 MARTIN
      
      30 1250 WARD
      
      30 950 JAMES
      اعتقد انني سئمت وزهقت من هذا الموضوع , وطولت فيه

      مثال اخير :
      كود:
      select col_no , to_char(avg(avg_po) ,'0.00') , trm_no , count(*) number_of_student
      
      from stud
      
      group by col_no , trm_no 
      
      order by col_no , avg(avg_po) ;




      كود:
      COL_NO TO_CH TRM_NO NUMBER_OF_STUDENT
      
      ------ ----- ---------- -----------------
      
      1 3.14 2 5
      
      1 4.53 1 3
      
      2 1.89 2 1
      
      2 4.21 3 5
      
      2 4.39 4 4
      
      2 4.45 1 2
      
      3 3.09 1 3
      
      3 3.10 3 4
      
      3 3.44 4 2
      
      3 3.92 5 3
      
      3 4.77 2 1
      جملة
      HAVING :

      الان اريد ان اعرض مجموع رواتب الموظفين في كل قسم , بشرط ان يكون مجموع الراتب لقسم ما اكبر من 9000 دولار !!

      فكر .... فكر .... فكر ......

      انظر الى الحل الصحيح ...
      :

      كود:
      select sum(sal),deptno
      
      from emp 
      
      where sum(sal) > 9000 
      
      group by deptno;
      والنتيجة سوف تكون ....
      كود:
      ORA-00934: group function is not allowed here
      خطأ مع مرتبة الشرف .!!!!

    5. #95
      التسجيل
      26-07-2005
      الدولة
      Australia
      المشاركات
      3,368
      المواضيع
      68
      شكر / اعجاب مشاركة

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

      لا يمكننا استخدام الدوال المتعددة الصفوف مع جملة الشرط
      where , لذا لزم علينا اختراع جملة شرطية جديدة خاصة بالدوال المتعددة الصفوف , الا وهي having .



      كود:
      select sum(sal),deptno 
      
      from emp 
      
      group by deptno
      
      having sum(sal) > 9000 ;


      كود:
      select sum(sal),deptno 
      
      from emp 
      
      group by deptno
      
      having sum(sal) > 9000 ;


      كود:
      SUM(SAL) DEPTNO
      
      -------- ----------
      
      10875 20
      
      9400 30
      هل فهمت ؟ سهلة جدا , كأنها
      where لكنها خاصة بالنتائج النهائية لجملة التقسيم !!, هل تفهم ما معنى النتائج النهائية ؟ أي انظر فيما يلي :

      كود:
      select sum(sal),deptno 
      
      from emp 
      
      group by deptno ;
      انظر الى النتيجة النهائية ...
      كود:
      SUM(SAL) DEPTNO
      
      -------- ----------
      
      8750 10
      
      10875 20
      
      9400 30
      طيب .. من النتيجة النهائية , اريد ان اعرض منها فقط , كل ارقام القسم التي هي اكبر من 10 .... :

      كود:
      select sum(sal),deptno 
      
      from emp 
      
      group by deptno
      
      having deptno>10 ;
      انظر الناتج :

      كود:
      SUM(SAL) DEPTNO
      
      -------- ----------
      
      10875 20
      
      9400 30
      بعد ان قسم الى مجموعات ... وعرف الناتج ... طبق جملة الشرط
      having , ثم عرض علينا الناتج النهائي .

      مع العلم انه لو قلنا :

      كود:
      select sum(sal),deptno 
      
      from emp 
      
      group by deptno
      
      having sal > 1000 ;
      فهو خطأ !! , واعتقد انك تعرف لماذا .

      الان دعنا نضع كل شيء في جملة واحدة !

      اريد ان اعرض وظائف و مجموع الرواتب لكل وظيفة والتي هي اكبر من
      4000 دولار , بشرط ان لا تكون هذه الوظيفة وظيفة مدير , ومرتبه ترتيبا تنازليا على حسب مجموع الرواتب !!

      بالله عليك فكر قليلا , لان هذا المثال من اعقد ما يكون ..

      فكر فكر فكر فكر فكر فكر .........

      هل فكرت ؟ اليك الحل :


      كود:
      select job,sum(sal) 
      
      from emp 
      
      where job <> 'MANAGER'
      
      group by job 
      
      having sum(sal) > 4000
      
      order by sum(sal);
      هل تصدق ان هذا المثال الشامل الكامل لدرس اليوم !!

      احفظ الترتيب ...
      (clause = جزئية او جملة ... )

      Select clause

      From clause

      Where clause

      Group by clause

      Having clause

      Order by clause



      الان .. ما رأيك ان تكتشف حقيقة برنامج الأوراكل في ترجمة جمل الـ
      SQL ؟؟

      مع العلم ان هذا استنتاجي ورأيي الخاص !! , اعتقد انه 90% صحيح , لكن الله العالم كيف عملوا طريقة ترجمة هذه الجمل , انا اجتهدت واختبرت كثيرا , واعتقد انه بإمكاني عمل برنامج شبيه ببرنامج
      SQL PLUS*



      ترتيب قرائة برنامج الأوراكل :

      اذا لم ترغب بالقرائة ... او انك لم تفهم السطور القادمة , يكفيك فقط ان تعرف ان البرنامج سوف ينفذ اولا الجملة الشرطية
      where ثم group by ثم having ثم أخيرا order by

      اليك مثالنا السابق :

      كود:
      select job,sum(sal) 
      
      from emp 
      
      where job <> 'MANAGER'
      
      group by job 
      
      having sum(sal) > 4000
      
      order by sum(sal);
      اولا : يذهب الى
      from clause

      يرى ما هو الجدول ... ثم يذهب ويبحث عنه اذا لم يجده فسوف يعطيك خطأ بأنه لم يجد الجدول .. اذا وجده يذهب للخطوة الثانية

      ثانيا : يذهب الى
      where clause (اذا وجده اصلا)

      يرى الشرط هل هو صحيح اصلا او لا , اذا كان صحيحا يبدأ ويطبق الشرط على الجدول , ثم ينسخ الى الذاكرة الناتج (لنسميه الناتج أ )
      .



      ثالثا : يذهب الى
      group by clause (اذا وجده اصلا)

      يرى هل العمود المراد تقسيم الناتج ( الناتج أ ) .. موجود اصلا في الجدول او لا
      !!

      اذا لا ... فهذا خطأ .


      طبعا اذا وجد عمودين , يقسم بالاول ثم يقسم بالثاني
      ...

      المهم يقسم على حسب الاعمدة الموجودة , ثم يخزن في الذاكرة الناتج مقسما (لنسميه الناتج ب )
      .



      رابعا : يذهب الى
      having clause (اذا وجده اصلا )

      سوف يرى , هل الشرط صحيح او لا .. بمعنى هل الشرط يتناسب مع التقسيم (الناتج ب) او لا ...

      في الحقيقة ان
      having اصلا لا يأتي نفعها فعليا الا اذا وجد group by .

      الان سوف يطبق الشرط الموجود في الجملة
      having على الناتج المقسم ( الناتج ب ) ومن ثم يكون الناتج الاخير في الذاكرة ( لنسميه الناتج ج )

      خامسا : يذهب الى
      order by clause

      سوف يرى اولا هل الاعمدة التي في
      order by موجودة في الناتج ج ؟؟ او لا

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


      سادسا
      :الان يذهب الى select clause , ويرى الاعمدة الموجودة به , والتي نريد ان نعرضها ,

      - يرى هل الاعمدة المذكورة موجودة اصلا في الجدول
      او لا ... اذا لا يعطي خطأ ويتوقف .

      -
      يرى هل يوجد دالة متعددة الصفوف او لا , اذا لا يطابق الاعمدة المذكورة مع النتيجةد واذا طابقت يعرض فقط صفوف الاعمدة المذكورة , ويتجاهل البقية .

      - اذا وجد دالة متعددة الصفوف , فإنه ينظر في الناتج د , ويطبق الدالة على كل صف في الناتج د



    6. #96
      التسجيل
      26-07-2005
      الدولة
      Australia
      المشاركات
      3,368
      المواضيع
      68
      شكر / اعجاب مشاركة

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

      الان هذه الخطوات الخمسة نطبقها بشكل عملي على حسب المثال السابق :


      كود:
      select job,sum(sal) 
      
      from emp 
      
      where job <> 'MANAGER'
      
      group by job 
      
      having sum(sal) > 4000
      
      order by sum(sal);
      اولا : يذهب الى
      from clause

      يرى الملف ... اااقصد الجدول
      emp موجود ولا زال على قيد الحياة .


      ثانيا : يذهب الى
      where clause (اذا وجده اصلا)

      نعم يجد الجملة الشرطية هذه , والتي تقول كل الصفوف التي لا تحتوي على العمل "مدير"

      سوف يكون الناتج أ
      :

      كود:
      
      
      كود:
      
      
      كود:
      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ---------- -------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17/12/80 800 20 7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30 7521 WARD SALESMAN 7698 22/02/81 1250 500 30 7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30 7788 SCOTT ANALYST 7566 19/04/87 3000 20 7839 KING PRESIDENT 17/11/81 5000 10 7844 TURNER SALESMAN 7698 08/09/81 1500 0 30 7876 ADAMS CLERK 7788 23/05/87 1100 20 7900 JAMES CLERK 7698 03/12/81 950 30 7902 FORD ANALYST 7566 03/12/81 3000 20 7934 MILLER CLERK 7782 23/01/82 1300 10


      ثالثا : يذهب الى
      group by clause (اذا وجده اصلا)

      سيجده يقول ترتيب بواسطة الـ
      job , نعم هذا عمود موجود في النتيجة أ

      الان سوف يقسمه ويضم الناتج ويتجاهل الاعمدة ما عدى الاعمدة الموجودة في الـ
      group by

      انظر الناتج ب
      :

      كود:
      JOB
      
      ---------
      
      ANALYST
      
      CLERK
      
      PRESIDENT
      
      SALESMAN

      رابعا : يذهب الى
      having clause (اذا وجده اصلا )

      سيجد الشرط يقول ...
      sum(sal) >4000

      ينظر الى الناتج ب .... ويعمل الآتي
      :

      - يجد أول صف هو (العمل =
      analyst)

      -
      يبحث في جدول الـ emp (الجدول الأصلي الذي به جميع الصفوف !!) عن جميع الصفوف التي ( job <> 'MANAGER' ) و التي (job ='ANALYST') فسوف يكون الناتج ...

      كود:
      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      
      ----- ---------- --------- ---------- -------- ---------- ---------- ----------
      
      7788 SCOTT ANALYST 7566 19/04/87 3000 20
      
      7902 FORD ANALYST 7566 03/12/81 3000 20
      -
      قلنا ان الشرط sum(sal) >4000 , مجموع الرواتب هنا ... 6000 ... هل هو اكبر من 4000 ؟ نعم انه اكبر ...

      اذن
      ANALYST ستكون في القائمة ....

      - يرجع الى الصف الذي يليه ثم ينفذ الخطوات السابقة ..


      في النهاية سوف يكون لدينا ... الناتج ج :
      كود:
      JOB 
      
      ---------
      
      ANALYST 
      
      CLERK 
      
      PRESIDENT
      
      SALESMAN

      (بالصدفة وجد كل الوظائف ... مجموع رواتبها اكبر من 4000)

      خامسا : سوف يذهب الى
      order by clause والذي يطلب ترتيب على حسب مجموع الرواتب ..

      سوف يمر على كل صف في الناتج ج

      -
      فمثلا .. يرى ANALYST , ويذهب الى الجدول emp (الجدول الأصلي الذي به جميع الصفوف !!)...

      -
      يبحث عن كل الصفوف التي يكون العمل فيها لا يساوي مدير , والتي يكون العمل فيها يساوي ANALYST

      ثم تظهر له عدة صفوف , ويبدأ يحسب مجموع الرواتب في هذه الصفوف .....

      - انتهى من
      ANALYST , يبدأ في الصف التالي ....

      - في النهاية وبعد ان حفظ مجاميع الرواتب لكل صف في الناتج ج .... يبدأ يرتب بطريقته الخاصة !! وبالتالي تظهر النتيجة د :

      كود:
      JOB 
      
      ---------
      
      CLERK 
      
      PRESIDENT
      
      SALESMAN 
      
      ANALYST
      مرتبة على حسب مجموع الرواتب .

      سادسا :الان يذهب الى
      select clause , ويرى الاعمدة الموجودة به , والتي نريد ان نعرضها ,

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

      وموجود شيء اخر وهو ...
      sum(sal)

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

      انتهت الخطوات ....

      وما بقي عليك الا معرفة انه من الممكن ان تكون طريقتي هذه غير كفئ 100% , اعتقد لو أمعنا وفكرنا , من المؤكد انه يوجد طريقة اخرى أسهل و أفضل
      .

      الان دعنا نعطي بعض الأمثلة
      . من جدول stud السابق ....

      اريد عرض عدد الطلبة الذين حصلوا على معدل
      ما بين 1 و 1.99 أي المعدل الذي عدده الصحيح واحد .

      وعدد الطلبة الذين حصلوا على معدل ما بين 2 و 2.99اي المعدل الذي عدده الصحيح اثنين ..... الخ

      أي اريد الناتج كما يلي :



      كود:
      the avg the number of students
      
      ------- ----------------------
      
      1 1
      
      2 7
      
      3 9
      
      4 15
      
      5 1
      فكر قليلا !!

      يجب ان تعرف حله بنفسك .. واجه المشكلة بنفسك ..

      اليك الحل :

      كود:
      select trunc(avg_po) "the avg" , count(*) "the number of students"
      
      from stud
      
      group by trunc(avg_po) ;
      انظر الى الحل ..

      كم هو سهل ...

      فكر لو حللنا هكذا .. هل ستصبح صحيحة ؟؟ :
      كود:
      select avg_po "the avg" , count(*) "the number of students"
      
      from stud
      
      group by trunc(avg_po) ;
      في الحقيقة خاطئة !!

      هل
      avg_po نفس trunc(avg_po) ؟؟

      انا شخصيا كنت اعتقد انهما متساويتين في العمل , وكنت اعتقد ان الحل السابق كان صحيح !!

      لكن ظهر لي الخطأ فعرفت ان :
      Group by trunc(avg_po)
      سوف يظهر لي نتيجة غير :
      Group by avg_po


      فكر فيها .. , ستجد انه من المخزي عمل مثل الجملة السابقة !! فكر وارسم على ورق الناتج .

      الان , اريد ان اعرض المعدل الحسابي ( المعدل الحسابي هو مجموع القيم مقسوم على عددها !! ) لمعدلات كلية ما والذين اخذو ترم ما ...

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

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

      اريد النتيجة كما يلي :
      كود:
      AVG COL_NO TRM_NO NUMBER_OF_STUDENT
      
      ----- ---------- ---------- -----------------
      
      1.89 2 2 1
      
      3.09 3 1 3
      
      3.10 3 3 4
      
      3.14 1 2 5
      
      3.44 3 4 2
      
      3.92 3 5 3
      
      4.21 2 3 5
      
      4.39 2 4 4
      
      4.45 2 1 2
      
      4.53 1 1 3
      
      4.77 3 2 1
      فكر ....

      اليك الحل :

      كود:
      select to_char(avg(avg_po) ,'0.00') "AVG" , col_no , trm_no , count(*) number_of_student
      
      from stud
      
      group by col_no , trm_no
      
      order by avg(avg_po) ;
      تم تقسيم الصفوف على حسب رقم الكلية , وعدد الأترام
      !!

      ...
      فكر فيها ..... وحاول فهمها بطريقتك .

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

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

      اليك مثال اخير نختم به الدرس .. واعتقد انه سهل عليك الان ,’,’,’

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

      أي عدد الطلبة الذين اخذوا معدل بين 1 و 1.99 في الكلية الاولى , وعدد اترامهم ترم واحد ...

      وعدد الطلبة الذين اخذوا معدل بين 1 و 1.99 في الكلية الاولى ... وعدد اترامهم ترمين ..
      .

      .....

      .....

      .....

      أي اريد النتيجة كما يلي :
      كود:
      COL_NO TRM_NO TRUNC(AVG_PO) NUMBER_OF_STUDENT
      
      ------ ---------- ------------- -----------------
      
      1 1 3 1
      
      1 1 4 1
      
      1 1 5 1
      
      1 2 2 2
      
      1 2 3 2
      
      1 2 4 1
      
      2 1 4 2
      
      2 2 1 1
      
      2 3 3 1
      
      2 3 4 4
      
      2 4 3 1
      
      2 4 4 3
      
      3 1 2 1
      
      3 1 3 2
      
      3 2 4 1
      
      3 3 2 2
      
      3 3 3 2
      
      3 4 2 1
      
      3 4 4 1
      
      3 5 2 1
      
      3 5 4 2
      و الحل .... ؟؟

    7. #97
      التسجيل
      26-07-2005
      الدولة
      Australia
      المشاركات
      3,368
      المواضيع
      68
      شكر / اعجاب مشاركة

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

      اليك الحل ....
      كود:
      select col_no ,trm_no ,trunc(avg_po), count(*)number_of_student
      
      from stud
      
      group by col_no , trm_no , trunc(avg_po) ;


      فكرته تقسيم بحسب ثلاث اعمدة ....

      حاول رسم التقسيم ..... وفهمها , طبق وجرب وفكر وارسم وخطط وتعذب واشقى واتعب ...... وفي النهاية سوف تفهم مالم يفهمه غيرك .

      الان انتهى الدرس ...

      سوف تتعرف في الدرس القادم على الصلاحيات , و ربط الجداول , والاستعلامات الفرعية ....
      واعتقد ان الدرس القادم هو اخر درس في الـ
      SQL والدرس الذي بعده سوف يكون تمارين وامثلة وحل لأسئلة اختبارات شهادات أوراكل المعتمدة ان شاء الله ... لذا ترقب


    8. #98
      التسجيل
      25-08-2004
      المشاركات
      24
      المواضيع
      2
      شكر / اعجاب مشاركة

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

      بصراحه احببتك في الله


      صح شرحك طويل بس ممتع ومفيد

      الى الامام يابرفسور

    9. #99
      التسجيل
      26-07-2005
      الدولة
      Australia
      المشاركات
      3,368
      المواضيع
      68
      شكر / اعجاب مشاركة

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

      اقتباس المشاركة الأصلية كتبت بواسطة عجماني
      بصراحه احببتك في الله


      صح شرحك طويل بس ممتع ومفيد

      الى الامام يابرفسور

      شكرا لك يا عجماني ....
      و انا كنت قاصد تطويل الدرس ... لان بعضهم لا يستطيع الفهم كثيرا .. من الكلام المختصر ^^
      الناس اجناس يا سيدي ^^
      سلااااااااام

    10. #100
      التسجيل
      15-05-2005
      المشاركات
      2
      المواضيع
      0
      شكر / اعجاب مشاركة

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

      بسم الله الرحمن الرحيم
      أخى العزيز ...
      بارك الله فيك و جعله الله فى ميزان حسناتك
      اخى الفاضل
      انا اقوم الآن و معى بعض الزملاء المتخصصين بعمل موسوعه كبيره تكون مرجع شامل و شافى و وافى للعرب و المسلمين و ذلك ابتغاء وجه الله تعالى من باب علم ينتفع به و يكون صدقه جاريه باذن الله
      حيث نقوم بكل طاقتنا بشرح موضوعات عده ، كل فى تخصصه فهناك من يشرح الفيجوال بيسك دوت نت و السى شارب دوت نت و الدلفى و هناك من يشرح السكوال سيرفير و هناك من يشرح windows server 2003 و كيفيه عمل دومين و عمل و الإتصال به عن طريق خط adsl كل ذلك الشرح عن طريق الفيديو بالصوت و الصورة.
      و انا كنت متابع لشركات كثيره فى هذا المجال و شركه ميكروسوفت التى اعجبت بها كثيرا و لكنى وجدت قصور شديد فى المكتبه العربيه فى الشرح بالصوت و الصورة
      فكثيرا من الأشخاص يتابعون كتب كثيره مشروح بها و لكنهم لا يستطيعون التطبيق اما مع الشرح بالصوت و الصورة فالأمر يسير جدا جدا جدا و هناك اشياء كثيره تكون اسهل فى الكلام اكثر منها بالكتابه
      صديقى الفاضل
      نحن نمتلك افضل و اروع برنامج لتسجيل الشروحات بالفيديو البرنامج قمه فى الروعه دقع عاليه و مساحه قليله و يمكن التسجيل باكثر من نسق فهناك تنسيق الفلاش او الفيديو avi , wvm و غيرها دقه عاليه جدا جدا جدا فى الصوت و الصورة و كذلك حجم صغير نوعا ما فقد يكون حجم الملف wvm حوالى 13 ميجا لنصف ساعه شرح
      و الحمد لله مع انتشار خطوط الـdsl فى الوطن العربى لا توجد مشكله من تحميل اى منها
      ولو اردت حضرتك ان تأخذ بعض العينات من اعمالنا فى ذلك المجال فممكن ان تراسلنى لأن الأعمال لم تظهر للنور بعد فنحن نود ان نعمل سيرفير مجانى شامل كل هذه الشروحات و تكون شروحات فيديو و صوت من المتخصصين فى كل مجال حتى يبدع كل منهم
      معذرة للإطاله و لكنى اردت ان تحول شرحك الى شرح فيديو حتى تعم الفائده للجميع
      و ذلك سواء كان الشرح هذا عملى او نظرى لأن الشرح النظرى بالصوت يقرب الفكره جدا جدا للأنسان و لا تعجب عن كيفيه الشرح النظرى فانشاء الله ممكن ان اعطيك جزء من اعمالنا لترى كيفيه الشرح النظرى و العملى بكل سهوله و الشرح النظرى باستخدام برامج رسوميه ممتازه من الممكن ان نقوم بتوفير كل الأدوات اللازمه من تصميم شاشات عرض و غيرها حتى تكون جاهزه لسيادتكم على العمل
      و معذرة للإطالة
      تحياتى
      د. علاء عبد الرحمن
      محاضر لغات برمجه
      AGC

    11. #101
      التسجيل
      26-07-2005
      الدولة
      Australia
      المشاركات
      3,368
      المواضيع
      68
      شكر / اعجاب مشاركة

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

      اقتباس المشاركة الأصلية كتبت بواسطة allahome
      بسم الله الرحمن الرحيم
      أخى العزيز ...
      بارك الله فيك و جعله الله فى ميزان حسناتك
      اخى الفاضل
      انا اقوم الآن و معى بعض الزملاء المتخصصين بعمل موسوعه كبيره تكون مرجع شامل و شافى و وافى للعرب و المسلمين و ذلك ابتغاء وجه الله تعالى من باب علم ينتفع به و يكون صدقه جاريه باذن الله
      حيث نقوم بكل طاقتنا بشرح موضوعات عده ، كل فى تخصصه فهناك من يشرح الفيجوال بيسك دوت نت و السى شارب دوت نت و الدلفى و هناك من يشرح السكوال سيرفير و هناك من يشرح windows server 2003 و كيفيه عمل دومين و عمل و الإتصال به عن طريق خط adsl كل ذلك الشرح عن طريق الفيديو بالصوت و الصورة.
      و انا كنت متابع لشركات كثيره فى هذا المجال و شركه ميكروسوفت التى اعجبت بها كثيرا و لكنى وجدت قصور شديد فى المكتبه العربيه فى الشرح بالصوت و الصورة
      فكثيرا من الأشخاص يتابعون كتب كثيره مشروح بها و لكنهم لا يستطيعون التطبيق اما مع الشرح بالصوت و الصورة فالأمر يسير جدا جدا جدا و هناك اشياء كثيره تكون اسهل فى الكلام اكثر منها بالكتابه
      صديقى الفاضل
      نحن نمتلك افضل و اروع برنامج لتسجيل الشروحات بالفيديو البرنامج قمه فى الروعه دقع عاليه و مساحه قليله و يمكن التسجيل باكثر من نسق فهناك تنسيق الفلاش او الفيديو avi , wvm و غيرها دقه عاليه جدا جدا جدا فى الصوت و الصورة و كذلك حجم صغير نوعا ما فقد يكون حجم الملف wvm حوالى 13 ميجا لنصف ساعه شرح
      و الحمد لله مع انتشار خطوط الـdsl فى الوطن العربى لا توجد مشكله من تحميل اى منها
      ولو اردت حضرتك ان تأخذ بعض العينات من اعمالنا فى ذلك المجال فممكن ان تراسلنى لأن الأعمال لم تظهر للنور بعد فنحن نود ان نعمل سيرفير مجانى شامل كل هذه الشروحات و تكون شروحات فيديو و صوت من المتخصصين فى كل مجال حتى يبدع كل منهم
      معذرة للإطاله و لكنى اردت ان تحول شرحك الى شرح فيديو حتى تعم الفائده للجميع
      و ذلك سواء كان الشرح هذا عملى او نظرى لأن الشرح النظرى بالصوت يقرب الفكره جدا جدا للأنسان و لا تعجب عن كيفيه الشرح النظرى فانشاء الله ممكن ان اعطيك جزء من اعمالنا لترى كيفيه الشرح النظرى و العملى بكل سهوله و الشرح النظرى باستخدام برامج رسوميه ممتازه من الممكن ان نقوم بتوفير كل الأدوات اللازمه من تصميم شاشات عرض و غيرها حتى تكون جاهزه لسيادتكم على العمل
      و معذرة للإطالة
      تحياتى
      د. علاء عبد الرحمن
      محاضر لغات برمجه
      AGC

      سلام الله عليكم ورحمته وبركاته !!

      اهلا بك ... اهلا وسهلا ويا مرحبا .
      حيا الله الدكتور علاء ^^

      شكرا لمرورك , وشكرا لاطالتك .. تعبناك ويانا , واسف لتأخر ردي !!
      يابوي .. لا مانع لدي .. ابدا في عرضك ...
      ولكن .... انا اشتغل الان على الديال اب ..
      يلزمني شهرين او شهر ... لكي اركب خدمة نت سريع ... اما ساتلايت .. او دي اس ال

      5 ميقا الان كثيرة علي .. لاني بكل بساطة ... ديال اب !!
      نفسي اشرح بالصوت والصورة ....
      عرضك جميل يا دكتور ... ولكن .. المشكلة الديال اب ..
      مارأيك .؟؟
      وهل اطلعتني على عمل من اعمالكم ... ولكن ملف صغير ^^
      شكرا لك يا دكتور ...
      و انتظر ردك ....

      يادكتور ,’,’,’,’,’,’,’,’,’

    12. #102
      التسجيل
      15-05-2005
      المشاركات
      2
      المواضيع
      0
      شكر / اعجاب مشاركة

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

      السلام عليكم

      و بارك الله فيك و انا انتظر خط النت حتى يصلك

      يمكنك مراسلتى على

      alaa_eg80@msn.com

      تحياتى

    13. #103
      التسجيل
      26-07-2005
      الدولة
      Australia
      المشاركات
      3,368
      المواضيع
      68
      شكر / اعجاب مشاركة

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

      اقتباس المشاركة الأصلية كتبت بواسطة allahome
      السلام عليكم

      و بارك الله فيك و انا انتظر خط النت حتى يصلك

      يمكنك مراسلتى على

      alaa_eg80@msn.com

      تحياتى
      السلام عليكم ....
      حياك ربي .... وبارك الله فيك ..
      سنلتقي قريبا ..




      الاخوة القارئين
      اعتذر بشدة ...
      ظروف وسفريات المت بي ....
      لذا سوف اتأخر اسبوع ....
      اسف جدا .. مضطر لذلك ...
      سلام

    14. #104
      التسجيل
      26-07-2005
      الدولة
      Australia
      المشاركات
      3,368
      المواضيع
      68
      شكر / اعجاب مشاركة

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

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

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

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

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

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

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

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

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

      - الاستعلامات الفرعية

      - ربط الجداول
      -
      - الصلاحيات

      هيا لنؤركل ^^
      السلام عليكم

      عرفنا في دروس سابقة القيود وكيفية اضافتها على الجداول , وعرفنا ايضا تقسيم الدوال ذوات الصفوف المتعددة الى مجموعات .

      سنواجه الان كم من المصائب والمشاكل والكوارث الجديدة والتي لم تنتهي بعد وحان دورنا ان نعالجها , مع العلم ان هذا الدرس .. ناقص قليلا ... وسوف اكمل النقص في درس قادم ان شاء الله ..

      الان اريد ان اعرف اسماء الموظفين الذين يأخذون رواتب اكبر من راتب الاخ الفاضل ..
      scott

      كيف نعرف ؟؟

      بسيطة .....

      نذهب ونوجد راتب الاخ
      scott

      ثم نعرف راتبه كم ... ثم نكتبه في جملة استعلام اخر .....

      اليك الحل :

      كود:
      select sal from emp where ename='SCOTT';
      سوف تعرض لنا النتيجة .... كما يلي
      كود:
      SAL
      
      ----
      
      3000
      اذن راتب الرجل يساوي 3000

      هيا لنوجد كل من راتبه اكبر من او يساوي 3000 واسمه ليس اسكوت ...
      كود:
      select ename ,sal from emp where sal >=3000 and ename <>'SCOTT';
      الاجابة الجميلة .... :
      كود:
      ENAME SAL
      
      ---------- ----------
      
      KING 5000
      
      FORD 3000
      طيب .... نريد اسماء كل من هم موجودين بقسم صاحبنا
      scott

      والذين رواتبهم اكبر من او تساوي راتب
      Jones

      والذين حرفهم الاول مثل اول حرف الموظف صاحب اصغر راتب !!

      الان شاهد كيف سأحصل عليها ...

      يريد اسماء الذين في قسم
      scott , ممممم ..... ماهو قسم السيد اسكوت ؟؟؟

      دعني اذهب واتأكد ...


      كود:
      SQL> select deptno from emp where ename='SCOTT' ;
      
      
      
      DEPTNO
      
      ----------
      
      20
      اذن ... القسم 20 !!

      هيا ... لنكتشف من هم هؤلاء !!

      كود:
      SQL> select ename from emp where deptno=20;
      
      
      
      ENAME
      
      ----------
      
      SMITH
      
      JONES
      
      SCOTT
      
      ADAMS
      
      FORD
      الان ..... يقول لي انه يريد من هؤلاء .. الذي راتبه اكبر من او يساوي راتب جونز ....

      لنرى ذلك ... ولكن ... كم راتب جونز ؟؟؟؟

      ممممم لنرى ذلك :

      كود:
      SQL> select sal from emp where ename='JONES';
      
      
      
      SAL
      
      ----------
      
      2975
      اها .... 2975 , اذن ... كل من في قسم 20 وراتبه اكبر من او يساوي 2975

      لقد استنتجت هذه الارقام بنفسي ....

      هيا لنرى :

      كود:
      SQL> select ename from emp where deptno=20 and sal >=2975 ;
      
      
      
      ENAME
      
      ----------
      
      JONES
      
      SCOTT
      
      FORD
      ماذا يريد بعد ؟؟

      كل الموظفين الذين حرفهم الاول مثل حرف الموظف صاحب اصغر راتب !!

      من هو صاحب اصغر راتب ؟؟ لا اعرف .. سوف اكتشف ذلك :



      كود:
      SQL> select min(sal) from emp ;
      
      
      
      MIN(SAL)
      
      ----------
      
      800
      ممممم .... راتبه =800 ..... من هو يا ترى ؟؟ لنرى ذلك :
      كود:
      SQL> select ename from emp where sal=800;
      
      
      
      ENAME
      
      ----------
      
      SMITH
      انه سميث ... مسكين سميث ... يأخذ فقط 800 دولار في الشهر ... اشفق عليه ....

      اوبس .. أين وصلنا ؟؟؟

      نسيت ؟؟؟ لقد تشابكت علي الدنيا ....

      اها .... وصلنا عند " كل الموظفين الذين حرفهم الاول مثل حرف الموظف صاحب اصغر راتب"

      سميث ... حرفه الاول
      S

      اذن .... كأن المسئلة التي تقول :

      " نريد اسماء كل من هم موجودين بقسم صاحبنا
      scott

      والذين رواتبهم اكبر من او تساوي راتب
      Jones

      والذين حرفهم الاول مثل اول حرف الموظف صاحب اصغر راتب !! "



      هي نفسها :

      " نريد اسماء كل من هم موجودين بقسم 20

      والذين رواتبهم اكبر من او تساوي 2975

      والذين حرفهم الاول
      S !! "



      الان لأرى مالنتيجة . لأرى من هم هؤلاء :

    15. #105
      التسجيل
      26-07-2005
      الدولة
      Australia
      المشاركات
      3,368
      المواضيع
      68
      شكر / اعجاب مشاركة

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


      كود:
      SQL> select ename from emp where sal>=2975 and deptno=20 and ename like 'S%';
      
      
      
      ENAME
      
      ----------
      
      SCOTT
      تبا لك يا اسكوت ... هل هو انت صاحب هذه المواصفات القياسية ؟؟

      اووووف .. انا من ناحيتي تعبت .. ماذا عنك وانت تقرأ ؟؟

      كل مافي المسئلة اشياء مجهولة لا نعرفها , ولكي نعرفها يجب ان نوجدها على انفراد ... ماهذا يا أوراكل هل بالله عليك هذا حل ؟؟

      اذا كانت المسئلة الصغيرة تعمل فينا ما عملت !! فما بالك بـمسئلة اكبر قليلا , او مسئلة اعقد واكبر !!

      مالحل ؟ كيف نوجد المجاهيل وعلى ضوئها نوجد الاستعلام الذي نريده ؟

      اوجدنا قسم اسكوت , وراتب جونز , وصاحب اصغر راتب , وايضا حرفه الاول

      هذا كثيــــــر .... كثير جدا !

      - الاستعلامات الفرعية
      ( Sub-query):

      عملنا في المسئلتين السابقة .. استعلامات خارجية صح ؟

      أي ذهبنا واستعلمنا عن قسم اسكوت في استعلام خارجي ..... وهو استعلام فرعي !

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

      لنرى كيف هذه الاستعلامات وطريقة عملها .

      اريد ان اعرف اسماء الموظفين الذين يأخذون رواتب اكبر من راتب
      scott

      عرفنا جملة الاستعلام التي توجد راتب الموظف
      scott , اليك جملة الاستعلام الفرعية وهي تأتي بين قوسين :


      كود:
      SQL> select ename from emp where sal >= (select sal from emp where ename='SCOTT');
      
      
      
      ENAME
      
      ----------
      
      SCOTT
      
      KING
      
      FORD
      واو .. لاحظ انه في جملة استعلام واحدة وفي خطوة واحدة عملنا كل ذلك الجهد في المسئلة الاولى ...

      لاحظ جملة الاستعلام الفرعية .. والتي بين قوسين , وهي تخبر الأوراكل مايلي :

      (اختر الصفوف يا أوراكل من جدول
      emp لكل من اسمه = اسكوت )

      هل سيعرضها الأوراكل ؟؟؟ هل نستطيع رؤيتها ؟؟

      لا .... لن نستطيع رؤيتها ...

      جملة الاستعلام الفرعية التي بين قوسين ... كأنها لا تقول "اعرض" .. كأنها تقول "أوجد"

      لاحظ جملة الاستعلام انه اختار كم عمود ؟؟ عشرة ؟؟ عشرون ؟؟

      بل عمود واحد , وهو الرواتب ....

      لماذا الرواتب ؟ لأننا نريد ان نقارنه مع الراتب الموجود في جملة الاستعلام الرئيسية ...

      كيف ذلك ؟

      سوف يوجد اولا الجملة الفرعية كما يلي :

      كود:
      SQL> select sal from emp where ename='SCOTT' ;
      
      
      
      SAL
      
      ----------
      
      3000
      لاحظ انه صف واحد , وعمود واحد ..

      وهي قيمة واحدة .. كم ؟ 3000

      أين يضعها ؟ هل يعرضها على الشاشة ؟؟

      لا بل يرسلها الى جملة الاستعلام الرئيسية !!

      كيف يرسلها ؟

      يستبدل القيمة الناتجة بالاستعلام الفرعي ... أي :

      كود:
      select ename from emp where sal >= (select sal from emp where ename='SCOTT');
      كود:
      
      
      كود:
      يوجد اولا الاستعلام الفرعي .. ثم يحول الجملة كما يلي :
      select ename from emp where sal >= (3000 );

      الان فهمنا الديناميكية التي تحدث داخل أوراكل ونحن اخر من يعلم عن ذلك ؟؟؟

      يا سلام يا أوراكل ... كم انت ذكي جدا !!

      الان ... لو كتبنا مايلي .... فإنه سيكون خاطئ ... لماذا ياترى ؟؟ :

      كود:
      SQL> select ename from emp where sal >= (select sal ,ename from emp where ename='SCOTT');
      هل دققت ؟ هل فكرت ؟؟

      اليك السبب بلسان أوراكل :
      كود:
      select ename from emp where sal >= (select sal ,ename from emp where ename='SCOTT');
      كود:
      
      
      كود:
      سوف احولها الى مايلي :
      select ename from emp where sal >= ( 3000 , 'SCOTT')
      اوبس ... كيف أقارن .. هل مع القيمة الاولى ام القيمة الثانية ؟؟ خطأ يا ايها المستخدم .... لا يجوز ... مع ماذا أقارن هل أقارن العمود رواتب مع 3000 او مع "اسكوت"؟؟

      هل فهمت ؟

      يجب ان تقارن عمود مع عمود .

      الان اريد ان احل المسئلة المعقدة تلك والتي تنص على :
      "
      نريد اسماء كل من هم موجودين بقسم صاحبنا scott

      والذين رواتبهم اكبر من او تساوي راتب
      Jones

      والذين حرفهم الاول مثل اول حرف الموظف صاحب اصغر راتب !!
      "

      هل مستعد ..... فكر فيها قليلا .. ستجدها سهلة ...

      لم تعرف ؟؟؟؟ لم تستطع ؟؟ هل هي معقدة لهذه الدرجة ؟؟

      اذن حاول ان تحل المسئلة التالية وسوف نحل السابقة قريبا
      :

      "
      نريد اسماء كل من هم موجودين بقسم صاحبنا scott

      والذين رواتبهم اكبر من او تساوي راتب
      Jones "

      هل تستطيع .. طبعا تستطيع ولا ضير من ذلك ...

      انظر حل المسئلة ....

      كود:
      select ename from emp where deptno=(select deptno from emp where ename='SCOTT' )
      
      and sal >= (select sal from emp where ename='JONES');
      لاحظ كلمة
      AND وليست OR ... على حسب السؤال .

      سهلة اعتقد ولا يوجد فيها اختراع ...

      نرجع للمسئلة التي تركناها ...

      "
      نريد اسماء كل من هم موجودين بقسم صاحبنا scott

      والذين رواتبهم اكبر من او تساوي راتب
      Jones

      والذين حرفهم الاول مثل اول حرف الموظف صاحب اصغر راتب !!
      "

      اعتقد انك تضررت في الطلب الاخير صح ؟؟ اليك الحل يا فتى :



      كود:
      SQL> select ename from emp where deptno=(select deptno from emp where ename='SCOTT' )
      
      and sal >= (select sal from emp where ename='JONES')
      
      and ename like (select substr(ename,1,1) from emp where sal=(select min(sal) from emp) ) ||'%';
      
      
      
       
      
      ENAME
      
      ----------
      
      SCOTT
      والجواب كان اسكوت ...

      اليك خطوات الحل بلسان أوراكل نفسه ....

      كود:
      
      
      كود:
      
      
      كود:
      اولا ... سأرى الجملة كاملة :
      select ename from emp where deptno=(select deptno from emp where ename='SCOTT' ) and sal >= (select sal from emp where ename='JONES') and ename like (select substr(ename,1,1) from emp where sal=(select min(sal) from emp) ) ||'%';
      ممممم ... الجمل الفرعية كثيرة هنا ... سوف اوجد الاعمق فيها .... أي الجمل الفرعية للجمل الفرعية .... وهي جملة الاستعلام عن اصغر راتب ... اصغر راتب هو 800
      select ename from emp where deptno=(select deptno from emp where ename='SCOTT' ) and sal >= (select sal from emp where ename='JONES') and ename like (select substr(ename,1,1) from emp where sal= (800) ) ||'%' ;
      الان ... تخلصت من الاستعلامات الفرعية الاعمق ... وسوف اتخلص من البقية .....
      select ename from emp where deptno= (20) and sal >= (2975) and ename like ('S')||'%' ;
      الان ...
      .. 'S' || '%' = 'S%'
      الان ...... الجملة شكلها هكذا ....
      select ename from emp where deptno= (20) and sal >= (2975) and ename like 'S%' ;
      هه.. الان سهل الحل :
      ENAME --------- SCOTT


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

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

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