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

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

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

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

      هل لاحظت الديناميكية ؟؟

      بسيطة ... ولا تنسى ان تضع الاستعلام الفرعي بين قوسين ...

      اليك مثال اخر .. من نوع اخر :

      اريد عرض رقم القسم , و اصغر راتب لكل قسم , شريطة ان اصغر راتب
      يكون اكبر من اصغر راتب بالقسم 20

      اولا خذ المسألة السابقة بالمقلوب ... اقرأ المعطى و المطلوب

      اكبر من اصغر راتب بالقسم 20 .....

      ما هو اصغر راتب بالقسم 20 ؟؟ سنضعه في الاستعلام الفرعي !!

      ونعرض اصغر الرواتب ونقسمهم على حسب رقم القسم .... انظر الناتج وحاول ان تستنتج , ولن تستنتج طالما لم تقرأ الدرس السابق ولم تطبق .


      كود:
      SQL> select min(sal) ,deptno from emp 
      
      group by deptno
      
      having min(sal) >(select min(sal) from emp where deptno=20);
      
      
      
      MIN(SAL) DEPTNO
      
      ---------- ----------
      
      1300 10
      
      950 30
      واو , حتى في جملة
      having استخدمنا الاستعلام الفرعي !!

      رائع يا استعلام يا فرعي .... رائع !


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

      ارجع الى الامثلة التي فوق ... وشاهدها كلها ....

      هل هذا يعني ان الاستعلامات الفرعية للصف الواحد ؟؟ لا لا

      انا قصدت ذلك ...

      الان انظر الى الجملة التالية , وهي خاطئة مئة بالمئة , لماذا يا ترى ؟؟

      كود:
      SQL> select ename from emp where sal =( select sal from emp ) ;
      
      
      
      ERROR at line 1:
      
      ORA-01427: single-row subquery returns more than one row
      يقول ان الـ
      Subquery ترجع باكثر من صف !!

      بالعقل , من الذي راتبه يساوي (رواتب جميع الموظفين ؟) ؟؟

      بالله عليك قل لي واحد راتبه يساوي 3000 ويساوي 2975 ويساوي 800 ...... في نفس اللحظة ؟؟

      غريب المنطق ... يمر علينا مرور الكرام ولا نفكر ابدا !!

      الاستعلام الفرعي صاحب الصف الواحد يسمى
      Single-row subquery

      الاستعلام الفرعي صاحب الصفوف المتعددة يسمى
      Multi-row subquery

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

      به مقارنات ... ممكن ان تكون = او تكون > او >= او <> (لا تساوي) .........

      هل فهمت

      اما الاستعلامات الفرعية ذو الصفوف المتعددة تستخدم ماذا ؟

      تستخدم
      IN , ANY , ALL

      اليك مثال عن المتعددة الصفوف :

      اريد ان اعرض كل من راتبهم يساوي أي من رواتب الموظفين ذو الرواتب الاقل لكل قسم ..

      (من هم ذوي الرواتب الاقل لكل قسم ؟؟)

      كود:
      SQL> select ename , sal , deptno from emp 
      
      where sal IN( select min(sal) from emp group by deptno );
      
      
      
      ENAME SAL DEPTNO
      
      ---------- ---------- ----------
      
      MILLER 1300 10
      
      SMITH 800 20
      
      JAMES 950 30


      IN
      تعني .... أي من ....

      كيف ذلك ؟ الاستعلام الفرعي سوف يرجع لنا اكثر من قيمة , اكثر من صف !! لاحظ كلمة "صف" !!

      انظر كيف يفكر الأوراكل :


      كود:
      SQL> select ename , sal , deptno from emp 
      
      where sal IN( select min(sal) from emp group by deptno );
      كود:
      
      
      كود:
      ممممم .... الاستعلامات الفرعية اولا ...
      ( select min(sal) from emp group by deptno );
      سيكون الناتج ... :
      MIN(SAL) -------- 1300 800 950
      اذن ثلاث قيم ....
      Sal IN(1300 , 800 , 950)
      من هم الذين رواتبهم تساوي 800 او 950 او 1300 ؟؟ سوف اعرض اسمائهم و رواتبهم وأرقام
      أقسامهم ...انهم :
      ENAME SAL DEPTNO ---------- ---------- ---------- MILLER 1300 10 SMITH 800 20 JAMES 950 30

      هل لاحظت ان معنى
      IN أي (تساوي القيمة الاولى .. او القيمة الثانية .. او ..... )

      هل لاحظت انها "أو" ؟؟؟

      سهلة ان شاء الله .... ونعرف الان
      IN متى تستخدم صح ؟؟

      الان اريد ان اذكرك بشيء من قبل ....

      اعرض لي اسماء ورواتب واقسام الموظفين ذوي الرواتب الاقل !!

      لو كتبنا الحل التالي فهو خطأ :

      كود:
      SQL> select min(sal) , ename from emp group by deptno ;
      
      
      
      ERROR at line 1:
      
      ORA-00979: not a GROUP BY expression
      لماذا خطأ ؟؟ لان به عمود لم يذكر في جملة
      group by

      العمود هو
      ename

      ولا نستطيع ادخاله في جملة الاستعلام .... ما هو الحل ؟

      لقد حللناها قبل قليل ^^ !! انها الاستعلامات الفرعية ...

      للتذكير اليك الجملة التي حلت لنا المشكلة :
      كود:
      SQL> select ename , sal , deptno from emp 
      
      where sal IN( select min(sal) from emp group by deptno );
      
      
      
      ENAME SAL DEPTNO
      
      ---------- ---------- ----------
      
      MILLER 1300 10
      
      SMITH 800 20
      
      JAMES 950 30
      رائع يا استعلام يا فرعي .. رائع !

      حلال مشاكل درجة اولى .

      الان استخدمنا
      IN

      بقي علينا
      ALL , ANY

      Any
      تعني "أي من"

      All
      تعني "كل "


      هذان الاثنين يستخدمان المقارنة !! يستخدمان = , > , < , <> ........

      مفيدان كثيرا !

      يجب ان تعلم ان استخدام
      IN , ALL , ANY مفيدة جدا في المقارنات الكثيرة ايضا ..

      هل تذكر هذا المثال :


      كود:
      SQL> select ename from emp where sal IN(1000,2000,3000) ;
      
      
      
      ENAME
      
      ----------
      
      SCOTT
      
      FORD
      الان نستخدمها مع الاستعلامات الفرعية , وهذا رائع .

      الان معنى
      ALL أي كل القيم ...

      معنى
      sal>ALL(1000,2000,3000)

      أي ان الراتب اكبر من 1000 و اكبر من 2000 و اكبر من 3000

      أي ان
      ALL تستخدم الـ "و"

      وسوف تعرض كل من راتبه اكبر من 3000 ... بالمنطق !!



      Sal < ANY(1000 , 2000 , 3000 )
      أي ان الراتب اصغر من 1000 أو اصغر من 2000 او اصغر من 3000

      طبعا سوف يعرض كل من يملك راتب اصغر من 1000 دولار

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

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

      اليك امثلة على
      ALL , ANY

      وشاهد الفرق بينهما وبين
      IN بامثلة بسيطة ... ثم بامثلة الجمل الفرعية ... :

      كود:
      SQL> select ename , sal from emp where sal >= ALL (1000 , 2000 , 3000 ) ;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      SCOTT 3000
      
      KING 5000
      
      FORD 3000
      
      
      
      SQL> select ename , sal from emp where sal <= ALL (1000 , 2000 , 3000 ) ;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      SMITH 800
      
      JAMES 950
      
      
      
      SQL> select ename , sal from emp where sal > ALL(1000 , 2000 , 3000 ) ;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      KING 5000
      
      
      
      SQL> select ename , sal from emp where sal <ALL(1000 , 2000 , 3000 ) ;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      SMITH 800
      
      JAMES 950
      
      
      
      SQL> select ename , sal from emp where sal =ALL(1000 , 2000 , 3000 ) ;
      
      
      
      no rows selected
      
      
      
      SQL> select ename , sal from emp where sal <>ALL(1000 , 2000 , 3000 ) ;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      SMITH 800
      
      ALLEN 1600
      
      WARD 1250
      
      JONES 2975
      
      MARTIN 1250
      
      BLAKE 2850
      
      CLARK 2450
      
      KING 5000
      
      TURNER 1500
      
      ADAMS 1100
      
      JAMES 950
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      MILLER 1300
      
      
      
      12 rows selected.
      الان اذهب وجرب نفس السابقة ولكن بـ
      ANY

      جرب .... لمدة ثلاث دقائق ونصف !

      اليك بعض الامثلة على الاستعلامات الفرعية ذوات الصفوف المتعددة :

      اعرض كل من راتبه اكبر من او يساوي جميع (لاحظ كلمة جميع) معدل الرواتب لكل قسم ....



      كود:
      SQL> select ename , sal from emp where sal >= ANY (select AVG(sal) from emp group by deptno ) ;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      ALLEN 1600
      
      JONES 2975
      
      BLAKE 2850
      
      CLARK 2450
      
      SCOTT 3000
      
      KING 5000
      
      FORD 3000
      لماذا هؤلاء ؟؟؟ لان الاستعلام الفرعي اوجد النتيجة التالية :

      كود:
      SQL> select AVG(sal) from emp group by deptno;
      
      
      
      AVG(SAL)
      
      ----------
      
      2916.66667
      
      2175
      
      1566.66667
      من هم رواتبهم اكبر من او تساوي كل القيم التالية (2175 , 2916.66667 , 1566.66667)

      وسوف يبحث عنهم صف صف , اذا كان راتبه اكبر من او يساوي 2175 و اكبر من او يساوي 2916.66667 و اكبر من او يساوي 1566.66667

      فاعرضه !!

      الان فكر كيف يبدأ الأوراكل تتبع كل الصفوف , ويرى الرواتب في كل صف ....

      مثلا يرى الصف الاول .. به الراتب
      X ويقارنه .. اذا نجحت المقارنة وصارت صحيحة .. يعرضه .. واذا لم تنجح لا يعرضه .. ثم يذهب الى الصف الاخر ... وهكذا

      ارجو انك بدأت تفهم كيف يتحرك الأوراكل ! وكيف يقارن ! وكيف يعرض , اتمنى ذلك

      لو لم تعرف بعد هذه التحركات , اعرض علينا مشكلتك .


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

      مثلا ..

      اريد ان اعرض اسماء الاشخاص الذين في قسم الموجود في مدينة النيويورك !!

      كيف اعرف ؟؟

      من جدول
      dept طبعا .. انظر جمال الجملة الاستعلامية الفرعية :


      كود:
      SQL> select ename from emp where deptno=(select deptno from dept where loc='NEW YORK');
      
      
      
      ENAME
      
      ----------
      
      CLARK
      
      KING
      
      MILLER
      هل شاهدت ؟ هل دققت ؟؟

      ربط الجدولين !!

      انظر مالذي حدث :
      كود:
      SQL> select ename from emp where deptno=(select deptno from dept where loc='NEW YORK');
      كود:
      
      
      كود:
      الاستعلام الفرعي اولا ...
      select ename from emp where deptno =(10);
      وبكل سهولة :
      ENAME ---------- CLARK KING MILLER


      رائع ....

      حتى الجداول ربطت بشكل فني !!

      هل انتهينا من المشاكل ؟ لا لا لا .... لم ننتهي , سنحلها كلها

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

      - الاستعلامات الفرعية ذوات الاعمدة المتعددة :
      اريد عرض من اسمه و راتبه يساويان القيمة هذه (
      'SCOTT' , 3000 )

      هل فهمت المسئلة ؟ كأنني اقول .. اعرض كل من اسمه = اسكوت , وراتبه = 3000

      لاحظ انها "و" وليست "او"

      الان اليك بعض الامثلة لكي يرسخ المفهوم جيدا :

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

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




      كود:
      SQL> select ename , sal from emp where (ename,sal) = ( ('SCOTT',3000) );
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      SCOTT 3000
      لماذا النتيجة ؟ لانه فعلا يوجد من هو اسمه اسكوت .... و ..... راتبه يساوي 3000

      لاحظ انه يجب ان يكون قوسين لسبب ما , ليس مهم السبب ولكن من الخطأ وضع قوس واحد واغلاقه في أوراكل .

      هل لاحظت ان ما بين الاقواس صف واحد وانه يوجد عمودين ؟؟

      الان .... انظر مايلي :

      كود:
      SQL> select ename , sal from emp where (ename,sal) =( ('SCOTT',1000) ) ;
      
      
      
      no rows selected
      لم يعرض احد ... صحيح انه يوجد موظف يدعى بـ اسكوت !! ولكن راتبه يساوي 3000

      الشرط هنا كأنه يقول ... اسمه اسكوت ..... و ..... راتبه 1000

      انظر مايلي :
      كود:
      SQL> select ename , sal from emp where (ename,sal) IN ( ('SCOTT',3000) );
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      SCOTT 3000
      نفس المثال السابق ولكن وضعنا
      IN

      و
      IN هذه تتعامل مع المتعددة الصفوف .... وهذه الجملة الصغيرة ('SCOTT',3000) ليست الا صف واحد

      هيا لنجرب مجموعة صفوف مع
      IN , ومجموعة اعمدة


      كود:
      SQL> select ename , sal from emp
      
      where (ename,sal) IN ( ('SCOTT',1000) , ('KING',5000) , ('JONES',2975) );
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      JONES 2975
      
      KING 5000

      سهلة الفكرة المبدئية , ولاحظ تركيب الصفوف المتعددة , كم صف يوجد ؟؟؟

      ثلاث صفوف ... وكم عمود يوجد ؟؟ عمودين ؟؟

      متخيل الوضع ؟؟؟ يقول اعرض لي كل من اسمه وراتبه تساوي احد القيم التالية

      (اسكوت , 3000) , (كنق,5000) , (اسكوت,1000)

      طيب .... الان انظر كيف يكون ثلاث صفوف وثلاث اعمدة .... :

      كود:
      SQL> select ename , sal from emp 
      
      2 where (ename , sal , deptno) IN ( ('SCOTT',3000,20) , ('KING',5000,10) ) ;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      SCOTT 3000
      
      KING 5000
      ارجو انك تلاحظ الترتيب , اسم ثم راتب ثم رقم قسم !! , وان تلاحظ اننا استخدمنا
      IN ونستطيع استخدام ALL , ANY , ولا نستطيع استخدام المقارنة العادية لانه اكثر من صف ! لانه ... اكثر ..... من .... صف

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

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


      كود:
      SQL> select ename , sal , deptno from emp 
      
      where (sal,ename) IN (select sal , ename from emp where deptno=20) ;
      
      
      
      ENAME SAL DEPTNO
      
      ---------- ---------- ----------
      
      SMITH 800 20
      
      JONES 2975 20
      
      SCOTT 3000 20
      
      ADAMS 1100 20
      
      FORD 3000 20
      
      ME 1000 20
      
      WARD 950 20
      هل لاحظت التركيب الخاص بالاستعلام الفرعي ؟

      طبعا المثال غبي كثيرا لأننا نحصل على نفس النتيجة بواسطة الاستعلام التالي :

      كود:
      SQL> select ename , sal , deptno from emp 
      
      where deptno=20 ;
      
      
      
      ENAME SAL DEPTNO
      
      ---------- ---------- ----------
      
      SMITH 800 20
      
      JONES 2975 20
      
      SCOTT 3000 20
      
      ADAMS 1100 20
      
      FORD 3000 20
      
      ME 1000 20
      
      WARD 950 20
      لماذا اذن نستخدمه ؟

      الان سوف اعرض عليك اهميتها !!

      هل تتوقع ان لها تلك الاهمية ؟؟ طبعا

      انا كنت سأكتب لكم في هذا الدرس "انا شخصيا لا ارى انه مهم بالمرة
      ."

      ولكن تفاجأت بأن هنالك نقطة نسيتها تماما !!

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

      اريدك ان تضيف هذه الصفوف كما هي :
      كود:
      insert into emp values (8888,'JAVA','SALESMAN',7698,sysdate,1250,0,10);

      كود:
      insert into emp values (8889,'WARD','MANAGER',7698,sysdate,2800,0,20);

      كود:
      insert into emp values (8890,'ANY','SALESMAN',7698,sysdate,2800,0,20);

      التحدي الاول :

      الان لاحظ معي جيدا لصياغة المسئلة !!

      مثلا .. اريد ان اعرض كل من لهم راتب يساوي راتب أي موظف يدعى
      WARD

      ومهنتهم تساوي مهنة أي موظف يدعى
      WARD



      والمسئلة الثانية

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

      ومهنتهم تساوي مهنة الموظف
      WARD



      متشابهة جدا !! لا عليك من اللغويات هذه ... ولا اريد تعقيدك بها .

      لكن افهم مالذي اطلبه في المسئلة الاولى والمسئلة الثانية

      طبعا يجب ان ترى الجـــــــوابـيـــن !! :

      كود:
      SQL> select * from emp 
      
      where sal IN (select sal from emp where ename='WARD') 
      
      and job IN (select job from emp where ename='WARD') ;
      
      
      
      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      
      ---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      
      8890 ANY SALESMAN 7698 14/02/06 2800 0 20
      
      7521 WARD SALESMAN 7698 22/02/81 1250 500 30
      
      7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
      
      8888 JAVA SALESMAN 7698 14/02/06 1250 0 10
      
      8889 WARD MANAGER 7698 14/02/06 2800 0 20

      كود:
      SQL> select * from emp 
      
      where (job,sal) IN (select job , sal from emp where ename='WARD') ;
      
      
      
      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      
      ---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      
      8888 JAVA SALESMAN 7698 14/02/06 1250 0 10
      
      7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
      
      7521 WARD SALESMAN 7698 22/02/81 1250 500 30
      
      8889 WARD MANAGER 7698 14/02/06 2800 0 20
      واو ..... متشابهتين في المنطق , مختلفتين في النتائج !!

      هيا .. تحرك وافتح ملف الـ
      WORD واكتب لي شرحك الخاص بك ... لماذا ظهرت هذه النتيجتين المختلفتين !!

      وهل صحيح ان الجملتين متشابهتين منطقيا ؟ ولماذا؟

      لماذا ظهر الموظف
      ANY في النتيجة الاولى ولم يظهر في النتيجة الثانية ؟؟

      تحدي لا بأس به .... ولكنه مهم جدا !

      اذا فهمت وحللت التحدي , فأنت فعلا عبقري .


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

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

      طبعا عرضت النتيجة لكل من اسمه
      WARD

      انا لا اريد أي موظف يدعى بـ
      WARD يظهر في الشاشة !!

      بسيطة .... اليك الجملة :


      كود:
      SQL> select * from emp 
      
      where (job,sal) IN (select job , sal from emp where ename='WARD')
      
      and ename <> 'WARD';
      
      
      
      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      
      ---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      
      8888 JAVA SALESMAN 7698 14/02/06 1250 0 10
      
      7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
      والاخرى مثلها ! .

      كود:
      SQL> select * from emp 
      
      where sal IN (select sal from emp where ename='WARD') 
      
      and job IN (select job from emp where ename='WARD') 
      
      and ename <> 'WARD';
      
      
      
      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      
      ---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      
      8890 ANY SALESMAN 7698 14/02/06 2800 0 20
      
      7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
      
      8888 JAVA SALESMAN 7698 14/02/06 1250 0 10
      الان انتهينا من الاستعلامات الفرعية المتعددة الاعمدة !! واريد ان اسمع منك التحدي الاول , لانه اهم جزء من الاستعلامات الفرعية المتعددة الاعمدة والتي لم اشرحها انا .

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

      ستجدها خلف جملة
      having

      ستكتشف انها بعد جملة
      from

      ستفاجأ بوجودها ايضا في جملة
      select نفسها !!

      تخيل !! ,, حتى جمل الادخال والتعديل والحذف ايضا .. ستجدها هنالك !! ولا ننسى إنشاء الجداول !!

      انظر الامثلة عن اماكن وجودها
      :





      كود:
      SQL> select * 
      
      from (select ename , sal , deptno , job from emp where deptno=20) ;
      
      
      
      ENAME SAL DEPTNO JOB
      
      ---------- ---------- ---------- ---------
      
      SMITH 800 20 CLERK
      
      JONES 2975 20 MANAGER
      
      SCOTT 3000 20 ANALYST
      
      ADAMS 1100 20 CLERK
      
      FORD 3000 20 ANALYST
      
      ME 1000 20 SALESMAN
      
      WARD 950 20 CLERK
      مالذي يحدث هنا !

      الم نقل العلامة * ؟؟ الا نتوقع جميع الحقول ؟؟

      في الحقيقة الجملة الفرعية تعامل مثل جدول مستقل في هذا الموضع !

      وهذا الجدول شكله هكذا :

      كود:
      SQL> select ename , sal , deptno , job from emp where deptno=20 ;
      
      
      
      ENAME SAL DEPTNO JOB
      
      ---------- ---------- ---------- ---------
      
      SMITH 800 20 CLERK
      
      JONES 2975 20 MANAGER
      
      SCOTT 3000 20 ANALYST
      
      ADAMS 1100 20 CLERK
      
      FORD 3000 20 ANALYST
      
      ME 1000 20 SALESMAN
      
      WARD 950 20 CLERK
      ولما نقول له ... اعرض لنا كل حقولك يا جدول , فسوف يعرض الحقول التي يمتلكها فقط !!

      هل فهمت ؟

      طيب ... لنجرب ان نكتب عمود لا يوجد في هذا الاستعلام الفرعي , ويوجد في جدول
      emp !!



      كود:
      SQL> select hiredate from (select ename , sal , deptno , job from emp where deptno=20);
      
      
      
      ERROR at line 1:
      
      ORA-00904: "HIREDATE": invalid identifier
      رفضه بتاتا , لماذا ؟ لانه لا يمت صلة بالجدول (الجدول هنا هو
      ناتج الاستعلام الفرعي)

      طيب , انظر المثال التالي , غريب فعلا :


      كود:
      SQL> select (select sal from emp where ename ='KING') from dual ;
      
      
      
      (SELECTSALFROMEMPWHEREENAME='KING')
      
      -----------------------------------
      
      5000
      جملة الاستفسار الفرعية , كأنها عمود !


      تعامل كعمود هنا ! ... لاحظ في جملة
      from كأنه جدول , وفي جملة select كأنه عمود !!

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

      انظر المثال التالي :
      كود:
      SQL> select (select ename from emp where sal =5000) as name ,
      
      (select dname from dept where deptno =10) as dept_name from dual ;
      
      
      
      NAME DEPT_NAME
      
      ---------- --------------
      
      KING ACCOUNTING
      لا تعليق !!

      الان نرى في جملة الادخال , والحذف والتعديل , كيف تتمركز جمل الاستعلام الفرعية :

      نعمل جدول جديد يسمى
      emp_temp , ولديه من الاعمدة اسم الموظف , رقم القسم , الراتب !

      ونريد به المعلومات الخاصة بالموظفين في القسم 20 !! من جدول
      emp

      انظر الى المثال , وركز في الاستعلام الفرعي ...


      كود:
      create table emp_temp 
      
      as(select ename as the_name , sal as salary , deptno from emp where deptno =20) ;

      مارأيك الان فيما يلي :
      كود:
      select ename , sal , deptno from emp_temp;
      وهو خطأ مئة بالمئة ! لماذا ؟؟ لأن العمودين
      sal , ename غير موجودين !!

      لماذا ؟ لأننا اسمينا العمودين باسماء اخرى في جملة الاستعلام الفرعية , وارجعت هذه الجملة الفرعية الى جملة إنشاء الجداول اسماء الاعمدة الجديدة !!

      انظر :

      كود:
      SQL> select * from emp_temp ;
      
      
      
      THE_NAME SALARY DEPTNO
      
      ---------- ---------- ----------
      
      SMITH 800 20
      
      JONES 2975 20
      
      SCOTT 3000 20
      
      ADAMS 1100 20
      
      FORD 3000 20
      
      ME 1000 20
      
      WARD 950 20
      هل شاهدت الاعمدة ؟؟؟

      الان اريد إضافة معلومات الموظفين في القسم 10 والموجودين في جدول الموظفين
      emp

      طبعا نذهب هناك , ونستعلم , ونعرف معلوماتهم , وننسخها يدويا !!

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

      هيا انظر الى الاستعلام الفرعي مع جملة الادخال :

      كود:
      insert into emp_temp valuse (select ename , sal , deptno from emp where deptno=10);
      والان انظر الجدول .. وبه معلومات كل الموظفين بقسمي 10 و 20



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

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


      كود:
      SQL> select * from emp_temp ;
      
      
      
      THE_NAME SALARY DEPTNO
      
      ---------- ---------- ----------
      
      SMITH 800 20
      
      JONES 2975 20
      
      SCOTT 3000 20
      
      ADAMS 1100 20
      
      FORD 3000 20
      
      ME 1000 20
      
      WARD 950 20
      
      CLARK 2450 10
      
      KING 5000 10
      
      MILLER 1300 10
      
      WARD 1000 10
      في لمح البصر , أضفنا اربع صفوف , تخيل ان موظفي القسم 10 به ألف موظف , سوف يضافون وبسرعة الضوء .

      للاسف ان التعديل محدود القوى , لأن طبيعته الحدودية ,, كيف ؟

      يجب ان يكون الاستعلام الفرعي في التعديل , استعلام ذو صف واحد !!

      مثلا نريد ان نعدل كل الموظفين في القسم 10 , مثل معلومات الموظف
      KING مثلا , والموجود في نفس الجدول !!

      ولاحظ الاستعلام الفرعي يستخدم نفس الجدول في مثالنا

      كود:
      update emp_temp
      
      set (the_name , salary , deptno )
      
      = (select the_name , salary , deptno from emp_temp where the_name='KING')
      
      where deptno=10;
      اهم شيء في الاستعلام الفرعي في امثلتنا ان يطابق الاعمدة الموجودة به الاعمدة التي بالخارج

      مثلا نقول في مثالنا السابق كتبنا في الاستعلام الرئيسي :
      the_name , salary , deptno

      وفي الاستعلام الفرعي ... كتبنا بنفس الترتيب اعمدة مطابقة يعني ماذا مطابقة ؟ يعني نفس النوعية , ونفس الحجم !!

      حتى لو عمودين مختلفين !!ومن جدولين مختلفين !!

      اهم شيء اذا كان رقم وحده مثلا خانتين ... يجب ان يكون هناك رقم وحده خانتين ...

      وهكذا !! ...... هل فهمت الفكرة الرئيسية ؟؟

      رائع الان نرى التعديل :

      كود:
      SQL> select * from emp_temp;
      
      
      
      THE_NAME SALARY DEPTNO
      
      ---------- ---------- ----------
      
      SMITH 800 20
      
      JONES 2975 20
      
      SCOTT 3000 20
      
      ADAMS 1100 20
      
      FORD 3000 20
      
      ME 1000 20
      
      WARD 950 20
      
      KING 5000 10
      
      KING 5000 10
      
      KING 5000 10
      
      KING 5000 10
      وكل ما يجب ان تعرفه في جملة التعديل ... يجب ان يكون ذو صف واحد مفهوم ؟ لماذا ؟ فكر انت !! هذا تحدي !!

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


      يظهر ان تحديات اليوم , كلها تفسيرات !! اسف جدا , ولكن هذا الموجود .

      الان الحذف , واعتقد انه الان بسيط جدا , سنحذف كل من هم في القسم الذي يدعى بقسم المحاسبة :

      كود:
      delete emp_temp 
      
      where deptno=(select deptno from dept where dname='ACCOUNTING');

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


      - ربط الجداول :
      اولا اريد ان احدثك بشيء يدعى "بالتقارير" !!
      Reports احفظ الكلمة جيدا ...

      هذه التقارير هي مجرد جداول ... بها اعمدة وتأتي اما على ورق او على الشاشة !!

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

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

      التقارير هل متمسكة بجدول ما ؟؟ أي هل هي تؤخذ من جدول واحد ؟ طبعا لا

      حينما نعمل جملة استعلام , فنحن ننشئ تقرير على الشاشة ..

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

      من العنوان .. فإنه يوجد طريقة لربط الجداول مع بعضها ....

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

      الان ... اريد عرض اسماء الموظفين , واسماء الأقسام التي هم فيها كيف ؟

      بسيطة ... ننظر الى جدول
      dept ثم الى جدول emp ثم نعرف ...

      ولكن صعبة اذا كانت البيانات ضخمة صح ؟

      هيا لتتعلم الربط ..

      انواع الربط :

      1- الربط بالتساوي
      Equijoin

      2- الربط بعدم التساوي
      Non-Equijoin

      3- الربط الخارجي
      Outer join

      4- الربط الداخلي
      Inner join

      افففف ... تسميات وحفظ و طفش .....




      هل حفظتها جيدا عن ظهر قلب ؟؟ على فكرة .. كانو يقولون ان جملة العرب "حفظ عن ظهر قلب" خاطئة جدا

      وان الحفظ مركزه الدماغ ,, وهذا ما نعرفه في العلم حديث ...

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

      1- الربط بالتساوي
      Equijoin

      مجرد ربط جدولين مختلفين عن طريق تساوي عمود من الجدول الاول , مع عمود من الجدول الاخر !!

      اكرر تساوي .... عمودين .... متشابهين في المظهر .... يعني ايش متشابهين ؟ يعني اذا كان الاول رقمي و عدد خاناته 10 ... الاخر مثله تماما .

      مثال بسيط جدا عليه ؟؟؟

      اريد ان اعرض اسماء الموظفين واسماء الأقسام ... انتبه لم اقل ارقام ... بل اسماء الأقسام التي يعملون بها في تقرير واحد ....

      هيا لنعمل ذلك :
      كود:
      select emp.ename , dept.dname 
      
      from emp , dept 
      
      where emp.deptno=dept.deptno ;
      بسيطة هاه ... ومألوفة لدينا ,,,

      انظر العمود الاول ...
      emp.ename

      يعني بالعقل ما معناها ؟ يعني احضر العمود الذي اسمه
      ename من الجدول الذي يدعى emp

      هذا معناه !

      الان العمود الثاني يدعى
      dept.dname

      نفس المفهوم ... احضر العمود
      dname من الجدول dept كعمود في تقريرنا هذا ....

      انظر الى جملة
      from , ستجد الجدولين مذكورين هنا ... وهذه هي الفكرة ...

      فإننا نقول للاوراكل .. هيا واحضر العمود
      dname ثم احضر العمود الذي اسمه ename من الجدولين emp و dept

      حتى هنا مفهوم .... وسوف اعمل نفسي انني لم الاحظ السطر الاخير من الجملة ....

      انظر الى النتيجة :
      كود:
      ENAME DNAME
      
      ---------- ------------
      
      CLARK ACCOUNTING
      
      KING ACCOUNTING
      
      MILLER ACCOUNTING
      
      SMITH RESEARCH
      
      ADAMS RESEARCH
      
      FORD RESEARCH
      
      SCOTT RESEARCH
      
      JONES RESEARCH
      
      ALLEN SALES
      
      BLAKE SALES
      
      MARTIN SALES
      
      JAMES SALES
      
      TURNER SALES
      
      WARD SALES
      هل تشاهد جمال النتيجة ؟

      هل تشاهد هذا المنظر ؟؟؟

      وهذه من اروع جمل الاستفسارات نتيجة ... ولكن ..... اغلاها ثمنا ....

      انظر الى السطر الاخير ... غريب جدا ....
      كود:
      where emp.deptno=dept.deptno ;
      ما شأن هذان العمودين في التقرير ؟؟ لم يعرضا اصلا !! فلماذا استخدمناهما ؟؟

      هراء .... هيا لنحذف الجملة كلها ...


      كود:
      select emp.ename , dept.dname
      
      from emp , dept ;

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

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

      كود:
      ENAME DNAME
      
      ---------- -------------
      
      SMITH ACCOUNTING
      
      ALLEN ACCOUNTING
      
      WARD ACCOUNTING
      
      JONES ACCOUNTING
      
      MARTIN ACCOUNTING
      
      BLAKE ACCOUNTING
      
      CLARK ACCOUNTING
      
      SCOTT ACCOUNTING
      
      KING ACCOUNTING
      
      TURNER ACCOUNTING
      
      ADAMS ACCOUNTING
      
      JAMES ACCOUNTING
      
      FORD ACCOUNTING
      
      MILLER ACCOUNTING
      
      SMITH RESEARCH
      
      ALLEN RESEARCH
      
      WARD RESEARCH
      
      JONES RESEARCH
      
      MARTIN RESEARCH
      
      BLAKE RESEARCH
      
      CLARK RESEARCH
      
      SCOTT RESEARCH
      
      KING RESEARCH
      
      TURNER RESEARCH
      
      ADAMS RESEARCH
      
      JAMES RESEARCH
      
      FORD RESEARCH
      
      MILLER RESEARCH
      
      SMITH SALES
      
      ALLEN SALES
      
      WARD SALES
      
      JONES SALES
      
      MARTIN SALES
      
      BLAKE SALES
      
      CLARK SALES
      
      SCOTT SALES
      
      KING SALES
      
      TURNER SALES
      
      ADAMS SALES
      
      JAMES SALES
      
      FORD SALES
      
      MILLER SALES
      
      SMITH OPERATIONS
      
      ALLEN OPERATIONS
      
      WARD OPERATIONS
      
      JONES OPERATIONS
      
      MARTIN OPERATIONS
      
      BLAKE OPERATIONS
      
      CLARK OPERATIONS
      
      SCOTT OPERATIONS
      
      KING OPERATIONS
      
      TURNER OPERATIONS
      
      ADAMS OPERATIONS
      
      JAMES OPERATIONS
      
      FORD OPERATIONS
      
      MILLER OPERATIONS
      
      
      
      56 rows selected.
      اعرف ان النتيجة كبيرة نوعا ما ..

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

      تفرج في عدد الصفوف .... فبدلا من 14 صف كعدد الموظفين المتوقع ...

      طلع لنا 56 صف ...

      كيف فين ليه ليش
      Why How لماذا .... ؟؟؟؟

      لماذا ظهرت هكذا ؟؟ ولماذا بالذات 56 صف ؟؟

      اولا كم عدد الصفوف في جدول
      dept ؟؟ اربع صفوف

      والان كم عدد الصفوف في
      emp ؟؟ 14 صف

      4 * 14 = 56
      كيف ؟

      اريدك الان ان تعمل جدول خاص بموظفي القسم 10 فقط ...

      مارأيك ؟

      كود:
      create table emp_10 as(select * from emp where deptno=10);
      الان هذا الجدول به كم صف ؟ لنرى
      :

      كود:
      SQL> select * from emp_10;
      
      
      
      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      
      ---------- ---------- --------- ---------- -------- --------- ---------- -------
      
      7782 CLARK MANAGER 7839 09/06/81 2450 10
      
      7839 KING PRESIDENT 17/11/81 5000 10
      
      7934 MILLER CLERK 7782 23/01/82 1300 10
      
      7999 WARD SALESMAN 7689 13/02/06 1000 0 10
      اربع صفوف ....

      اريدك ان تعمل الثلاث التعديلات التالية :
      كود:
      SQL> update emp_10 set deptno=20
      
      2 where ename='KING';
      
      
      
      1 row updated.
      
      
      
      SQL> update emp_10 set deptno=30
      
      2 where ename='MILLER';
      
      
      
      1 row updated.
      
      
      
      SQL> update emp_10 set deptno=40
      
      2 where ename='WARD';
      
      
      
      1 row updated.
      فقط عدلنا كل موظف لكل قسم ....

      الان انظر الى الجدول بعد التعديل , لكل شخص قسم خاص ... (مجرد مثال)
      كود:
      SQL> select * from emp_10 ;
      
      
      
      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      
      ---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      
      7782 CLARK MANAGER 7839 09/06/81 2450 10
      
      7839 KING PRESIDENT 17/11/81 5000 20
      
      7934 MILLER CLERK 7782 23/01/82 1300 30
      
      7999 WARD SALESMAN 7689 13/02/06 1000 0 40

      الان لنطبق الربط بالتساوي ... مع جدول
      dept ...

      انا اسمي هذا الشرط ... "شرط الربط "... مفهوم ؟
      كود:
      SQL> select emp_10.ename , dept.dname
      
      from emp_10 , dept
      
      where emp_10.deptno=dept.deptno;
      
      
      
      ENAME DNAME
      
      ---------- --------------
      
      CLARK ACCOUNTING
      
      KING RESEARCH
      
      MILLER SALES
      
      WARD OPERATIONS
      عرضنا اسم الموظف واسم القسم الذي يعمل فيه
      ...

      الان نكتب بدون "شرط الربط"
      ...



      كود:
      SQL> select emp_10.ename , dept.dname
      
      2 from emp_10 , dept;
      
      
      
      ENAME DNAME
      
      ---------- --------------
      
      CLARK ACCOUNTING
      
      KING ACCOUNTING
      
      MILLER ACCOUNTING
      
      WARD ACCOUNTING
      
      CLARK RESEARCH
      
      KING RESEARCH
      
      MILLER RESEARCH
      
      WARD RESEARCH
      
      CLARK SALES
      
      KING SALES
      
      MILLER SALES
      
      WARD SALES
      
      CLARK OPERATIONS
      
      KING OPERATIONS
      
      MILLER OPERATIONS
      
      WARD OPERATIONS
      
      
      
      16 rows selected.
      والنتيجة .. 16 صف .... ناتج ضرب 4 صفوف من جدول الموظفين الذي عملناه .. في 4 صفوف من جدول الأقسام

      ماهي الفكرة ؟

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

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

      انظر الصورة .... (الصورة 1200) وهي الصورة الخاصة بجملة الاستعلام بدون شرط الربط :

      في الصورة ستجد علاقات متعددة ...

      نحن قلنا ... (بدون شرط الربط)

      "عزيزي أوراكل ... لو سمحت ... اعرض جميع اسماء الموظفين من جدول الموظفين ... و
      ... اعرض جميع اسماء الأقسام من جدول الأقسام ...لاحظ الترتيب يا أوراكل ... اولا اسماء الموظفين .. ثم اسماء الأقسام ..."

      الأوراكل صحيح ذكي ويفهم !! .. ولكنه غبي لا يستنتج ....

      -
      فيأتي ويرى الجدولين هل هما موجودين ... ثم يختار جدول الأقسام اولا .. لا اعرف لماذا ولكن انا شخصيا اعتقد انه يرى الجدول الاب ... أي الجدول الذي به المفتاح الرئيسي (deptno ) ثم يذهب الى الجدول الابن الذي به المفتاح الأجنبي (deptno) ...

      - يذهب لأول صف من جدول الأقسام ... فيجده القسم
      ACCOUNTING

      -
      فيقول في نفسه ... "مع أي موظف اضع هذا القسم؟ هل مع الموظف الاول ؟ الثاني ؟؟؟؟؟ لا لا .... سوف اضعه معهم جميعا "

      -
      ويبدأ يقول ....

      CLARK ACCOUNTING

      KING ACCOUNTING

      MILLER ACCOUNTING

      WARD ACCOUNTING


      "
      هكذا افضل ...

      هيا الذي بعده ...
      "

      - يذهب الى القسم الذي بعد
      ACCOUNTING ويجده RESEARCH

      - بنفس الصورة ...
      CLARK RESEARCH

      KING RESEARCH

      MILLER RESEARCH

      WARD RESEARCH
      وهكذا ... حتى تصير 16 صف ..

      هذه الديناميكية التي يعمل بها الأوراكل ...

      انظر الصورة .... (الصورة 1201) وهي الصورة الخاصة بجملة الاستعلام بشرط الربط :


      سوف يجد شرط غريب ... الأوراكل لا يعرف طبعا لماذا وضعناه ..

      وهو شرط الربط ...
      where emp_10.deptno = dept.deptno

      - طبعا سوف يستعرض رقم القسم في جدول الموظفين

      - ويستعرض رقم القسم في جدول الأقسام

      - ويبدأ بجدول الأقسام ... (لانه على ما اظن الجدول الأب )

      - سوف يرى اول صف ....
      ACCOUNTING ويقول .. "مع من اضعه من الموظفين ؟؟

      اها .. يوجد شرط .. ماهو الشرط ؟؟

      يجب ان يكون رقم الأقسام في جدول الأقسام يساوي رقم الأقسام في جدول الموظفين .. "

      - ويبدأ يبحث عن كل الموظفين الذين رقم قسمهم يساوي رقم قسم
      ACCOUNTING

      ورقم قسم
      ACCOUNTING يساوي 10

      - يذهب .. ويفتش في جدول الموظفين عن أي موظف في القسم 10

      - يجد احدهم ويدعى
      CLARK في القسم 10 ( deptno=10 في جدول الموظفين )

      - يطابقهما ويعرض اول نتيجة في تقريرنا :
      CLARK ACCOUNTING


      ويبدأ هكذا حتى تصبح النتيجة ...
      ACCOUNTING CLARK

      RESEARCH KING

      SALES MILLER

      OPERATIONS WARD
      اعتقد انك فهمت ....

      مجرد احتمالات ... والسر في شرط الربط ...

      وشرط الربط هذا .. هو الذي يخبر الأوراكل ان يعرض كل موظف بقسمه !! (الموظف صاحب رقم قسم = س مع القسم بنفس الرقم س ) , هذا كل شيء ...

      هذا النوع بسيط وسهل , وهو الربط بالتساوي ....

      هيا لنذهب الى النوع الاخر , شأنه اعظم .

      2- الربط بعدم التساوي
      Non-Equijoin


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

      كود:
      SQL> select * from salgrade ;
      
      
      
      GRADE LOSAL HISAL
      
      --------- ---------- ----------
      
      1 700 1200
      
      2 1201 1400
      
      3 1401 2000
      
      4 2001 3000
      
      5 3001 9999
      هذا الجدول , يبين ان الذي يقبض راتب ما بين 700 و 1200 فهو في الدرجة الاولى من سلم الرواتب ...

      والذي يقبض راتب اكبر من 1200 و اصغر من 1401

      فهو في الدرجة الثانية .
      ..

      والذي يقبض 9999 دولار في الشهر .. فهذا في درجة الخمس نجوم !!

      اذا لم تجد الجدول عندك ... فأعمله الان وضع به هذه البيانات ...

      الان يوجد سوال صعب قليلا .... بل كثيرا ....

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

      كود:
      ENAME SAL GRADE
      
      ---------- ---------- ----------
      
      SMITH 800 1
      
      JAMES 950 1
      
      WARD 950 1
      
      ADAMS 1100 1
      
      MARTIN 1250 2
      
      MILLER 1300 2
      
      TURNER 1500 3
      
      ALLEN 1600 3
      
      CLARK 2450 4
      
      BLAKE 2850 4
      
      JONES 2975 4
      
      SCOTT 3000 4
      
      FORD 3000 4
      
      KING 5000 5
      واو .. نتيجة مذهلة ...

      اليك الحل ..

      ولا شيء غير ان ترى الحل ...
      كود:
      select emp.ename , emp.sal , salgrade.grade 
      
      from emp , salgrade 
      
      where emp.sal >= salgrade.losal 
      
      and emp.sal <= salgrade.hisal ;
      ندخل في شرط الربط مباشرة ..

      يقول حينما يكون الراتب من جدول الموظفين .. اكبر من او يساوي (الراتب الاصغر في جدول درجات الرواتب)

      ويكون اصغر من او يساوي (الراتب الاكبر في جدول درجات الرواتب)

      صعبة قليلا على البعض ..

      لكن ركز وامشي خطوة خطوة ..

      سوف يأتي الى جدول درجات الرواتب ..
      .

      سوف يجد اول صف ... :
      1 700 1200
      ويبحث في صفوف جدول الموظفين ..

      من الذي راتبه بين 700 و 1200 ؟؟

      هل هو
      KING صاحب الراتب 5000 ؟؟ لا

      هل هو
      WARD صاحب الراتب 950 ؟؟ نعم ..

      اعرض
      WARD :

      WARD 950 1
      ثم يبحث في جميع الموظفين .. حتى تصبح النتيجة :
      SMITH 800 1

      JAMES 950 1

      WARD 950 1

      ADAMS 1100 1
      انتهو ...

      الان ينتقل الى الصف الثاني من جدول
      salgrade

      يجده :
      2 1201 1400
      من من الموظفين ذو راتب بين 1201 و 1400 ؟؟

      هل هو
      WARD ؟؟؟ (لاحظ انه غبي ...ولا يعرف ان WARD قد وضعناه من الدرجة الاولى .... صحيح انه غباء ولكن من الممكن ان يكون ذكاء ... ممكن يكون الصف الثاني نفس الصف الاول , وبالتالي سوف يضع WARD مرة اخرى .... )

      لا ليس
      WARD ...

      هل هو
      KING ؟؟ لا ليس KING

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

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

      اشير الى اننا نستطيع ان نستخدم دالة
      BETWEEN كما يلي :

      كود:
      select emp.ename , salgrade.grade
      
      from emp , salgrade 
      
      where emp.sal between salgrade.losal and salgrade.hisal;

      بما اننا نملك جداول ضعيفة غير معقدة , فلا اعتقد انه يوجد على هذا النوع المزيد من الامثلة بهذه الجداول الغبية
      !!

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

      من الممكن ان يكون الربط بعلامة <> لا تساوي ... ويمكن ان تكون اصغر من فقط ... او ماشابه ... اهم شيء انه ليس يساوي .



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

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










      3- الربط الخارجي
      Outer join







      نرجع لجدولنا
      emp_10







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













      هيا لنعدل معلومة به .. :






      كود:
       
      update emp_10 set deptno=null
       
      where deptno=40 ;




      فقط عدلنا كل من هو في القسم 40 ونضعه في القسم 30 ... انظر الى الجدول الان :











      كود:
      SQL> select * from emp_10;
      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      ---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7782 CLARK MANAGER 7839 09/06/81 2450 10
      7839 KING PRESIDENT 17/11/81 5000 20
      7934 MILLER CLERK 7782 23/01/82 1300 30
      7999 WARD SALESMAN 7689 13/02/06 1000 0



      والان سوف نعرض اسماء الموظفين مع اسماء الأقسام التي يعملون فيها ..











      كود:
      SQL> select emp_10.ename , dept.dname from emp_10,dept
      where emp_10.deptno=dept.deptno;
      ENAME DNAME
      ---------- ---------
      CLARK ACCOUNTING
      KING RESEARCH
      MILLER SALES



      مالجديد ؟


      مع شرط الربط ... يوجد قسم ليس متصلا مع احد الموظفين ..

      بمعنى اخر .. يوجد صف ... لم يتلائم مع صف اخر .. على ضوء شرط الربط ..

      بمعنى ثالث .. القسم رقم 40 .. لا يوجد به موظف يعمل عليه ..

      وايضا الموظف
      WARD لا يعمل تحت أي قسم !!













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


      وهي ان نضع صفوف ليس لها علاقة بشرط الربط ...







      مثلا ... اريد هذه النتيجة :






      كود:
       
      ENAME DNAME
       
      ---------- -----------
       
      CLARK ACCOUNTING
       
      KING RESEARCH
       
      MILLER SALES
       
      OPERATIONS




      ارجو ان تتضح الفكرة ... الفكرة ان يتم عرض الصفوف التي لم تظهر في العلاقة ...وسؤال الناتج السابق
      ..







      اعرض لي اسماء الأقسام جميعها ... واسماء الموظفين الذين يعملون بها ... إن وجد موظفين
      !!









      سوال اخر ..


      اعرض لي اسماء الموظفين جميعهم ... مع اسماء اقسامهم .. ان وجدت !!

      هذا ناتجه :





      كود:
       
      ENAME DNAME
       
      ---------- ----------
       
      CLARK ACCOUNTING
       
      KING RESEARCH
       
      MILLER SALES
       
      WARD




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


      انظر الى الصورة 1203














      الان لكي نعرض اسماء الأقسام جميعها وأسماء الموظفين ان وجدوا ... هذا هو الحل ...











      كود:
      SQL> select emp_10.ename , dept.dname from emp_10,dept
      where emp_10.deptno(+)=dept.deptno;
      ENAME DNAME
      ---------- --------------
      CLARK ACCOUNTING
      KING RESEARCH
      MILLER SALES
      OPERATIONS



      وضعنا العلامة (+) في شرط الربط ؟؟؟


      واين وضعناها ؟؟؟... في
      emp_10.deptno(+) !!






      لو وضعناها في الجهة المقابلة .. فسوف نحل السوال الثاني والذي ينص ..


      "اعرض لي كل الموظفين واقسامهم ان وجدت اصلا اقسام "










      كود:
      SQL> select emp_10.ename , dept.dname from emp_10,dept
      where emp_10.deptno=dept.deptno(+);
      ENAME DNAME
      ---------- --------------
      CLARK ACCOUNTING
      KING RESEARCH
      MILLER SALES
      WARD



      أين نضع علامة الزائد ؟؟


      ومتى نضع هذه العلامة ؟؟

      اذا قلنا ... "اعرض كل الموظفين واسماء اقسامهم ان وجدت"

      أي عرض الموظفين جميعهم ... واقسامهم ... سواء كانو يعملون في قسم ... ما او لا ..

      اذا لا .. اعرض اسم الموظف واعرض قيمة خالية في عموده ..

      في هذه الحالة نضع علامة الزائد عند العمود الذي نتوقع ان يكون خالي .. أي انه زيادة ...

      أي نضعه هنا في مثالنا عند
      dept.deptno لاننا نتوقع هذا العمود ان يصبح خاليا ..

      ووو ....... ممممم .....

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













      4- الربط الداخلي
      Inner join







      لا تنزعج من التسميات ..


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

      اريدك ان تنتبه لشيء مهم !!

      هل تذكر العلاقات ؟؟

      علاقات الجداول .... هل نسيتها ؟؟؟





      ......






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


      مثلا جدول الموظفين ...

      يوجد علاقة الادارة ...

      فالموظف الواحد من الممكن ان يدير مجموعة موظفين ..

      وان الموظف الواحد .. يدار من قبل موظف واحد (يدار من قبل مدير واحد)

      أي العلاقة واحد الى متعدد ..

      اي اننا يمكننا ان نشاهد جدولين في جدول واحد ..

      جدول المدراء ... وجدول الموظفين .... انظر :












      كود:
      SQL> select * from emp
      2 where job='MANAGER';
      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      ---------- ---------- --------- ---------- -------- ------- ---------- ------
      7566 JONES MANAGER 7839 02/04/81 2975 20
      7698 BLAKE MANAGER 7839 01/05/81 2850 30
      7782 CLARK MANAGER 7839 09/06/81 2450 10
      SQL> select * from emp
      2 where job <> 'MANAGER';
      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



      تجاهل الموظف
      KING .... لانه لا يوجد علاقة رئاسة, ولو وجدت فإن له جدول خاص .. ونسميه مثلا جدول الرؤساء ... لأنه الرئيس .. مدير المدراء !! أي اننا نشاهد ثلاث جداول في جدول واحد !


      الان ... المفتاح الأجنبي في جدول الموظفين والذي هو مفتاح رئيسي في جدول المدراء .. ماهو ؟

      انه
      mgr , كمفتاح أجنبي ... وهو المفتاح الرئيسي في جدول المدراء ..

      وايضا
      mgr في جدول المدراء مفتاح أجنبي في جدول الرؤساء !!

      هل لاحظت ذلك ؟

      وضعنا كل الجداول هذه في جدول واحد لتشابه الصفات !! اكرر لتشابه الصفات

      ولأنهم كيان واحد ... ولأنهم جميعا موظفين ...

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

      هل فهمت الوضع ؟ فكر وانت ترى بعض الجداول ..

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

      الان جدول الموظفين به المدراء والرؤساء , وضربنا علاقة بين جدول الموظفين مع نفسه ... وهي علاقة الادارة ..

      وتوجد علاقة اخرى الرئاسة !!

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

      اسمع اسمع السوال .... نريد عرض اسماء الموظفين ... واسماء مدرائهم !! في تقرير واحد !!

      قبل ان ابدأ بالحل ..

      اريد ان اعلمك انه يوجد بعض الامور والتي تعمدت تجاهلها ....

      تخيل انه لديك جدول اسمه ....
      ABCDEFGHIJKLMNOPQRSTUVWXYZ






      وبه عمود ... وليكن اسمه
      col







      كيف يتم كتابته في جملة الاستعلام التي بها شرط الربط ؟؟


      سيكتب هكذا ..
      ABCDEFGHIJKLMNOPQRSTUVWXYZ.col






      أي اسم الجدول , ثم العمود .. صح ؟؟


      اريد ان اختصر اسم الجدول ... لكي يسهل علي كتابة وقرائة جملة الاستعلام !!

      انظر الى المثال فبدلا ان نقول :










      كود:
      select emp.ename , dept.dname
      from emp , dept
      where emp.deptno=dept.deptno;



      نقول ما يلي .. نسمي جدول الموظفين بـ
      e وجدول الأقسام بـ d مثلا .. :












      كود:
      select e.ename ,d.dname
      from emp e , dept d
      where e.deptno = d.deptno;



      هل فهمت الفكرة !! ... انظر جيدا .... ولاحظ أين وضعنا التسميات .. في جملة
      from ...







      واستخدمناها عادي جدا
      !!









      الان نرجع الى الربط الداخلي ...


      مارأيك ان يكون جدول المدراء اسمه
      m وجدول الموظفين .. اسمه w ؟

      لنرى ذلك ...






      كود:
       
      select w.ename , m.ename 
       
      from emp m, emp w
       
      where w.mgr =m.empno;




      هل رأيت بعض التعقيد ؟




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

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

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

      شرط الربط غريب جدا !!

      الان ركز .... جدول الموظفين قسمه في خيالك الى قسمين ...

      جدول موظفين عاملين
      Worker وجدول للمدراء Manager

      نسمي جدول العاملين بـ
      w

      ونسمي جدول المدراء بـ
      m

      الان ... انظر الى شرط الربط ...

      اعرض كل من .... رقم مديره من جدول العمال .... يساوي ..... رقم الموظف من جدول المدراء !!

      لم تفهم ؟ طيب

      المفتاح الأجنبي للعلاقة مابين العاملين والمدراء ماهو ؟؟ انه الـ
      mgr

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

      أي ان
      mgr مفتاح أجنبي في جدول الموظفين ..

      وان مفتاحه الرئيسي هو
      deptno في جدول الموظفين نفسه !!

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

      اليك ما سوف يعرض ....

      كود:
      ENAME ENAME
      
      ---------- ------
      
      FORD JONES
      
      SCOTT JONES
      
      JAMES BLAKE
      
      TURNER BLAKE
      
      MARTIN BLAKE
      
      WARD BLAKE
      
      ALLEN BLAKE
      
      MILLER CLARK
      
      ADAMS SCOTT
      
      CLARK KING
      
      BLAKE KING
      
      JONES KING
      
      SMITH FORD
      الان تخيل انني اريد ان اعرض تقرير ...

      التقرير هذا ... يحتوي على ...

      اسم الموظف .. اسم مديره ... اسم القسم الذي يعمل به ...

      سوف تلاحظ اننا سوف نضطر الى ربط ثلاث جداول !

      اسم الموظف ... من جدول الموظفين ..

      اسم القسم .. من جدول الأقسام

      اسم المدير من نفس جدول الموظفين .. كرابط داخلي ..
      .



      كود:
      select e.ename , m.ename , d.dname
      
      from emp e , emp m , dept d
      
      where e.mgr=m.empno 
      
      and e.deptno = d.deptno ;
      واو .. بدأت تتشعب يا شعب !!

      ثلاث جداول ...

      ركز انه يوجد شرطين للربط ...

      شرط الربط الاول .. لكي نعرض اسم الموظف و اسم مديره

      والشرط الاخر لكي نعرض اسم الموظف واسم القسم !!

      انتبه !! جرب لو حذفت الشرط الثاني ... هل تتوقع مالذي سوف يحدث ؟

      مصائب , وسوف يتكون لدينا جميع الاحتمالات !!

      الان ... لكي تفهم اكثر واكثر ....

      اريد ان اعرض اسم الموظف .. واسم القسم الذي يعمل به ..

      واريد ايضا ان اعرض في نفس التقرير اسم مديره , واسم قسم مديره !!

      هو بالعقل طبعا قسم المدير نفس قسم الموظف الذي يدار بواسطة هذا المدير !! ولكن ليس كل الاحوال !!

      ولكن ... تخيل ان الموظف في قسم .. وان مديره في قسم اخر .... فكر في الحل ...

      انظر اليه :

      كود:
      select e.ename "EMP_NAME" , d.dname "HIS_DEPT" , m.ename "HIS_MANAG" , dm.dname "MANAG_DEPT"
      
      from emp e,emp m , dept d, dept dm 
      
      where e.deptno = d.deptno 
      
      and e.mgr = m.empno 
      
      and m.deptno = dm.deptno ;


      كود:
      EMP_NAME HIS_DEPT HIS_MANAG MANAG_DEPT
      
      ---------- -------------- ---------- ----------
      
      CLARK ACCOUNTING KING ACCOUNTING
      
      JONES RESEARCH KING ACCOUNTING
      
      BLAKE SALES KING ACCOUNTING
      
      MILLER ACCOUNTING CLARK ACCOUNTING
      
      SMITH RESEARCH FORD RESEARCH
      
      ADAMS RESEARCH SCOTT RESEARCH
      
      SCOTT RESEARCH JONES RESEARCH
      
      FORD RESEARCH JONES RESEARCH
      
      ALLEN SALES BLAKE SALES
      
      JAMES SALES BLAKE SALES
      
      TURNER SALES BLAKE SALES
      
      MARTIN SALES BLAKE SALES
      
      WARD SALES BLAKE SALES
      اليك تحدي ... لا بأس به ..
      اريد عرض تقرير به الاعمدة التالية :

      اسم الموظف , اسم قسمه , درجة راتبه , اسم مديره , درجة راتب المدير


      انتهى درس اليوم ...

      في الدرس القادم ....

      سوف اتعمق في بعض الامور الادارية , وبالتالي ننتهي من الـ
      SQL ان شاء الله .



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

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

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

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

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

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

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

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

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

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

      -
      لتنتهي من شر الـ SQL


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

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

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

      اولا ما هو معدل رواتب الأقسام ؟؟ اليك جملة مبسطة :



      كود:
      SQL> select avg(sal) , deptno 
      
      2 from emp 
      
      3 group by deptno ;
      
      
      
      AVG(SAL) DEPTNO
      
      ---------- ----------
      
      2916.66667 10
      
      2175 20
      
      1566.66667 30
      عرفنا ما هي معدلات رواتب الأقسام ..

      الان كيف نعرف اسماء الموظفين الذين يملكون رواتب اكبر من معدل رواتب قسمهم !!

      اكرر معدل رواتب قسمهم هم .. يعني الموظف
      scott ما هو قسمه ؟؟ قسمه هو القسم 20 ... هو يأخذ راتب 3000 دولار .. هل راتبه اكبر من معدل رواتب قسمه ؟؟ نعم !! ... اذن اعرضه !!

      قليلا صعبة وتحتاج لبعض التفكير ... لوكتبنا مثلا هذا الحل الغبي ...
      :



      كود:
      select avg(sal) , deptno ,ename 
      
      from emp 
      
      where sal > avg(sal)
      
      group by deptno ;

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

      حللنا احد الامثلة الشبيهة ... بربط جدولين مع بعضهما .... ارجع للدرس السابق وتأكد !!

      اليك حل اخر غبي ...

      كود:
      SQL> select ename , sal , deptno from emp
      
      2 where sal >any (select avg(sal) from emp group by deptno) ;
      
      
      
      ENAME SAL DEPTNO
      
      ---------- ---------- ----------
      
      ALLEN 1600 30
      
      JONES 2975 20
      
      BLAKE 2850 30
      
      CLARK 2450 10
      
      SCOTT 3000 20
      
      KING 5000 10
      
      FORD 3000 20
      هنا يكمن الغباء أين ؟

      انه سوف يقارن مع راتب الموظف ومع جميع الأقسام !! وليس قسمه !!

      اذن نحتاح لرابط يربط كل شخص وراتبه .... مع قسمه فقط !!

      الان خذ الحل ... ولم اعرض هذا المثال الا لأنني شاهدت فيه نوع من الصعوبة في فهمه !!

      قبل ان ترى الحل انظر الناتج لعل وعسى تستطيع ان تحلها بنفسك ... وانا اعتقد انك لا تستطيع :
      كود:
      ENAME SAL DEPTNO SALAVG
      
      ---------- ---------- ---------- ----------
      
      ALLEN 1600 30 1566.66667
      
      JONES 2975 20 2175
      
      BLAKE 2850 30 1566.66667
      
      SCOTT 3000 20 2175
      
      KING 5000 10 2916.66667
      
      FORD 3000 20 2175
      الحل لا اعتقد انك تعرفه جيدا لاني لم اقترح عليك حلا مشابه ...

      الا وهو ... الاستعلام الفرعي في جملة
      from ...

      انظر الى الحل ...
      كود:
      select a.ename , a.sal ,a.deptno ,b.salavg
      
      from emp a , (select deptno , avg(sal) salavg from emp group by deptno) b
      
      where a.deptno=b.deptno 
      
      and a.sal>b.salavg;
      هل شاهدت جملة الاستعلام الفرعية .. عاملناها تماما مثل الجدول .. وسميناها بـ
      b واستخدمنا احد اعمدتها !!

      سمينا العمود
      avg(sal) بـ salavg واستخدمناه في جملة الاستعلام الرئيسية بـمسمى :b.salavg ,,,

      وكأنه جدول !!

      متى نستخدم مثل هذا الحل ؟ اذا اردنا جدول لا نملكه ... مثلا هل يوجد جدول جاهز به المعلومات التالية ؟؟
      :

      كود:
      MAX(SAL) MIN(SAL) DEPTNO
      
      -------- --------- ----------
      
      5000 1300 10
      
      3000 800 20
      
      2850 950 30
      طبعا يجب ان نعمله من جملة استعلام .. صح ؟

      هل تتخيل الموقف ؟ هل تتخيل الوضع ؟ هل تصدق انني اعطي هذا الحل صعوبة 9 من 10 ؟؟؟

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

      هل عرفت فائدة ربط الجداول مع بعضها وكيف ان نضع أي عمود في العالم وندمجه مع عمود من عالم اخر ؟

      هل عرفت ان المثال السابق استخدم فائدة الجداول الفرعية و فائدة ربط الجداول؟؟

      احببت ان اراجع معك ما اخذناه بمثال رائع واكثر من رائع ... تنبه !!

      الان .. اود ان اعرف شيء مهم في البرمجة .. مهم جدا ,

      اريدك ان تفرق بين الذاكرة الرام والقرص الصلب ..

      الذاكرة هي من نوع الذاكرة المؤقتة , والقرص الصلب هو الذاكرة الدائمة !

      الرام يحتوي على معلومات موجودة به , وتختفي متى ؟ اذا اطفأنا الجهاز ... اذا انقطع التيار ..

      أي ان الرام تحفظ بشكل مؤقت طالما ان التيار موجود ..

      ولكن القرص الصلب موجودة به المعلومات سواء اطفأنا الجهاز او لا ... الا اذا جاء فيروس محترم ومسح مافيه !

      الان , لماذا نستخدم الرام ؟ ولماذا نستخدم القرص الصلب ؟

      الرام للمعلومات التي نريدها للحظة معينة , ثم لا نكترث لها !!

      القرص الصلب للمعلومات المهمة التي لا نريدها ان تمحو من ذاكرتنا ,

      فمثلا قواعد البيانات ... تحفظ في القرص الصلب ... لاننا نحتاج المعلومات التي به دائما وابدا

      الان .. لماذا الرام ؟؟ بإمكاننا ان نخزن ما نريد في القرص الصلب , ثم نحذفه اذا طفشنا منه !!


      وايضا التخزين على القرص الصلب يؤمننا من انقطاع التيار , يعني نطفئ الجهاز ونرجع نشغله غدا ونرى كل ما كان بالامس موجود اليوم ... فلماذا الرام ؟

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

      في الحقيقة اهم الاسباب هي .. سرعة الرام الخيالية , والتي تقدر بسرعة الضوء (سرعة انتقال الالكترونات)


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

      وسوف يأتي العهد القريب بأن يصبح القرص الصلب بسرعة الرام , وهذا ما نشاهده في كرت الفلاش التخزيني (المتصل بالـ
      USB والمعروف بصغر حجمه مع كبر سعته التخزينية!!)


      المهم , مثلا كتبنا الجملة التالية :



      كود:
      SQL> select ename from emp where deptno=10;
      
      
      
      ENAME
      
      ----------
      
      CLARK
      
      KING
      
      MILLER
      فانه يحدث ما يلي ..

      يذهب لمرة واحدة الى القرص الصلب ... طبعا المعالج ينتظر النتائج من القرص الصلب ... وجده ؟ نعم وجد الجدول الخاص بالموظفين .. يأخذ المعالج المعلومات بسرعة البرق ويخزنها في الرام بسرعة البرق , ويعمل الحسابات اللازمة والشروط .. بسرعة البرق ... ويعرض الناتج امامنا .. وبسرعة البرق ...

      الان .. اريدك ان تتعلم شيء يعتبر استخداما للرام , كيف ؟


      اعلمك المتغيرات !!

      المتغيرات هي اوعية تحتوي على بيانات بها ! يمكن ان تكون هذه المتغيرات .. متغيرات نصية او رقمية او ماشابه ..

      المتغيرات لها عنوان على الرام , أي اننا نقول المتغير س به العدد 10 ... فهذا المتغير س , موجود في الرام , واذا اطفأنا الجهاز ... ذهب المتغير س , وذهب العدد 10 .

      لماذا المتغيرات ؟ لكي نسترجع بعض البيانات والقيم , فمثلا اقول لك .... 2 + 6 + 10 كم الناتج ؟

      طبعا عقلك به رام حيوي , يأتي عقلك ويأخذ الـعدد 2 ويخزنه بالرام الحيوي (الذاكرة القصيرة المدى)... وانت لا تعلم ...

      ويأخذ العدد 6 ويخزنه في الذاكرة (متغير حيوي) وايضا العدد 10 يخزنه بالذاكرة .. وانت لا تعلم ...

      يقوم بقراءة العلامة + ... ولأنه يفهم انها زائد ويفهم قواعدها .. فيقوم بأخذ العدد اثنين من المتغير , ويأخذ العدد ستة من المتغير , ويجمعهما سوية ويخزن الناتج وهو العدد 8 ... في متغير جديد ... يسترجع العدد 10 ويسترجع العدد 8 مرة اخرى , ثم يجمع العددين ويخزنهما في الذاكرة ... ويأمر العقل .. اليد بكتابة 18 على الورق !

      وكل هذا وانت لا تعلم ... لماذا لا تعلم ؟ لأن الحسابات هذه بسرعة الضوء !

      البرمجة مثل هذه الفكرة , عندما نبرمج , فإننا نكتب خطوات كهذه , خطوة خطوة , وبطريقة منتظمة , وبها متغيرات تخزينية .

      ارجو انك تنتبه للمتغيرات وفائدتها العظيمة , وكلي ثقة انك فهمت ما معنى متغير ... أي ان الهدف منها واضح ...

      وعبر امثلتنا سوف تفهم هذا الهدف ....



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

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

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

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

      كود:
      select ename , sal , deptno
      
      from emp 
      
      where deptno=&d1;
      هل شاهدت علامة غريبة ؟ وكلمة غريب استخدامها ؟
      &d1
      , ماذا تعني ؟

      يقول اعرض معلومات الموظف الذي يعمل بقسم
      &d1

      وما هو قسم
      &d1 ؟؟

      للعلم ان
      &d1 هو متغير ... موجود به رقم لا نعرفه ...

      من أين ندخل هذا الرقم ؟؟ انا اخبرك .. حينما ننفذ البرنامج :

      كود:
      Enter value for d1:
      يقول ادخل قيمة في الـ
      d1 .. ولاحظ ان علامة & اختفت !!

      انا سوف اكتب 10 .....


      كود:
      Enter value for d1: 10
      وستكون الناتج :
      كود:
      ENAME SAL DEPTNO
      
      ---------- ---------- ----------
      
      CLARK 2450 10
      
      KING 5000 10
      
      MILLER 1300 10
      هل فهمت شيء ؟
      &d1
      متغير , وعاء رقمي , لا يوجد به شيء ...

      الأوراكل يرى هذا المتغير , ويجده مسكين لا يملك قيمة !!

      يأتي ويقول "ارجوك ... اعطي قيمة للمتغير الذي يدعى بــ
      d1 : "

      وتأتي انت .. وتعطيه عشرة ريالات
      .. ااقصد تكتب القيمة 10 بداخله ... الان الاوراكل ينظر الى ما بداخل هذا الوعاء , أي مابداخل هذا المتغير الذي يدعى d1 ويجده عشرة يستبدل الـ &d1 في جملة الاستعلام بالقيمة عشرة ..

      فتصبح من :

      كود:
      select ename , sal , deptno
      
      from emp 
      
      where deptno=&d1;
      الى الشكل النهائي :
      كود:
      select ename , sal , deptno
      
      from emp 
      
      where deptno=10 ;
      هل فهمت الان ؟؟ ثم ينفذ الجملة كما هي ...

      هيا لنعقد الموضوع قليلا !!
      كود:
      select ename , sal , deptno
      
      from emp 
      
      where deptno=&d1
      
      and sal>(select max(sal) from emp group by deptno having deptno=&d2);
      الان هل يتأكد الأوراكل ما اذا كانت الجملة صحيحة او لا ؟؟ طبعا لا !!

      اول ما يفكر فيه .. هو المتغيرات !! هل بها قيم او لا !!

      اذا لم يجد قيم .. يقول لك "اعطي قيمة لـفلان من المتغيرات :"

      هيا لننفذ البرنامج , وهو عرض كل من راتبه اكبر من (اكبر راتب ) في قسم انا اختاره (
      d2) ... وفي قسم معين انا ايضا اختاره !! (d1)



      كود:
      Enter value for d1: 10
      لقد كتبت عشرة في المتغير الاول ...
      كود:
      Enter value for d2: 20
      كتبت عشرين في المتغير الثاني ...

      والان سوف تحول الأوراكل هذه المتغيرين الى قيم ... يعني ماذا ؟ يعني أي متغير يسمي نفسه
      d1 ضع بداله القيمة 10 , و أي متغير يسمي نفسه d2 , نضع بداله القيمة 20 ....

      انظر الى الجملة بعد التنقيح :

      كود:
      select ename , sal , deptno
      
      from emp 
      
      where deptno=10
      
      and sal>(select max(sal) from emp group by deptno having deptno=20);
      خلاص .. سوف ينفذها كما هي .... ويعرض النتائج ... وانتبه لعلامة & وتعني ان الاسم الذي بعدها متغير ,

      سمي ما شئت ,
      d1 , d1000 , deptno_of_emp ,

      أي اسم تريده ..

      مثلا تريد ان يكون المتغير :
      deptno_10 به قيمة دائمة , وتريد ان تستخدمها كثيرا ..

      مثلا به القيمة 10 .... ولا تريد تغيير القيمة بداخله ... انظر المثالين :

      كود:
      SQL> select deptno , ename 
      
      2 from emp 
      
      3 where deptno=&&deptno_10;
      
      
      
       
      
      Enter value for deptno_10: 10
      
      
      
      DEPTNO ENAME
      
      ---------- ----------
      
      10 CLARK
      
      10 KING
      
      10 MILLER
      الان المتغير به 10 , ولن يسألك ثانية هل تريد ان تضع به قيمة او لا ...

      والسبب اننا وضعنا علامتي && , هيا لنستخدمه مرة ثانية
      كود:
      SQL> select ename from emp where deptno=&deptno_10;
      
      
      
      ENAME
      
      ----------
      
      CLARK
      
      KING
      
      MILLER
      اوتوماتيكي سوف يعرف ان المتغير
      deptno_10 به العدد عشرة , مع العلم انها علامة واحدة & في مثالنا الاخير .

      وسواء علامة او علامتين , فهو مخزن به الرقم عشرة ....

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

      كود:
      SQL> select ename from emp
      
      2 where job='&select_job';
      
      Enter value for select_job: ANALYST
      
      
      
      ENAME
      
      ----------
      
      SCOTT
      
      FORD
      المتغيرات ايضا في الشروط وفي الترتيب وفي اجزاء اخرى في جملة الاستعلام :
      كود:
      select ename , sal 
      
      from &any_table
      
      where &any_condition
      
      or &any_condition_2
      
      order by &any_order ;
      وعند التنفيذ انظر ماذا كتبنا :
      كود:
      SQL> select ename , &col_name
      
      2 from &any_table
      
      3 where &any_condition
      
      4 or &any_condition_2
      
      5 order by &any_order ;
      
      Enter value for col_name: sal
      
      Enter value for any_table: emp
      
      Enter value for any_condition: sal>2000
      
      Enter value for any_condition_2: sal<1000
      
      Enter value for any_order: sal
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      SMITH 800
      
      JAMES 950
      
      CLARK 2450
      
      BLAKE 2850
      
      JONES 2975
      
      SCOTT 3000
      
      FORD 3000
      
      KING 5000
      مسلية هاه ^^ ..... كل ما عمله الأوراكل هو استدبل القيم التي ادخلناها .. لتصبح الجملة كما يلي :
      كود:
      select ename , sal 
      
      from emp
      
      where sal>2000
      
      or sal<1000
      
      order by sal ;
      هذه الفكرة ..

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

      بقي جملتين تدعيان
      define و Accept ,, نفس الفكرة للمتغيرات ولا اخفيك مدى غبائهما , لذا لو اردتهما ابحث عنهما او راسلني .



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

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

      - عرض التقارير :













      تخيل شكل هذا التقرير (الصورة 1300)














      هل تريد حينما تكتب الامر :






      كود:
       
      Select * from emp ;




      على سبيل المثال ,, ويظهر لك شكل تقرير ومرتب كصفحة بطريقة منظمة ؟؟


      الان اعلمك شيء للعرض والتسلية فقط , اكتب الجمل التالية كما هي : وسوف اشرح معنى كل جملة منها ...

      وتذكر ان الهدف من هذه الأوامر هي الاعداد !! ,,, اعداد ماذا ؟ اعداد الصفحة لكي تبدو وكأنها تقرير وبشكل كما في الصورة السابقة !! , أي انك اذا اعددت الصفحة , ثم عملت أي استفسار .. فسوف تعرض كما اعددتها ...

      لا تنسى هدفنا .... الا وهو اعداد الصفحة ...





      كود:
       
      set pagesize 37




      يقول : اضبط حجم الصفحة يساوي 37 , أي 37 سطر للصفحة الواحدة ... وسترى ما معناها .






      كود:
       
      set linesize 60




      يقول : اضبط طول السطر الواحد ... كم حرف ؟ 60 حرف ... وانا من قبل كنت اضع 10000 حرف , لكي تعرض الاستفسارات كما اريد ...






      كود:
       
      set feedback off




      اضبط عرض عدد الصفوف للاغلاق .. هل تذكر حينما نكتب جملة استفسار , يعرض لنا عدد الصفوف في اخر العرض ؟ أي يعرض مثلا :
      no row selected .. او يقول : 6 rows selected هل تذكرها ؟


      اذا قلنا
      set feedback off , يعني لا تعرض هذه الرسالة .. اذا قلنا set feedback on فمعناه اعرض الرسالة تلك











      كود:
       
      ttitle 'employee|report|^^'


      عنوان الصفحة .. الذي يأتي في رأس الصفحة .. فوق في المنتصف ....


      وضعت رسالة غريبة نوع ما ... لقد كتبت
      employee ثم علامة | والتي تعني السطر التالي ... ثم كتبت report ثم كتبت العلامة | أي السطر التالي . ثم ^^

      انظر الصورة السابقة 1300 .... وسوف تفهم قصدي ....






      كود:
       
      btitle 'confidential'




      العنوان الذي يأتي في اسفل الصفحة ..... اكتب ماشئت , مع العلم ان العلامة | تعني السطر التالي ...






      كود:
       
      break on job




      هذه تعمل تصنيف .... تصنيف على حسب عمود المهنة.... انظر الصورة السابقة ... سوف ترى ان النتائج مقسمة على حسب عمود المهنة ... ولاحظ عدم تكرار المهنات .... لو اردنا على حسب رقم القسم ؟ ماذا نكتب ؟؟ نفس الشيء .. نكتب
      break on deptno





      كود:
       
      column job heading 'job|actegory' format a15


      امر
      column الذي يضبط الاعمدة .. فهنا يقول ... اضبط كل عمود يدعى بـ "مهنة" و اجعل عنوانه (عنوان العمود) يساوي الجملة 'job|actegory' ولاحظ العلامة | أي السطر التالي .


      يوجد كلمة
      format أي شكل النتائج كيف ؟ قلنا له a15 أي ... ان حده 15 حرف ..

      انظر الصورة السابقة وانظر في عمود المهنة , كيف عرض , وكيف عرضنا العنوان الخاص به ....











      كود:
       
      column sal heading 'salary' format $99,999.99


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







      $99,999.99
      والتي قد اخذناها سابقا , وما معناها وما معنى $00,000,.00 صحيح ؟


      راجع درس الدوال الرقمية ....






      كود:
       
      column ename heading 'Employee' format a15




      خمسة عشر حرفا لكل عمود يدعى بـ
      ename و عنوانه يجب ان يكون Employee







      الان ..

















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






      كود:
       
      select job , sal , ename
       
      from emp 
       
      where sal>2500
       
      order by job;




      انظر الى الناتج ... مع العلم انني ضبطت ثلاث اعمدة وهي "المهنة" و "الرواتب" و "اسم الموظف" ,


      وعرضت هذه الثلاث اعمدة ... لاحظ انني قلت رتب على حسب المهنة , لأنني قلت سابقا "صنف على حسب المهنة"








      كود:
       
      page 1
       
      employee
       
      report
       
      ^^
       
       
       
      job
       
      actegory salary Employee
       
      --------------- ----------- ---------------
       
      ANALYST $3,000.00 SCOTT
       
      $3,000.00 FORD
       
      MANAGER $2,975.00 JONES
       
      $2,850.00 BLAKE
       
      PRESIDENT $5,000.00 KING
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
      confidential




      الان نجرب عمود لم نضبطه :






      كود:
       
      page 1
       
      employee
       
      report
       
      ^^
       
       
       
      job
       
      actegory salary Employee EMPNO
       
      --------------- ----------- --------------- ----------
       
      ANALYST $3,000.00 SCOTT 7788
       
      $3,000.00 FORD 7902
       
      MANAGER $2,975.00 JONES 7566
       
      $2,850.00 BLAKE 7698
       
      PRESIDENT $5,000.00 KING 7839
       
       
       
       
       
       
       
       
       
      confidential




      الان .. لنجرب حذف
      order by job







      هيا ....











      كود:
       
      select job , sal , ename , empno
       
      from emp 
       
      where sal>2500 ;
      كود:
       
      page 1
       
      employee
       
      report
       
      ^^
       
       
       
      job
       
      actegory salary Employee EMPNO
       
      --------------- ----------- --------------- ----------
       
      MANAGER $2,975.00 JONES 7566
       
      $2,850.00 BLAKE 7698
       
      ANALYST $3,000.00 SCOTT 7788
       
      PRESIDENT $5,000.00 KING 7839
       
      ANALYST $3,000.00 FORD 7902
       
       
       
       
       
       
       
       
       
       
       
      confidential


      هل شاهدت تكرار بعض المهن ؟ لانها غير مرتبة ..


      اذن ... تصنف على حسب العمود الذي ترغبه باستخدام
      break on ثم في جملة الاستفسار تكتب order by لنفس العمود المصنف به . ونقصد بالتصنيف أي الترتيب والتقسيم , وهي للعرض فقط ...




      التعديل الأخير تم بواسطة The Coder ; 21-02-2006 الساعة 12:29 AM

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

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

      طيب .. لو عندنا عمود به بيانات خالية ولا نريدها ان تظهر خالية بل بدلا عنها رسالة ... انظر الجملة :
      كود:
      SQL> column mgr format 999999999 null 'no manager'
      انظر الى الصورة السابقة .. وسترى ان احدهم كان يملك قيمة خالية ولكنها استدبلت بالرسالة
      no manager

      ولاحظ اننا قلنا 9999999999 .... لماذا ياترى ..

      جرب وضع اقل من هذه ... ضع خمس تسعات وانظر مالذي يحدث ....

      الان .. انا فعلا نسيت كم جعلت طول عرض العمود رواتب .. كيف اعرف ؟ اها انظر :
      كود:
      SQL> column sal 
      
      
      
      COLUMN sal ON
      
      HEADING 'salary'
      
      FORMAT $99,999.99
      فقط
      column ثم العمود الذي ترغب ...

      عرض لك ثلاث نتائج ... الاولى انه مرئي او لا .... وهو مرئي
      ON

      الثانية العنوان ... وهو
      salary

      الثالثة الشكل الخاص به .. كما تشاهد ...

      الان اريد احذف هذا الضبط على عمود
      job .... كيف ؟ انظر

      كود:
      SQL> column sal clear
      الان تأكد انه حذف ضبط العمود
      job ولا تنسى ما نعنيه بالضبط .. وهو ضبط العرض ليس الا ...

      كود:
      SQL> column sal
      
      SP2-0046: COLUMN 'sal' not defined
      خطأ ... يقول انه لا يوجد له ضبط ...

      طيب ... انا لا اريد أي ضبط على كل الاعمدة ... ماهو الامر ؟ اليك الامر
      :

      كود:
      SQL> clear column
      
      columns cleared
      
      SQL> column ename 
      
      SP2-0046: COLUMN 'ename' not defined
      اول سطر ... قلنا امسح الضبط على كل الاعمدة ... وفي السطر الثاني قال حاضر .. تم المسح

      السطر الثالث قلت اعرض لي ضبط العمود
      ename

      وفي السطر الرابع يقول ... لا يوجد ضبط ...... هذا كل شيء ...

      قد تلاحظ انني اشرح من دون نفس .... لان البرنامج اصلا ليس لغرض العرض الجميل والتقارير الجميلة ..

      بل لاغراض التجريب , وله مأرب اخرى ,,,

      فبرنامج
      sql pluse ضعيف جدا من ناحية العرض , والتعامل والتحرير ... لذا انا لا اهتم لبرنامج SQL plus, بل اهتم لنفس SQL ومفاهيمه ...

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


      الان اتينا الى ما هو مهم جدا ....

      الاوبجيكت .. هل تذكره ...
      Object

      أي ملف موجود على القرص الصلب ... يسمى عادة بـ اوبجيكت .

      يعني حينما نأخذ البيانات من اوبجيكت , هي اخذ البيانات من ملف في القرص الصلب (ذاكرة دائمة).

      الان ماهي انواع الاوبجيكت في الأوراكل ... عذرا لكلمة اوبجيكت ... فمعناها بالعربي "شيء" ولها معنى اخر وهو "غرض" , معنى ثالث "جسم" .....

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


      الان انواع الاوبجيكت هي :

      - الجداول
      tables.

      - المناظر
      views

      - السلسلة
      sequences

      - الادلة
      index

      - المرادفات
      synonym



      لا تكرهني بسبب التسميات .....

      1- الجداول
      tables.

      نعرف هذا الاوبجيكت جيدا .... نحن تعاملنا معه على مر عصور من دروسنا ... ولا يسعني ان اذكر لك غير انه ملف موجود على القرص , به البيانات نفسها ....
      2- المناظر
      views

      هذه مالم نتكلم عنه ... وهي المناظر ... اعرف ان الترجمة هي الاخرى سيئة للغاية ولكن اسف ... فلنسميها في منهجي المناظر ... المنظر ....

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

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

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

      المناظر فكرتها انك تريد ان تعرض جدول الموظفين + اسماء الأقسام ... يعني كما يلي :
      كود:
      SQL> select e.ename ,d.dname 
      
      2 from emp e , dept d 
      
      3 where e.deptno = d.deptno
      
      4 and e.sal>2900;
      
      
      
      ENAME DNAME
      
      ---------- --------------
      
      KING ACCOUNTING
      
      JONES RESEARCH
      
      FORD RESEARCH
      
      SCOTT RESEARCH
      الان ... انا كتبت الجملة ... ثم نفذتها ...

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

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

      في اليوم الالف وخمس مئة و سبعة واربعون .. اردت نفس الاستفسار ولكن بشرط رابع
      ....

      ماذا اعمل ؟؟ هه بسيطة .. اكتب جملة الاستعلام نفسها ..... ويظهر لي الناتج ... مع تغيير ما يلزم ...

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

      وانا ارغب في عرضها مئة مرة في اليوم .. وطبعا مع تغيير بعض الامور البسيطة ..

      بالله عليك اجلس كما انا عليه ؟؟ او اجعل هذا الاستفسار في جدول جديد ؟؟ مارأيك نعمل جدول له ونخلص .... ويصير اقول
      Select * from this_table ;
      طيب ... يوجد لدي انا عشر جداول اضافية غير الجداول الرئيسية
      .. ويوجد لدى الموظف الاخر عشرون ...

      ويوجد في الشركة الف موظف .... يعني يوجد عشرات الالاف من الجداول التي من الممكن ان تؤثر على كفاءة النظام ...

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

      من الغباء جدا ان نعمل جداول مكررة .... وهذا رأيي انا !

      الحل هي المناظر ,,, تخيل معي ان المنظر هو ليس الا صورة ... ولا شيء غير الصورة ....

      صورة من ماذا ؟؟ من الجداول ...

      هل ننسخ الجداول ؟؟ لا لا ننسخ الجداول
      .. مجرد ملف صغير جدا يشير الى الجداول التي نريدها !!

      ماهي الفكرة اذن ؟ وكيف نعمل المنظر ؟ انظر الامثلة ....

      مثلا اريد ان اكون منظر .. لموظفي القسم 30 !

      يعني بالعقل البيانات لموظفي القسم 30 موجودة في جدول الموظفين .. لماذا اعمل جدول اخر ويصير تكرار ؟

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

      كود:
      SQL> create view emp_30
      
      as select ename , deptno , sal 
      
      from emp 
      
      where deptno=30 ;
      
      
      
      View created.
      كيف نستعلم من المنظر هذا ؟ عادي جدا ... كالجداول تماما !! :
      كود:
      SQL> select * from emp_30 ;
      
      
      
      ENAME DEPTNO SAL
      
      ---------- ---------- ----------
      
      ALLEN 30 1600
      
      WARD 30 1250
      
      MARTIN 30 1250
      
      BLAKE 30 2850
      
      TURNER 30 1500
      
      JAMES 30 950
      
      
      
      6 rows selected.
      طيب .... بالله عليك لو عملنا جدول ما بيكون نفس الشيء ؟

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

      هنا سوف اعرض لك الفرق .... سوف يرى الأوراكل انك تريد عمل منظر ...

      سوف لن يعمل ملف جديد ويضع فيه البيانات الخاصة بالموظفين !! لا ...

      بل سوف يعمل ملف صغير جدا ... وبه جملة الاستفسار فقط !!

      ما هي جملة الاستفسار في مثالنا ؟

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

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

      انها هذه :
      كود:
      select ename , deptno , sal 
      
      from emp 
      
      where deptno=30 ;
      التي عملنا المنظر منها !! سوف يخزنها في ملف لا يتعدى الواحد كيلو بايت ..

      ثم تأتي انت وتقول .. يا أوراكل ... اريد ناتج الاستفسار التالي :
      كود:
      select * from emp_30 ;
      يقول لك اوراكل : " لحظة ... "

      يذهب ويبحث عن جدول يدعى بـ
      emp_30

      لا يجد متهم بهذا الاسم ... يقول الأوراكل في نفسه "ممممم لا يوجد جدول ... اكيد هذا منظر !!"

      يأتي الى الملف الصغير الذي انشأه اول مرة .... يرى واذا باسم المنظر
      emp_30

      يقول له .. تعال يا ايها المنظر ....

      ثم يفتح الملف ... ماذا يجد فيه ؟؟ يجد فيه رسالة مكتوب فيها :
      كود:
      select ename , deptno , sal 
      
      from emp 
      
      where deptno=30 ;
      يقول الأوراكل .... حسنا ...

      يذهب ويطبق الاستفسار .... أي يذهب الى جدول الموظفين ... ويحمله على الذاكرة المؤقته ... ثم يختار الصفوف التي رقم القسم فيها ... يساوي 30 !!

      ثم يعرض لنا الناتج ....

      يعرضه وكأنه هو الجدول !!

      الان نحذف هذا المنظر ... انظر كيف نحذفه :
      كود:
      SQL> drop view emp_30 ;
      
      
      
      View dropped.
      ياسلام .. نفس فكرة الجدول ....

      الان .... سوف اريك عيوبه .. او بالاصح اثاره الجانبية ... الا وهي التعديل فيه ..

      اذا عدلت فيه .. فأنت لا تعدل في بيانات المنظر .. بل في الجدول الذي يستمد المنظر منه !
      !

      لم تفهم .... طيب .. سوف نرى :
      كود:
      create table emp_30 as
      
      select ename , sal from emp
      
      where deptno=30;
      نعمل جدول .. وليس منظر .... الان الجدول الذي اسمه
      emp_30 به بيانات حقيقية ... وموجودة بالقرص الصلب !

      هل هي نفسها الموجودة بجدول
      emp ؟؟ لا لا .... هل تصدق ؟؟ الا زلت غير مصدق ؟ هيا لنتأكد ...


      كود:
      SQL> select * from emp_30 ;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      ALLEN 1600
      
      WARD 1250
      
      MARTIN 1250
      
      BLAKE 2850
      
      TURNER 1500
      
      JAMES 950
      ما رأيك ان نعدل في الجدول ؟ هيا لنعدل ونرى هل تتعدل البيانات ايضا في جدول الموظفين
      emp ؟؟

      لنرى .....

      كود:
      update emp_30 set sal=9999
      
      where ename ='JAMES';
      لا تفرح يا
      JAMES .... لم نرقيك ولكن .. نجري بعض التجارب ..

      هيا لنعرض المعلومات من الجدولين .. ونرى هل تغيرت في الجدولين ؟ انظر :

      كود:
      SQL> select ename , sal from emp_30;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      ALLEN 1600
      
      WARD 1250
      
      MARTIN 1250
      
      BLAKE 2850
      
      TURNER 1500
      
      JAMES 9999
      
      
      
      6 rows selected.
      
      
      
      SQL> select ename , sal from emp ;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      SMITH 800
      
      ALLEN 1600
      
      WARD 1250
      
      JONES 2975
      
      MARTIN 1250
      
      BLAKE 2850
      
      CLARK 2450
      
      SCOTT 3000
      
      KING 5000
      
      TURNER 1500
      
      ADAMS 1100
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      JAMES 950
      
      FORD 3000
      
      MILLER 1300
      
      
      
      14 rows selected.
      هل تعدلت في جدول الموظفين الاصلي ؟ طبعا لا ... لماذا ؟ لان كل جدول منهما مستقل عن الاخر !!

      كل ما فعلناه هو نسخنا ووضعنا نسخة جديدة في جدول الموظفين
      emp_30

      هذا كل شيء ...

      الان لنعمل منظر من الجدول
      emp_30 .. وليكن نفس المعلومات ...

      كود:
      create view view_30
      
      as select * from emp_30;
      الان يسمى الجدول
      emp_30 بالنسبة للمنظر view_30 الجدول الاساس ...

      أي الجدول الذي يستمد المنظر منه الطاقة ... يستمد البيانات .... هل فهمت ؟ اسف على غبائي ... تركت المنظر هو نفس الجدول !! ... المفترض ان المنظر يكون ذو استفسار اعقد واعقد من هذا الاستفسار .... لكي تكمن فائدته !!


      كود:
      SQL> select * from emp_30;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      ALLEN 1600
      
      WARD 1250
      
      MARTIN 1250
      
      BLAKE 2850
      
      TURNER 1500
      
      JAMES 9999
      
      
      
      6 rows selected.
      
      
      
      SQL> select * from view_30;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      ALLEN 1600
      
      WARD 1250
      
      MARTIN 1250
      
      BLAKE 2850
      
      TURNER 1500
      
      JAMES 9999
      
      
      
      6 rows selected.
      هل شاهدت انه صورة منه ؟


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

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

      الان لو عدلنا في الجدول الاساس .. هل سيؤثر في المنظر ؟؟؟

      لنرى ذلك ... هيا لنغير اسم
      BLAKE الى ABC ... طبعا من الجدول الاساس وليس المنظر ....




      كود:
      update emp_30 set ename='ABC'
      
      where ename='BLAKE';

      كود:
      SQL> select * from emp_30;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      ALLEN 1600
      
      WARD 1250
      
      MARTIN 1250
      
      ABC 2850
      
      TURNER 1500
      
      JAMES 9999
      
      
      
      6 rows selected.
      
      
      
      SQL> select * from view_30;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      ALLEN 1600
      
      WARD 1250
      
      MARTIN 1250
      
      ABC 2850
      
      TURNER 1500
      
      JAMES 9999
      
      
      
      6 rows selected.
      ممممم .. واضح ان التغيير حصل ايضا في المنظر ... المنظر ليس الا شارة ...
      reference

      أي شيء يشير الى جدول ما !

      الان دعنا نعدل في المنظر ...لنغير كل من راتبه فوق 1250 الى اسم
      XYZ

      هيا لنغير في المنظر . وليس الجدول !!
      كود:
      update view_30 set ename='XYZ'
      
      where sal>1250;
      هيا هيا لنرى النتيجة ...
      كود:
      SQL> select * from emp_30;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      XYZ 1600
      
      WARD 1250
      
      MARTIN 1250
      
      XYZ 2850
      
      XYZ 1500
      
      XYZ 9999
      
      
      
      6 rows selected.
      
      
      
      SQL> select * from view_30;
      
      
      
      ENAME SAL
      
      ---------- ----------
      
      XYZ 1600
      
      WARD 1250
      
      MARTIN 1250
      
      XYZ 2850
      
      XYZ 1500
      
      XYZ 9999
      
      
      
      6 rows selected.
      غير معقول ... لقد تغيرت ايضا البيانات في الجدول !!

      طيب ... صراحة التعديل في المنظر او الحذف بواسطة المنظر ... شيء غير مستحب ... او غير عملي ... او انه مخيف نوعا ما .. واضافة البيانات ايضا اليه ... من الممكن في كثير من الاحيان غير منطقي !! لماذا ؟

      لانه يؤدي الى كسر قواعد واساسيات السيد كود !! كيف ذلك ؟؟ انظر الى الامثلة
      كود:
      create view temp
      
      as select ename , sal , deptno 
      
      from emp 
      
      where sal > 1100 ;
      عملنا منظر من جدول الموظفين
      emp ... أي ان الجدول الاساس الخاص بالمنظر temp هو الجدول emp

      الان لنضيف أي بيانات الى المنظر ...

      كود:
      SQL> select * from temp ;
      
      
      
      ENAME SAL DEPTNO
      
      ---------- ---------- ----------
      
      ALLEN 1600 30
      
      WARD 1250 30
      
      JONES 2975 20
      
      MARTIN 1250 30
      
      BLAKE 2850 30
      
      CLARK 2450 10
      
      SCOTT 3000 20
      
      KING 5000 10
      
      TURNER 1500 30
      
      FORD 3000 20
      
      MILLER 1300 10
      الان نضيف
      ...

      كود:
      SQL> insert into temp values ('A',1250,30);
      
      
      
       
      
       
      
       
      
      ERROR at line 1:
      
      ORA-01400: cannot insert NULL into ("SCOTT"."EMP"."EMPNO")
      يوجد خطأ ... لندرسه ..

      يقول .. انت لم تضف بيانات الى العمود رقم الموظفين ... والذي يعتبر مفتاح أساسي لجدول
      emp ..

      في الحقيقة حينما اقول انني سوف اضيف الى المنظر ... أين تذهب الاضافة ؟؟ في المنظر ؟؟ لا طبعا

      المنظر ليس الا ملف به استفسار فقط !!

      اذا اضفنا الى المنظر .. فسوف تضاف البيانات اوتوماتيكيا الى الجدول الاساس .... صح ؟

      طيب ... المنظر به الاعمدة التالية :
      كود:
      SQL> select * from temp;
      
      
      
      ENAME SAL DEPTNO
      
      ---------- ---------- ----------
      
      ALLEN 1600 30
      
      WARD 1250 30
      
      JONES 2975 20
      
      MARTIN 1250 30
      
      BLAKE 2850 30
      
      CLARK 2450 10
      
      SCOTT 3000 20
      
      KING 5000 10
      
      TURNER 1500 30
      
      FORD 3000 20
      
      MILLER 1300 10
      أي ان به اسم الموظف , الراتب , رقم القسم ...

      حينما نقول ... اضف المعلومات الى المنظر .. فسوف ينفذ الأوراكل ما يلي :

      - يأتي وينظر الى جملة الاضافة التي كتبناها للتو ... يجد انه لا يوجد جدول باسم
      temp

      - يبحث عن المناظر .. هل يوجد منظر بهذا الاسم ؟
      نعم !!

      - يرى الاستفسار الذي بداخله ... ويجد الجدول
      emp هو الجدول الاساس .....

      -
      سوف يضيف اوتوماتيكيا الى المنظر ؟؟؟ لا الى الجدول الاساس ... وهو جدول الموظفين ..

      -
      يريد ان يضيف اسم A والراتب 1250 ورقم القسم 30 .. فقط

      -
      يقوم بالتنفيذ ... ويجد انه لم يضف الى العمود رقم الموظفين شيء !! أي انه اضاف قيمة خالية! وهو مفتاح لا يقبل الخالي ولا يقبل التكرار !!

      -
      يصدر الخطأ السابق ...


      هذا ما حدث بالفعل ... ولن تجد كتاب يعلمك مالذي حدث ... فانتبه جيدا لهذه المعلومات .... والتي بإمكانك استنتاجها اصلا !

      الان رأينا ان الاضافة .. الحذف .. والتعديل في المناظرغير عملية .. ولها مشاكل جمة ...

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

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

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

      الان ما هي انواع المناظر ؟ لا تخف .. مجرد تسميات ..

      منظر معقد .... ومنظر بسيط ..

      المنظر المعقد يستمد بياناته من اكثر من جدول .... بينما البسيط من جدول واحد

      في جملة استفسار المنظر المعقد يوجد دوال و ايضا يوجد بيانات مقسمة من قبل
      group by

      بينما البسيط لا يحتوي عليها .

      المنظر المعقد لا يمكننا ان نعمل أي من اوامر الـ
      DML من حذف وتعديل واضافة في الغالب !! .. بلغة اخرى نادرا ما نستطيع ....بينما المنظر البسيط في الغالب نستطيع ذلك ...


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

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

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