200 likes | 441 Views
لغة معالجة البيانات ( DML ) Data Manipulation Language. الجزء الثالث. إظهار السجلات بترتيب معين باستخدام ( ORDER BY ). في جملة الاستعلام عند استرجاع البيانات يمكننا إظهار البيانات بترتيب تصاعدي( ASC ) أو تنازلي ( DESC ) في العمود الواحد أو مجموعة من الأعمدة وذلك باستخدام جملة ( ORDER BY )
E N D
لغة معالجة البيانات (DML)Data Manipulation Language الجزء الثالث
إظهار السجلات بترتيب معين باستخدام (ORDER BY) • في جملة الاستعلام عند استرجاع البيانات يمكننا إظهار البيانات بترتيب تصاعدي(ASC) أو تنازلي (DESC) في العمود الواحد أو مجموعة من الأعمدة وذلك باستخدام جملة (ORDER BY) • الصيغة العامة لجملة الاستعلام: SELECT [DISTINCT|ALL] { * | column_expression | [table.] column1[As alias] [,[ table.] column2[As aliase ] [,..]]} FROM table_name [, … ] [WHERE condition] [GROUP BY column_list] [HAVING condition] [ORDER BY column_list [ASC|DESC];
إظهار السجلات بترتيب معين باستخدام (ORDER BY) • ملاحظات: • ASC تعني تصاعدي و DESC تعني تنازلي. • نختار أحدهما والافتراضي هو الترتيب التصاعدي. • نستطيع تحديد نوع الترتيب لكل عمود على حدة و ذلك باختيار نوع الترتيب بعد اسم كل عمود إذا كنا نريد ان نفرز الأعمدة بشكل مختلف. • اذا كانت هناك قيم داخل العمود الذي يتم عليه الترتيب NULL فإنها تأتي في أول ناتج الاستعلام. • في ترتيب التواريخ نلاحظ أيضا أن نوع الترتيب التصاعدي من الأصغر إلى الأكبر يعني أن التواريخ الأقدم ستسبق التاريخ الأحدث بمعنى ان سنة 70 تسبق 80 و يعني هذا أننا لو رتبنا مثلا تصاعدي بحسب تاريخ الميلاد فسيعني ان الترتيب من الأكبر سناً إلى الاقل سناً و العكس صحيح في الترتيب تنازلي.
إظهار السجلات بترتيب معين باستخدام (ORDER BY) • مثال: • STAFF(sno, fname, lname, position, sex, dob, salary, bno) المطلوب استرجاع أسماء الموظفين ورواتبهم بحيث تكون رواتبهم مرتبة تنازليا. • الحل: SELECT sno, fname, lname, salary FROM staff ORDER BY salary DESC;
إظهار السجلات بترتيب معين باستخدام (ORDER BY) • ترتيب أكثر من عمود • مثال: • Property (PropertyNo, Street, City, postcode, Type, OwnerNo, Rooms, Rent) المطلوب عرض أرقام العقارات ونوعها والغرف والايجار بحيث تكون العقارات مرتبة من حيث النوع وكل نوع مرتب على حسب قيمة الأيجار ويكون الترتيب تنازلي. • الحل: SELECT propertyNo, type, rooms, rent FROM property ORDER BY type, rent DESC;
إظهار السجلات بترتيب معين باستخدام (ORDER BY) PropertNo Rooms Rent Type PG16 Flat 4 450 PL94 Flat 4 400 PG36 Flat 3 370 House PG4 3 650 House PA14 6 600
استخدام دوال التلخيص داخل الاستعلام(Aggregation Function) • (Aggregation Function) وهي دوال التجميع أو التلخيص تقوم بتلخيص البيانات الراجعة من الاستعلام بطريقة حسابية أو احصائية. • ناتج الاستعلام يكون قيمة رقمية و ليس مجموعة سجلات كما في الاستعلامات السابقة. • ليس من المنطقي استخدام أمر الترتيب ORDER BY. • لابد من كتابة اسم العمود في جميع دوال التلخيص.
استخدام دوال التلخيص داخل الاستعلام(Aggregation Function) • دوال التجميع أو التلخيص هي: • ملاحظات: • دالة العد إذا كتبنا اسم العمود فستعد القيم مستبعدة القيم الفارغة NULL • أما اذا استخدمنا علامة * بهذا الشكل COUNT (*) فإن دالة العد ستعد القيم كلها داخل كل الأعمدة حتى الفارغة NULL
استخدام دوال التلخيص داخل الاستعلام(Aggregation Function) • مثال: • Property (PropertyNo, Street, City, postcode, Type, OwnerNo, Rooms, Rent) المطلوب إيجاد عدد العقارات التي قيمة إيجارها أكثر من 350 . • الحل: SELECT COUNT(*) AS count FROM property WHERE rent > 350; count 5
استخدام دوال التلخيص داخل الاستعلام(Aggregation Function) • مثال: • VIEWING (ClientNo, PropertyNo, ViewDate, Comment) المطلوب إيجاد عدد العقارات المختلفة والتي شوهدت في May 1998. • الحل: SELECT COUNT(DISTINCT PropertyNo) AS count FROM viewing WHERE Viewdate BETWEEN ‘1-May-98’ AND ‘31-May-98’; count 2
استخدام دوال التلخيص داخل الاستعلام(Aggregation Function) • مثال: • STAFF(sno, fname, lname, position, sex, dob, salary, bno) المطلوب إيجاد العدد الكلي للمدراء ومجموع رواتبهم. • الحل: SELECT COUNT(sno) AS count, SUM(salary) AS sum FROM staff WHERE position = ‘Manager’; sum count 54000 2
استخدام دوال التلخيص داخل الاستعلام(Aggregation Function) • مثال: • STAFF(sno, fname, lname, position, sex, dob, salary, bno) المطلوب إيجاد أقل راتب وأكثر راتب ومتوسط رواتب الطاقم • الحل: SELECT MIN(salary) AS min, MAX(salary) AS max, AVG(salary) AS avg FROM staff; max min avg 9000 30000 17000
استعلام التجميع – استخدام جملة (GROUP BY ) • يسمى الاستعلام ”استعلام تجميع“ لأنه يستخدم جملة (GROUP BY ) عند استخدام هذه الجملة فإنه لابد من استخدام دوال التلخيص أو التجميع. • استعلام التجميع يقوم بتجميع البيانات التي تم تلخيصها بواسطة دوال التلخيص(Aggregation Function). • ناتج الاستعلام مجموعة من السجلات -المجمعة- • في أمر GROUP BY لا بد من وجود عمود تجميع واحد على الأقل. • يمكن استخدام الترتيب (ORDER BY) في هذا الاستعلام. • الصيغة العامة لجملة الاستعلام: SELECT [DISTINCT|ALL] { * | column_expression | [table.] column1[As alias] [,[ table.] column2[As aliase ] [,..]]} FROM table_name [, … ] [WHERE condition] [GROUP BY column_list] [HAVING condition] [ORDER BY column_list [ASC|DESC]];
count bno sum B003 3 54000 B005 2 39000 B007 1 9000 استعلام التجميع – استخدام جملة (GROUP BY ) • مثال: • STAFF(sno, fname, lname, position, sex, dob, salary, bno) المطلوب إيجاد عدد الموظفين الذين يعملون في كل فرع ومجموع رواتبهم. • الحل: SELECT bno, COUNT(sno) AS count, SUM(salary) AS sum FROM staff GROUP BY bno;
استعلام التجميع – استخدام جملة (GROUP BY ) sno bno salary B003 SG37 12000 count sum B003 SG14 18000 B003 SG5 24000 3 54000 B005 SL21 30000 2 39000 9000 1 9000 B005 SL41 SA9 9000 B007
استعلام التجميع – استخدام جملة الشرط (HAVING) مع جملة (GROUP BY) • الصيغة العامة لجملة الاستعلام: SELECT [DISTINCT|ALL] { * | column_expression | [table.] column1[As alias] [,[ table.] column2[As aliase ] [,..]]} FROM table_name [, … ] [WHERE condition] [GROUP BY column_list] [HAVING condition] [ORDER BY column_list [ASC|DESC]]; • نلاحظ وجود شرطين HAVING و WHERE • نستخدم WHERE إاذا كنا نريد تنفيذ الشرط على عمود قبل عملية التجميع فيتم اختيار السجلات المرغوبة بناء على الشرط ثم تتم عملية التجميع. • نستخدم الشرط HAVING إذا كنا نريد تنفيذ الشرط على عمود بعد عملية التجميع فتتم عملية التجميع أولا ثم اختيار التجميعات المرغوبة بناء على الشرط.
استعلام التجميع – استخدام جملة الشرط (HAVING) مع جملة (GROUP BY) • مثال: • STAFF(sno, fname, lname, position, sex, dob, salary, bno) لكل فرع يوجد فيه أكثر من موظف المطلوب إيجاد عدد الموظفين الذين يعملون في كل فرع ومجموع رواتبهم. • الحل: SELECT bno, COUNT(sno) AS count, SUM(salary) AS sum FROM staff GROUP BY bno HAVING COUNT(sno) > 1; count bno sum B003 3 54000 B005 2 39000
تطبيق • EMPLOYEE(Fname, Lname, SSN, DOB, Address, Sex, salary, DeptNo) • DEPARTMENT(Dname, DNo ) • PROJECT(PName, PNo, PLocation, Dno) • WORKS_ON(SSN, PNo, Hours) • المطلوب: لكل مشروع يعمل عليه أكثر من موظف المطلوب عرض رقم المشروع وعدد الموظفين الذين يعملون عليه. • الحل: