اذهب إلى المحتوى
programmer_85

دورة تشمل اهم موضوعات Sql في 19 درس

Recommended Posts

programmer_85

الدرس السادس


في الاصل هذا الدرس يتبع الدرس السابق outer join حيث نرى اليوم في الدرس ماهي العيوب في outer join بقسيمه left,right ....

العيب الاول : لايمكن ان نتسخدم المعامل (+) معا اي في مرحلة الــ left ,right

ان المعامل (+) لايمكن ان يعمل سويا في كلا المرحلتين مثل الاتي ..

where e.deptno(+)=d.deptno(+);



اذا نفذت هذا الكود الاتي سوف تظهر لك هذا الخطأ والمسمى


ORA-01468: a predicates may reference only one outer-joined table


العيب الثاني : لايمكن ان نتسخدم المعامل in مع المعامل (+) معا في نفس الوقت

عند تنفيذك مثلا لهذا الكيوري الذي يحتوي على ename,job,sal,deptno,dname,loc لكي نعرض

الموظفين الذي يعملون في الدوائر 10 و20 .. سوف يكون الكيوري كالاتي :::

select ename,job,sal,e.deptno,dname,loc from emp e,dept d
where e.deptno(+) in (20,10);




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



ORA-01719: outer join operator (+) not allowed in operand of OR or IN



العيب الثالث : لايمكن ايضا ان نتسخدم المعامل or والمعامل (+) معا في نفس الوقت

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

[b]select ename,job,sal,e.deptno,dname,loc from emp e,dept d
where e.deptno(+)=d.deptno or e.deptno=10;[/b]



الخطا هو نفس الخطا الذي موجود في المعامل in


ملاحظة

يمكن ان نتسخدم المعامل and مع المعامل (+) في نفس الكيوري وهو لا اشكال فيه ..

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

select empno,ename,job,sal,dname,loc from emp e ,dept d
 where e.deptno=d.deptno(+) and job ='CLERK';




سوف تكون المخرجات بهذا الشكل ..




EMPNO ENAME JOB SAL DNAME LOC
------- ---------- --------- ---------- -------------- -------------
7934 MILLER CLERK 1300 ACCOUNTING NEW YORK
7876 ADAMS CLERK 1100 RESEARCH DALLAS
7369 SMITH CLERK 800 RESEARCH DALLAS
7900 JAMES CLERK 950 SALES CHICAGO




وبهذا يعتبر اننا قد اكلمنا الجزء الاول من الجوين بكل انواعه ..
يعتبر هذا الجوين بانه يعمل على كل اصدرات الاوراكل ماعدا 9i ..

اذا في القسم الاخر سوف نرى الجزء الثاني من الجوين وهو في الاصل نفس هذا الجوين
الا انه يختلف فقط بانه يكون عمله فقط على keywords بدلا من operations الذي يعمل على الاصدرات الاخرى من اوراكل ..

اراكم ان شاء الله في الدرس القادم ..
  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
wael topar

هو ان الjoin مينفعش مع in ده شئ منطقى مفهوم
وانه ينفع مع and شئ منطقى مفهوم برده
لاكن
مع or لأ
انا مش فاهمها
examb
انا ممكن فى مثال اكتب الشرط ده;where comm is null or comm is not null,

شارك هذه المشاركة


رابط المشاركة
شارك
wael topar

هو ان الjoin مينفعش مع in ده شئ منطقى مفهوم
وانه ينفع مع and شئ منطقى مفهوم برده
لاكن
مع or لأ
انا مش فاهمها
examb
انا ممكن فى مثال اكتب الشرط ده;where comm is null or comm is not null,

ارجو الرد ياباشا

شارك هذه المشاركة


رابط المشاركة
شارك
programmer_85

لايمكن ابدا ان تستخدم or بعد شرط الجوين وليس بعد شرط الفلترة حووووول ان تفرق بين الاثنان

في حالة كتبت شرط الجوين مثل

where .e.deptno(+)=d.deptno or job ='CLERK';

فسوف يعطيك خطأ

ولا اقصد ان شرط الفلترة فرق بين الاثنان ..

ارجو ان تكون قد وصلت الفكرة

شارك هذه المشاركة


رابط المشاركة
شارك
programmer_85

الدرس السابع



اكملنا البارحة كل انواع الجوين المتعلقة بالعمليات operations سوف نرى اليوم ان شاء الله النوع الثاني من الجوين وهو ANSI JOIN..

ماهو ANSI JOIN؟؟

