منتديات المشاغب

منتديات المشاغب (http://www.absba.org/index.php)
-   قسم الشروحات (http://www.absba.org/forumdisplay.php?f=41)
-   -   [ORACLE] تعلم اوراكل بسهوله 3 (http://www.absba.org/showthread.php?t=504922)

a_m222 19-08-2007 09:02 AM

[ORACLE] تعلم اوراكل بسهوله 3
 
الدرس الثالث
الدروس السابقه
الدرس الاول http://www.absba.org/vb/showthread.php?t=503680
الدرس الثانى http://www.absba.org/vb/showthread.p...=1#post4600273
اليوم نستكمل اخر جزء فى where
اخر شئ فى where هو الاسبقيات
ساشرح منها or و and
هنا AND لها الاسبقيه على OR بمعنى اذا كان الكود كما يلى
كود:

SELECT last_name, job_id, salary
FROM  employees
WHERE  job_id = 'SA_REP'
OR    job_id = 'AD_PRES'
AND    salary > 15000;

هنا طلبنا منه شرط فى ناتج الكود الا وهو ان يكون الناتج الذى سيحضره الرقم الوظيفى للافراد به هو 'SA_REP' او 'AD_PRES'
ليس هذا فقط ولكن ان يكون مرتبهم ايضا اكبر من 15000 هنا سيقود الاوراكل بعمل شيئين الاول البحث عن الاشخاص الذين لهم نفس الرقم الوظيفى 'SA_REP' ويستخرجهم كلهم اما الرقم الوظيفى 'AD_PRES' فلن ياخذهم كلهم لاننا اضفنا خلفها شرط اخر يسبقه and ودائما and تتبع ما قبلها مباشرة وهو ان يكون المرتب اكبر من 15000 اى انه لن ياخد اى موظف من الموظفين الذين رقمهم الوظيفى 'AD_PRES' الا اذا كان مرتبه اكبر من 15000 اى ان and مختصه ب 'AD_PRES' فقط
مثال 2
كود:

SELECT last_name, job_id, salary
FROM  employees
WHERE  (job_id = 'SA_REP'
OR    job_id = 'AD_PRES')
AND    salary > 15000;

هذا المثال نفس المثال السابق ولكننا اضفنا شئ بسيط وهو الاقواس وكما نعلم من الرياضيات ان الشئ الموجود بين القوس يكون له الاسبقيه فى التنفيذ
اى انه اذا قلنا 3+6*5 =هنا سيكون الناتج يساوى 33
اما اذا قلنا (3+6)*5 = هنا سيكون الناتج يساوى 45 السؤال هنا لما حدث ذلك الفرق بين الناتجين رغم ان الارقام هى نفس الارقام طبعا الاجابة والسر يكمن فى الاقواس فى المسأله الاول سوف يقوم بضرب 5*6 ثم سيضيف 3 للناتج
اما المسأله الثانيه بها قوس وقلنا ان وجود القوس يلزمنا ان نبدأ به هو اولا لذلك سيقوم بجدع 6+3 والناتج سيضربه فى 5
هذا بالظبط هو الفرق بين الكودين الكود الاول لم يكن به قوس فاعتبرنا and تخص 'AD_PRES' فقط اما الكود الثانى وضع قوس ولذلك عند تنفيذه سيقوم الاوراكل بعمل خطوتين الاولى تنفيذ ما بين القوسين اى انه سيحضر جميع الموظفين الذين رقمهم الوظيفى 'AD_PRES' او 'SA_REP' والخطوه الثانيه سيقوم بالبحث عن الموظفين الذين مرتبهم اكبر من 15000 من بين ما احضره فى الخطوه الاولى
ORDER BY
الان اعتقد اننا استوعبنا استخدام اداة الشرط where فى الكود ولكن المتابع للاكواد التى كتبناها فى الشرح والناتج الخاص بها سيجد ان الناتج يخرج بنفس ترتيبه فى الجدول وهذا قد يكون غير مرغوب فيه فقد نحتاج الى ترتيب معين للناتج مثلا قد نحتاج ترتيب الناتج حسب المرتبات اى ان اقل مرتب يكون الاول واكبر مرتب يكون الاخر او العكس او قد نحتاج الى الترتيب حسب الاسماء
اذا كيف سنقوم بعمل ذلك
الموضوع بسيط جدا وهو استخدام عبارة ORDER BY ولكن اين ساضع هذه العباره فى الكود اى اين مكانها فيه
هذه العباره توضع اخر شئ فى الكود اذا كان الكود اخره FROM TABLE اذا سيكون مكان هذه العباره خلفها واذا كان الكود اخره WHERE اذا سيكون مكان هذه العباره خلفها
مثال
اذا طلب منا استخراج اسماء الموظفين العائليه ومرتباتهم ورقم كل موظف وتاريخ تعيينه بحيث يكون هؤلاء الموظفين يتقاضون عمولات وترتيب الناتج حسب المرتبات ترتيبا تصاعديا
هنا لو نظرنا الى المطلوب وكنا استوعبنا ما قلناه فى الدروس السابقه سنجد ان تنفيذ الكود سهل جدا وسنبدا كما يلى هو طلب منا احضار بيانات اذا سنستخدم select ثم ذكر ما يريده من اعمده معنى ذلك ان كل ما سافعله هو كتابة اسماء الاعمده المطلوبه مع وضع فاصل بين كل عمود ولكنه اشترط على شرط الا وهو ان يكون جميع من احضرهم يتقاضون عمولات ما معنى ذلك
معنى ذلك ان الجدول به موظفين يتقاضون عمولات واخرين لا يتقاضون وهذا يذكرنا بكلمة NULL التى سبق وتحدثنا عنها فالموظفين الذين لا يتقاضون عمولات ستكون خانة العموله امامهم فارغه اى ان قيمتها تساوى NULL والذين يتقاضون ستكون لديهم قيمه فى خانة العموله اى انها تساوى NOT NULL واخيرا طلب منى ترتيب الناتج اذا ساستخدم ORDER BY
الان نكتب الكود كما يلى
كود:

Select last_name,salary,employee_id,hire_date
From employees
Where commission_pct is not null
Order by salary;

هكذا سيكون الكود ونلاحظ انه بعد order by كتبنا اسم العمود الذى سنرتب على اساسه وهنا سيقوم بترتيب الناتج ترتيبا تصاعيدا اى من الاصغر للاكبر
ولكن اذا اردت العكس ماذا افعل اى اذا اردت ترتيب الناتج تنازليا اى من الاكبر للاصغر
الحل سيكون سهل جدا وذلك باضافى كلمة DESC فى اخر الكود وسيكون الكود كما يلى
كود:

Select last_name,salary,employee_id,hire_date
From employees
Where commission_pct is not null
Order by salary desc;

وبذلك نكون رتبنا الناتج تنازليا
ويمكن ان نستخدم الاسم المستعار للاعمده فى الترتيب ( ما معنى الاسم المستعار ) لو تذكرنا الدرس الاول فقد قلنا اننا يمكن ان نعطى الاعمده اسماء اخرى اثناء كتابة الكود وذلك بترك مسافه بعد اسم العمود وكتابة الاسم الجديد او نكتب الاسم خلف AS او بين دبل هاى كوما ( لمن لا يتذر يفضل مراجعه الدرس الاول )
مثال على هذا الكلام
كود:

Select employee_id,department_id,salary*1.1 "new_sal"
From employees
Order by new_sal;

هنا احضرنا رقم كل موظف ورقم القسم التابع له وقمنا بضرب المرتبات فى 1.1 واعطيناها اسم جديد وهو new_sal
ثم رتبنا الناتج حسب العمود new_sal
اخر شئ
وهو اننا يمكن ان نرتب الناتج باستخدان عمودين
مثال
كود:

Select last_name,hire_date
From employees
Order by last_name,salary;

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

ارجوا التفاعل ومن لم يفهم اى شئ بالدرس يخبرنى ومن يريد اى شئ بالاوراكل سواء دروس او اى شئ يخبرنى

BTMTBM 19-08-2007 12:05 PM

جزالك الله كل خير شكرا جزيلا لك
 
جزالك الله كل خير شكرا جزيلا لك

وحشتني سواليفك 19-08-2007 12:06 PM

سلمت يمناك

a_m222 19-08-2007 07:52 PM

شكرا على اهتمامك وردكم وكنت اتمنى المناقشه فى الدرس ليستفيد الجميع

rafeh 20-08-2007 12:51 AM

http://img253.imageshack.us/img253/8618/e45ps9ze3.gif

a_m222 20-08-2007 06:39 PM

شكرا اخى rafeh

so special 02-01-2013 11:12 AM

أخي رجاء أريد إجابة لهذا السؤال حاولت مليا لكن لم أتمكن من التوصل لكود كامل صحيح :
etrieve the first name, last name, department name, and city for all employees whose works in the same city of the Finance department.

Hint: You may need to use "= Any" to check the department_id equals a list of department_id(s) one by one.

shy look 09-01-2013 08:59 PM

درس مفيد ورائع جاري قراءة الدروس السابقة

kareem aljnaby 26-01-2013 04:55 PM

http://im34.gulfup.com/Ogki1.gif

MR.Esso 06-03-2013 02:27 PM

بارك الله فيك اخى الحبيب


الساعة الآن 07:14 PM