صفحة 8 من 12 الأولىالأولى ... 3456789101112 الأخيرةالأخيرة
النتائج 106 إلى 120 من 169

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

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

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

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

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

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

    اريد عرض رقم القسم , و اصغر راتب لكل قسم , شريطة ان اصغر راتب
    يكون اكبر من اصغر راتب بالقسم 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

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

    اليك امثلة على
    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

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




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

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

    طبعا عرضت النتيجة لكل من اسمه
    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

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


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

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

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

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

    انظر الصورة .... (الصورة 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

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










    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

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

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

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

    جدول موظفين عاملين
    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

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

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

    الدرس الثالث عشر
    اسم الدرس
    : جملة الاستعلام 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

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

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

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

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

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

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













    تخيل شكل هذا التقرير (الصورة 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

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

    طيب .. لو عندنا عمود به بيانات خالية ولا نريدها ان تظهر خالية بل بدلا عنها رسالة ... انظر الجملة :
    كود:
    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

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

    انها هذه :
    كود:
    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

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

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

    لنرى ذلك ... هيا لنغير اسم
    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 الأخيرةالأخيرة

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

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