ان هذا الجوين يسمى غالبا بالـــ ORACLE 9I JOIN لانه النوع الاول من الجوين لايمكن ان يعمل على هذا الاصدار 9I .

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

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


ماهي انواع ANSI JOIN؟؟

يحتوي هذا الجوين على خمسه انواع وهي كالتالي:

1-Natural join

2- cross join

3-join .....using clause

4- join .....on clause

5- outer join

وسوف نرى كل واحد منها في درس خاص به ..

سوف نتكلم في هذا الدرس على النوع الاول منها وهو natural join..



ماهو natural join؟؟

انه مشابه ومماثل للــــ equi join (راجع الدرس الاول )

للعمل على هذا الجوين لابد ان يتوفر هناك عمودان على الاقل مشتركان في الاسم وفي نوع البيانات (datatypes)..( نفس فكرة equi join )

اذا استنتجنا من هذا النوع انع في الاصل نفس equi join ولايختلف فقط الا في ان هذا النوع بدل من ان نكتب العملية مثل (=) يجب ان نكتب كلمة محجوزة بدلا عن العملية.

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

للجابة على هذا السؤال بان العمليات في الاصل لاتعمل على الاصدار 9i وانما يعمل عليها الكلمات المحجوزة (سنرى في الامثلة ماهي الكلمات المحجوزة)

واما هذا النوع من الجوين فهو خصص للـــ 9i ... لكن تستطيع ان تنفذ هذا الجوين على اي اصدار .. لكن جوين العمليات لايتم تنفيذه على 9i .

اذا سو ناخذ بعض الامثلة لتوضح لنا اكثر تفسيرا ..

المثال الاول :

اكتب كيوري يقوم بعرض كل الموظفين الذي يعملون في كل الاقسام مبينا رقم القسم واسمه معتمدا في ذلك على natural join
لحل هذا المثال .

select empno,ename,job,sal,deptno ,dname from emp natural join dept;



سوف نحلل الان فقط مايمسى بشرط الجوين ..

[b]emp natural join dept[/b]



اذا هذا هو شرط الجوين او مايمسى بــــــــــــ keywords الكلمات المحجوزة .

في حين اننا عندما راينا سابقا كيف تتم ربط شرط الجوين في equi join كالاتي :

e.deptno=.d.deptno;



يقابل هذه الصيغة في هذا الجوين natural join هذة الصيغة

CODE]
emp natural join dept
[/code]

حيث تكتب الكلمات المحجوزة وهي natural join بين الجدولين المراد بهما الربط

سوف تكون المخرجات كالشكل الاتي :



EMPNO ENAME JOB SAL DEPTNO DNAME
------ ---------- --------- ------ ------ --------------
7782 CLARK MANAGER 2450 10 ACCOUNTING
7839 KING PRESIDENT 5000 10 ACCOUNTING
7934 MILLER CLERK 1300 10 ACCOUNTING
7566 JONES MANAGER 2975 20 RESEARCH
7902 FORD ANALYST 3000 20 RESEARCH
7876 ADAMS CLERK 1100 20 RESEARCH
7369 SMITH CLERK 800 20 RESEARCH
7788 SCOTT ANALYST 3000 20 RESEARCH
7521 WARD SALESMAN 1250 30 SALES
7844 TURNER SALESMAN 1500 30 SALES
7499 ALLEN SALESMAN 1600 30 SALES
7900 JAMES CLERK 950 30 SALES
7698 BLAKE MANAGER 2850 30 SALES
7654 MARTIN SALESMAN 1250 30 SALES




المثال الثاني :

اكتب كيوري يقوم بعرض بعض empno,ename,sal,job,dname,deptno

حيث يكون هولاء الموظفين يعملون في الدائرة 10 ووضيفته هي CLERK

select empno,ename,job,sal,deptno ,
dname from emp natural join dept where job='CLERK' AND DEPTNO=10;[/size][/b]
[b][size=5]



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

[b]where job='CLERK' AND DEPTNO=10[/b]



سوف تكون المخرجات بهذا الشكل للمثال الثاني :



EMPNO ENAME JOB SAL DEPTNO DNAME
------ ---------- --------- ------ ------ --------------
7934 MILLER CLERK 1300 10 ACCOUNTING
7369 SMITH CLERK 800 20 RESEARCH
7876 ADAMS CLERK 1100 20 RESEARCH
7900 JAMES CLERK 950 30 SALES




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

تمرين : اكتب كيوري يقوم بعرض الموظفين الذي لديهم COMM عمولة تفوق 1000 ويعملون في دائرة المبيعات SALES

وكذا رقم الدائرة مستخدما NATURAL JOIN في حلك لهذا المثال..


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

لاتنسوني من دعائكم .. بارك الله فيكم تم تعديل بواسطة programmer_85
  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
wael topar

اجابة التمرين ياباشا
,deptno
select e.ename,d.dname,e.comm
from emp e natural join dept d
where e.comm>1000 and
d.dname='SALES';

  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
تيسير نافع

سلام عليكم..جزاك الله خير ياباشمهندس على هذا العمل وفي ميزان حسناتك ان شاء الله
وأود الانضمام إليكم..

شارك هذه المشاركة


رابط المشاركة
شارك
programmer_85

الدرس الثامن



اكلمنا البارحة النوع الاول من انواع الجوين ansi join وهو natural join

في هذه الجلسة ان شاء الله سوف تناول النوع الثاني منها وهو join .....on clause وكيف يتم عمله ..


ماهو join .......on clause ؟؟

كما ذكرنا يوم امس في درس natural join بانه يختص بالاصدار 9i ويمكن ان نطبقه على اي اصدار ..

لكن نظرا لان العمليات operations لاتعمل اللي على الاصدارات من غير 9i (راجع درس البارحة)

اذا join .....on clause يتم تنفيذه على الكلمات المحجوزة keywords ..

فاذا كنت تستخدم الجوين على اكثر من عمود column من جدولين او اكثر فان تلك الاعمدة تزودنا وتدعمنا بان نستخدم join ...on clause ...

ويمكن ان نتسخدم المعامل and في حالة ربطنا باكثر من جدولين ... الخ


لنرى ماهي الصيغة العامة اولا للـــــــــ join......on clause .

يمكن ان تكتب الصيغة العامة للــ join ...on clause بهذا الشكل :



select .... from table1 inner join table2 on table1.col1=table2.col2
and table1.col1=table2.col2;


حيث ان الكمات المحجوزة في هذا الجوين هي inner join التي اتت قبل table1
وايضا on والتي اتت بعد table 1 وقبل table2 اي بينهما ..
ومن ثم نربط مالدينا ايضا من اكثر من عمود .

مثال على ذلك يوضح اكثر :

سوف نقوم بعرض empno,ename,job,grade من جدولين وهما emp,salgrade حيث يكون الشرط
المرتبط بينهما هو sal الاعلى منه او الاقل منه .. سوف يكون هذا الكيوري :

select empno,ename,job,grade from emp inner join [/size][/b]
[b][size=5]salgrade on sal between losal and hisal;[/size][/b]
[b][size=5]



وممكن تكتب الكود من دون inner مثل الكود التالي :

select empno,ename,job,grade from emp join [/size][/b]
[b][size=5]salgrade on sal between losal and hisal;[/size][/b]
[b][size=5]



كلا الحالتين صحيحة ..

اما عن المخرجات فسوف تكون كالاتي :




EMPNO ENAME JOB GRADE
------ ---------- --------- ------
7369 SMITH CLERK 1
7900 JAMES CLERK 1
7876 ADAMS CLERK 1
7521 WARD SALESMAN 2
7654 MARTIN SALESMAN 2
7934 MILLER CLERK 2
7844 TURNER SALESMAN 3
7499 ALLEN SALESMAN 3
7782 CLARK MANAGER 4
7698 BLAKE MANAGER 4
7566 JONES MANAGER 4
7788 SCOTT ANALYST 4
7902 FORD ANALYST 4
7839 KING PRESIDENT 5



في المصال السابق join....on clause يمثل non equi join

مثال اخر : حيث يمثل هنا join ...on clause الــــ equi join و non equi join معا مختلفا فقط في العمليات ..

قم بعرض empno,ename,job,grade ,dname,detpno من الجداول emp,dept,salgrade ..

select empno,ename,job,e.deptno,dname,grade from emp e
join dept d on e.deptno=d.deptno
join salgrade s on sal between losal and hisal;



حيث تم في هذا المثال ربط اكثر من join ....on clause حيث تم في الاول ربط هذا الجوين

emp e
join dept d on e.deptno=d.deptno



ومن ثم الجدول الثالث تم الربط كالاتي :

join salgrade s on sal between losal and hisal;




اما عن المخرجات فسوف تكون كالاتي :



EMPNO ENAME JOB DEPTNO DNAME GRADE
------ ---------- --------- ------ -------------- ------
7369 SMITH CLERK 20 RESEARCH 1
7900 JAMES CLERK 30 SALES 1
7876 ADAMS CLERK 20 RESEARCH 1
7521 WARD SALESMAN 30 SALES 2
7654 MARTIN SALESMAN 30 SALES 2
7934 MILLER CLERK 10 ACCOUNTING 2
7844 TURNER SALESMAN 30 SALES 3
7499 ALLEN SALESMAN 30 SALES 3
7782 CLARK MANAGER 10 ACCOUNTING 4
7698 BLAKE MANAGER 30 SALES 4
7566 JONES MANAGER 20 RESEARCH 4
7788 SCOTT ANALYST 20 RESEARCH 4
7902 FORD ANALYST 20 RESEARCH 4
7839 KING PRESIDENT 10 ACCOUNTING 5



ارجو ان تكون قد وصلت الفكرة بشكل واضح ..

تمرين : قم بعمل صياغة سؤال من عندك على مثل تلك الامثلة السابقة مستخدما فيها اكثر من ثلاث جداول مثلا واكثر من شرط للجوين .. تم تعديل بواسطة programmer_85
  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
wael topar

ياباشا حضرتك تسألنا واحنا نجاوب
دى المرحلة اللى احنا فيها
وشكراً

شارك هذه المشاركة


رابط المشاركة
شارك
wael topar

ياباشا حضرتك تسألنا واحنا نجاوب
دى المرحلة اللى احنا فيها
وشكراً

اخرى............يابشمهندس

شارك هذه المشاركة


رابط المشاركة
شارك
wael topar

معلشى ياباشا سؤال صغير بس مهم بالنسبة ليا
ان شاء الله حضرتك ناوى تكمل pl , forms

شارك هذه المشاركة


رابط المشاركة
شارك
programmer_85

الدرس التاسع




اليوم ان شاء الله في هذا الجلسة سوف تناول اهم موضوع في nsai join والذي هو outer join

وهو في الاصل يقابل outer join بقسيمة left ,right ...

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

ماهو outer join؟

ان outer join هو في الاصل نفس outer join الذي تم العمل عليه بواسطة الــعمليات operations

واليوم ان شاء الله سوف نرى كيف يتم عمله على keywords


حيث ينقسم outer join الى ثلاثة اقسام :


الاول منها : left outer
الثاني : right outer
الثالث: full outer

وسوف نرى كلا منهم على حده مع الامثلة وكيفية العمل .

اولا :left outer

لو رجعنا الى النوع الاول من الجوين ,وهو non ansi join كيف تم عمله وكيف راينا ذلك.

ان هذا النوع هو نفس النوع الاول ماعدا الاختلاف فقط ان ذالك الجوين يتم عمله على العمليات operations

اما هذا يكون عمله على keywords سوف نرى ذلك الان ان شا ءالله ..

لدينا هذا المثال :

select empno,ename,job,sal,dname from emp e[/size][/b]
[b][size="4"]left outer join dept d on e.deptno=d.deptno



حيث ان الكود المهم في هذا هو :


left outer join dept d on e.deptno=d.deptno


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

ثانيا : ماهو right outer

هو نفس الكود السابق فقط في تغيير كلمة left الى right لاغير

لدينا هالمثال :



select empno,ename,job,sal,dname from emp e[/size][/b]
[b][size="4"]right outer join dept d on e.deptno=d.deptno



حيث ان الكود المهم في هذا هو :


right outer join dept d on e.deptno=d.deptno


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


ثالثا: ماهو full outer


ان هذا الجوين يعتبر حلا للجوين السابق الذي ذكر في النوع الاول وهو non ansi join حيث

يعتبر ذالك الجوين وهو left او right لايمكن ان يعملا معا ..بالمعامل (+) في كلا الطرفين .


ففي هذا الجوين تم حل ذلك ..


لدينا المثال التالي يوضح اكثر :




select empno,ename,job,sal,dname from emp e[/size][/b]
[b][size="4"]full outer join dept d on e.deptno=d.deptno





full outer join dept d on e.deptno=d.deptno


حيث يقوم هذا الجوين بدمج left و right معا ..

اي ان اي صفوف لاتظهر في left وتظهر في right سوف يقوم باظهارها معا والعكس صحيح

اي سوف يقوم باظهار كلا من في left و right سويا ..

وهذا ماراينا سابقا ان لايمكن ان يتم المعامل (+) ,ويكتب معا في كلا الحالتين right و left ..


ارجو ان تكون قد وصلت الفكرة ..


تمرين : بقم بعرض كلا من ename ,job,sal ,deptno ,dname,grade لكل الموظفين من تلك الجداول .. ؛(اي ثلاثة جداول) فسر ذلك ..

شارك هذه المشاركة


رابط المشاركة
شارك
wael topar

select e.ename,e.job,e.sal,d.deptno,s.grade
from emp e full outer join dept d
on d.deptno=e.deptno
full outer join salgrade s
on e.sal between s.losal and s.hisal;

شارك هذه المشاركة


رابط المشاركة
شارك
wael topar

select e.ename,e.job,e.sal,d.deptno,s.grade
from emp e full outer join dept d
on d.deptno=e.deptno
full outer join salgrade s
on e.sal between s.losal and s.hisal;

استنتاج انه مثل inner join
صح؟
ربنا يجزيك كل الخير
بصراحة شرحك بيكمله تمرينك (جميل جداً)

شارك هذه المشاركة


رابط المشاركة
شارك
programmer_85

لا ليس مثله لانه هنا سواء في حالة left او right بصفوف لم تكن مربوطة يعين لايوجد جوين بينهم فيقوم بعرضها

وفقا لكل من left و right ( راجع الدرس outer join في القسم الاول من non ansi join لترى ذلك

وربنا يجزيك الف خير

شارك هذه المشاركة


رابط المشاركة
شارك
مستر سمعة

تابعت الدرس كاملاً وحللت تمارينه، وجزاك الله خيراً، وعَظَم لك الأجر

ووُجود مُشارَكات الأخ وائل أضفت نكهة على الدرس

وهذه أول مُشاركة في المنتدى، وبإذن الله ليست الأخيرة

شارك هذه المشاركة


رابط المشاركة
شارك
programmer_85

الدرس العاشر



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

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

النوع الاول منها : Cross join
النوع الثاني :self join
النوع الثالث: join...using class


النوع الاول : cross join :

في الاصل يهتبر هذا النوع مشابها للنوع Cartesian join ( راجع الدرس)

لدينا هذا المثال يبين كيفية عمل هذا الجوين :

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

select empno,ename,job,sal,dname,loc from emp cross join dept;



وهذه هي النقطة الت تهمنا وهي الشرط في المثال السابق

[/b][/size]
[size=1][b] emp cross join dept;[/b][/size]
[size=1][b]



حيث ستكون المخرجات (56=14*4) (راجع درس Cartesian)

في المثال التالي سوف نرى الان كيف يتم على 3 جداول

select empno,ename,job,sal,dname,grade from emp cross join dept cross join salgrade ;



حيث ان الشرط يربط بين اكثر من جدولين ..


emp cross join dept cross join salgrade ;



النوع الثاني :self join

هذا النوع يعتبر نفس نوع self join الذي في النوع الاول لكن فقط الاختلاف فيه ان هذا الجوين

يستخدم في عمله keywords الكلمات المحجوزة اما في ذاك الجوين فيستخدمه في عمله operations العمليات

لدينا هذا المثال يوضح اكثر:

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

select m.empno,e.ename,e.mgr from emp
e join emp m on m.empno=e.mgr;




حيث يعتبر هذا هو الشرط في المثال السابق

CODE]
emp
e join emp m on m.empno=e.mgr;
[/code]

النوع الثالث : using ....join clause

هذا النوع لايختلف كثيرا عن سابقيه ماعدا فقط يكتب نفس الـــ column مرة واحدة ولايكتب معاه اسمه الجدول مثلا alias ..
ايضا لايمكننا ان نتسخدم columns-alias في expression اي بعد جملة الــ select

لدينا هذا المثال يوضح اكثر :

select ename,job,sal, dname,deptno from emp e inner join dept d using (deptno);




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

emp e inner join dept d using (deptno





ارجو ان تكون قط وصلت هالفكرة بشكل واضح ومفهوم ..

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

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

تمرين: قم بعمل مراجعة لكل انواع الجوين السابقة تماما واعمل عليها اكثر من امثله حتى ترسخ جيدا (( لابد من المراجعة والممارسة والتدرب علي الجوين ))


اراكم ان شا ءالله في الدرس القادم ....

  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
wael topar

بس ايه رأيك يامستر سمعة
بس نكهه بــــ ايه؟
ماشى ياباشا

شارك هذه المشاركة


رابط المشاركة
شارك
programmer_85

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

هذا ملخص ماسندرسه في subquery ..

انواع subquery

هناك ثلاثة انواع وهم:

الاول : subquery base on usage

ولديه نوعان وهما :

normal subquery -1
2- correlated subquery


النوع الثاني هو: subquery base on execution ( المعتمد على كيفية التنفيذ)

ولديه اربعة انواع :

1- single col-single row

2- single col-multiple rows

3- multiple cols-single rows

4- multiple cols-multiple rows



النوع الثالث : nested subquery


حيث ان الــــــــــــ subquery يمكن ان يكتب كالاتي :


1- at where clause

2- at having clause

3- at from clause

4- as on expression (اي داخل جملة السيلكت نفسها)

5- under DML queries



وسوف نرى كل منهم على حده ان شاء الله بالتفصيل الممل

تم تعديل بواسطة programmer_85
  • أعجبني 1

شارك هذه المشاركة


رابط المشاركة
شارك
programmer_85

الدرس الحادي عشر



مقدمة :

ان الـــ subquery عبارة عن كيوري الذي يكتب داخل كيوري اخر لكي يشير ويربط على شكل شبكة من الكيوريات queries.

حيث ان هذا الكيوري subquerry يشير الى ان الكيوري الخارجي الذي يتنفذ اخر وهو المطلوب يسمى الكيوري الاساسي main query .

واما الكيوري الذي يكون داخل الكيوري الاساسي يسمى الكيوري الفرعي او inner query .

فاي كيوري يكتب داخل الكيوري الاساسي main query يسمى بكشل عام الـــــــــــ subquery .

اما بالنسبة للتنفيذ في هذا الكيوري subquery فانه يتم اولا التنفيذ في inner query اي الكيوري الفرعي الذي داخل الكيوري الاساسي.

ومن ثم يحدث التنفيذ في الكيوري الاساسي outer query او main query .

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

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



النوع الاول : single row-single col

ان هذا النوع من ال subquery يتم عمله والتنفيذ على صف واحد وعمود واحد ..

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

سنرى ذلك مدعموما بالامثلة .


كتابة الــــ subquery بعد جملة الـــــ where clause

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

لدينا اولا ماهي الصيغة العامة syntax



select ...... from table1
where exp_operator (select ........ from table 2
where condition );



ملاحظة :
1- المخرجات في inner query الكيوري الفرعي الذي داخل الكيوري الاساسي ابدا لن يعرض الاعمدة التي قدمنا بطلبها .
2- المخرجات في inner query سوف تعطى الى الكيوري الاساسي main query او outer query للمقارنة المعتمدة على الشرط .
3- المخرجات في outer query او main query سوف تظهر لانها هي المطلوبة .

لدينا المثال الاول:

قم بعرض ename,job,sal,deptno للموظف الذي لديه اكبر راتب من كل الموظفين الاخرين..

select ename,job,sal,deptno from emp where
sal = (select max(sal) from emp);[/b][/size]
[size=5][b]



المخرجات سوف تكون كالاتي :



ENAME JOB SAL DEPTNO
---------- --------- ------ ------
KING PRESIDENT 5000 10





المثال الثاني :

قم بعرض ename,job,sal,deptno للموظفين الذين راتبهم يكون اقل من معدل الرواتب لكل الموظفين ..

select ename,job,sal,deptno from emp
where sal<(select avg(sal) from emp);




سوف تكون المخرجات كالاتي :



ENAME JOB SAL DEPTNO
---------- --------- ------ ------
SMITH CLERK 800 20
ALLEN SALESMAN 1600 30
WARD SALESMAN 1250 30
MARTIN SALESMAN 1250 30
TURNER SALESMAN 1500 30
ADAMS CLERK 1100 20
JAMES CLERK 950 30
MILLER CLERK 1300 10




المثال الثالث:

قم بعرض ename,job,sal,deptno للموظفين الذي يعملون كنفس الوظيفة... مثل وظيفة scott

select ename,job,sal,deptno from emp
where job=(select job from emp  where ename='SCOTT');



سوف تكون المخرجات كالاتي :



ENAME JOB SAL DEPTNO
---------- --------- ------ ------
SCOTT ANALYST 3000 20
FORD ANALYST 3000 20



المثال الرابع :

قم بعرض ENAME,job,sal,deptno للموظفين الذين اقل من معدل رواتب الموظفين العاملين في الدائرة 30

select ename,job,sal,deptno from emp
where sal <(select avg(sal) from emp where deptno=30);





سوف تكون المخرجات كالاتي :



ENAME JOB SAL DEPTNO
---------- --------- ------ ------
SMITH CLERK 800 20
WARD SALESMAN 1250 30
MARTIN SALESMAN 1250 30
TURNER SALESMAN 1500 30
ADAMS CLERK 1100 20
JAMES CLERK 950 30
MILLER CLERK 1300 10





المثال الخامس :
قم بعرض ename,job,sal,deptno للموظفين الذي يعملون كنفس وظيفة SCOTT وتكون رواتبهم اكثر من راتب SMITH
select ename,job,sal,deptno from emp
where job=(select job from emp where ename='SCOTT')and sal>(
select sal from emp where ename='SMITH');


سوف تكون المخرجات كالاتي :



ENAME JOB SAL DEPTNO
---------- --------- ------ ------
SCOTT ANALYST 3000 20
FORD ANALYST 3000 20





المثال السادس:

قم بعرض ENAME,job,sal,deptno للموظف الذي راتبه يكون الثاني ..

select ename,job,sal,deptno from emp
where sal =(select max(sal) from emp
where sal<(select max(sal) from emp));



سوف تكون المخرجات كالاتي:



ENAME JOB SAL DEPTNO
---------- --------- ------ ------
SCOTT ANALYST 3000 20
FORD ANALYST 3000 20




في الحقيقة ان الـــ subquery لديه الكثير من الامثلة يمكن ان تتخيل مثال في دغامك ومن ثم تحوله على شكل كيوري

ولو اعطينة الكثير من ذلك لما كفى ولما وسعه هذا المجال ... لكن الواحد يجب ان يتدرب ويصنع الاسئلة في دماغه ومن ثم يحولها على الواقع ويحلها بهذا ال subquery.


التمرين الاول: قم بعرض ename,job,sal,deptno للموظف الذي راتبه ترتيتبه الثالث .
التمرين الثاني :قم بعرض ename,job,sal,deptno للموظفين الذي يعملون في الدائرة accounting و sales .
التمرين الثالث: قم بعرض ename,job,sal,deptno للموظفين يعملون كمدراء اي مدير للموظفين الاخرين .
التمرين الرابع: قم بعرض dname ,deptno من جدول الاقسام حيث ان هذا القسم لايوجد به اي موظفين يعملون فيه
التمرين الخامس : قم بعرض ename,job,sal,deptno للموظفين الذين راتبهم هو اقل من اكبر راتب بشرط ان اكبر راتب يكون فقط في ادائرة sales.
التمرين السادس: قم بعرض ename,job,sal,deptno للموظفين الذي يستلمون اقل راتب في كل دائرة.


ان شاء الله يكون الشرح وافي وواضح ..

اراكم ان شاء الله في الدرس القادم

لاتنسوني من دعائكم

شارك هذه المشاركة


رابط المشاركة
شارك
wael topar

1-

select ename,job,sal,deptno
from emp
where sal=(select max(sal) from emp where sal<(
select max(sal) from emp where sal<(
select max(sal) from emp)));

2-


select ename,job,sal,EMP.deptno,DNAME
from emp ,DEPT
where
DEPT.DEPTNO=EMP.DEPTNO
AND DNAME IN
(select UPPER(dname) from DEPT
where upper(dname) in
('ACCOUNTING','SALES'));

3-


select ename,job,sal,deptno
from emp
where EMPNO IN
(select MGR from EMP);
4-

select Dname,deptno
from DEPT
where DEPTNO IN
(select DEPTNO from EMP
WHERE ENAME IS NULL);
5-

select Ename,JOB,SAL,deptno
from EMP
where SAL< (select MAX(SAL) from EMP
WHERE DEPTNO IN(SELECT DEPTNO FROM DEPT
WHERE DNAME LIKE 'SALES'));
6-

select Ename,JOB,SAL,deptno
from EMP
where SAL IN (select MIN(SAL) from EMP
GROUP BY DEPTNO);

شارك هذه المشاركة


رابط المشاركة
شارك
programmer_85

الدرس الثاني عشر


اخذنا البارحة الدرس الاول في الـــ subquery وتناولنا فيه كيف يعمل على single row-single col باستخدام جملة where clause .

اليوم ان شاء الله في هذه الجلسة سوف تناول ايضا فيها كيف يتم العمل على single row-single col باستخدام جملة having clause .


كيفية كتابة subquery بواسطة جملة having clause

ان جملة having clause و جملة where clause يتم عملهما على فلترة الشرط .. لكن ماهو الاختلاف بينهما .

ان الاختلاف فيما بينهما ان جملة where clause تهتم فقط بلفترة الشروط التي تتعامل مع صف واحد اي ترجع فقط صف فردي .

لكن ان جملة having clause تهتم بلفترة الشروط التي تتعامل مع مجموعة من الصفوف وبالاخص مع الدوال التجميعية مثل (max,min,sum,avg,count).

سنرى ذلك ان شاء الله مدعموما بتلك الامثلة .

ملاحظة: عندما نتستخدم جملة having clause فانه من الضروري ان نتسخدم معها group by col_name.

,ولكن من الممكن ان نتسخدم group by col_name من دون ان نتسخدم having clause

لدينا المثال الاول:

قم بعرض avg(sal),count (sal) لكل الموظفين الذين يكون معدل رواتبهم يساوي معدل رواتب الموظفين الذي يعملون في الدائرة 30.

select avg(sal) as avgsal,count(sal) as countsal from emp
group by deptno
having avg(sal)=(select avg(sal) from emp where deptno=30);




سوف تكون المخرجات كالاتي:




AVGSAL COUNTSAL
---------- ----------
1566.66667 6



حيث نرى ان المعدل لديه اعداد عشرية كثير فيمكن ان نتسخدم الدالة round حتى تقوم بالتقريب الى اقرب مائة

سوف يكون الكود كالاتي :

select round(avg(sal)) as avgsal,count(sal) as countsal from emp
group by deptno
having avg(sal)=(select avg(sal) from emp where deptno=30);



سوف تكون المخرجات كالاتي:



AVGSAL COUNTSAL
---------- ----------
1567 6





المثال الثاني:

قم بعرض max(sal) ,deptno للموظفين الذين يكون معدل رواتبهم اقل من اكبر راتب .

select deptno,max(sal) from emp
group by deptno
having avg(sal)<(select max(sal) from emp );[/b][/size]
[size=5][b]



سوف تكون المخرجات كالاتي:



DEPTNO MAX(SAL)
------- ----------
30 2850
20 3000
10 5000



المثال الثالث:

قم بعرض مجموع كل الموظفين و رقم القسم deptno حيث ان المجموع لكل الموظفين اكبر من مجموع الموظفين الذي يعملون في الدائرة 10

select deptno,count(*) from emp
group by deptno
having count(*)>(select count(*) from emp where deptno=10);[/size][/b]
[b][size=5]



سوف تكون المخرجات كالاتي:




DEPTNO COUNT(*)
---------- ----------
30 6
20 5





المثال الرابع:

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

select max(sal),count(*),deptno,round(avg(sal))
from emp group by deptno
having avg(sal)<(select sum(sal) from emp);[/size][/b]
[b][size=5]



سوف تكون المخرجات كالاتي:



MAX(SAL) COUNT(*) DEPTNO ROUND(AVG(SAL))
--------- ---------- ---------- ---------------
2850 6 30 1567
3000 5 20 2175
5000 3 10 2917




اعتقد بان هذه الامثلة كافية لكن الشي الذي يهمنا فيها ان جملة having clause لا تاتي الا مع الدوالة التجميعية واذا وجدت

جملة having clause فلابد ان تكتب معها group by col_name .

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

فاذا وضعنا مثلا max(sal) بعد جملة select ووضعنا ايضا deptno معها ولم نضع deptno بعد جملة group by فسوف يرجع لنا خطأ.

اضافة اذا وضعنا دالة تجمعية مع مثلا الاسم ورقم القسم حيث ان رقم القسم استخدم بعد جملة group by ولكن الاسم لم نستخدمها بعدها فسوف يعطي

لنا خطأ لان الدالة التجمعية موجود في الــ expression مع الاسم وهذا لايمكن ان يصح وسوف يعطي لنا خطأ . لكن في حالة وضعنا الاسم

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



ارجو ان تكون قد وصلت الفكرة.

تمرين: قم بعرض المعدل للرواتب ورقم القسم حيث يكون كل راتب اكبر من 2000 في كل قسم وحيث ان المعدل يكون يساوي

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

شارك هذه المشاركة


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

انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من إضافة تعليق جديد

يجب ان تكون عضوا لدينا لتتمكن من التعليق

انشئ حساب جديد

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

سجل حساب جديد

تسجيل دخول

هل تمتلك حساب بالفعل؟ سجل دخولك من هنا.

سجل دخولك الان

×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: إتفاقية الخصوصية