شرح sql بالعربي - يتبع شرح sql بالعربي - يتبع - اقرا معي وتعلم على الانترنت

شرح sql بالعربي - يتبع


شرح sql بالعربي - يتبع


اذا كان لدينا الجدول StudentGrade الذي يحتوي على ارقام الطلاب StudentNumber وعلى درجاتهم grade في مختلف المواد واردنا ان نعرف أي من الطلاب قد حصل على معدل جيد جداً أي اكبر من 70 درجة او سيئ أي اصغر من 50 درجة سوف يتبادر الى اذهاننا التعبير التالي :
Select studentNumber, Avg(grade) as averageMark from studentGrades
Where avg(grade)>70 or avg(grade)<50
Group by studentNumber
ان الحل السابق يعتبر خطأ لأن where تقوم بعملية الترشيح قبل تنفيذ الدالة التجميعية AVG وليس بعدة لذلك نحن سنحتاج لاستخدام Having لحل هذه المسألة وبالتالي سيكون الحل كالتالي :
Select studentNumber, Avg(grade) as averageMark from studentGrades
Group by studentNumber
Having avg(grade)>70 or avg(grade)<50

ولذلك عند وضع شرط في استعلام نستخدم الكلمة المفتاحية where مع شرط مناسب ولكن في بعض الحالات يكون هذا الشرط قاصرا وهي الحالة التي يكون فيها احد عناصر الشرط تابعاً تجميعياً او دالة عندها يأتي دور الكلمة المفتاحية having في حال اردنا ان نضع شرطاً على استعلام ما ، بحيث يكون احد عناصر الشرط دالة تجيمعية .

على العموم لابد ان نشير الى ان الكلمة having لا تلغي دور الكلمة where بل يمكن استخدامهما معاً في صيغة واحدة .
 
التعبير Top N :
يستخدم التعبير top n كمرافق للدوال التجميعية ولكن لا يقتصر استخدامه عليها فقط .
هذا التعبير يعيد اول n سجل من نتيجة الاستعلام ويأخذ الصيغة العامة التالية :
Select top N field1, field2 … from table_name

مثال اذا اردنا معرفة اسماء الطلاب الخمسة الاوائل مرتبة بحسب معدلاتهم في جدول درجات الطلاب StudentGrade سيكون الحل كالتالي :
Select top 5 studentName, avg(studentMark)
From studentsGrades
Group by studentName
order by avg(studentMark) DESC
ملاحظة /
تختلف الصيغة الخاصة بالتعبير top n من نظام ادارة قواعد بيانات الى آخر
·        ففي Mysql تكون الصيغة كالتالي :
Select field1, field2 from table_name
Limit 0,N
حيث تشير الكلمة limit  الى مجال ارقام السجلات المراد الحصول عليها .

·        وفي DB2 تكون الصيغة كالتالي
Select field1, field2 from table_name
Fetch first N rows only
·        اما في قواعد البيانات Oracle  تعتمد الصيغة على الكلمة المفتاحية rowNum وهي عبارة عن قيمة تلقائية يولدها النظام Oracle وتحدد ترتيب السجلات التي نريد الحصول عليها فتكون الصيغة كالتالي :
Select field1, field2 where rowNum<= N

مثال :
في حال أردنا الحصول على الأرقام الثلاثة الأولى التي سجلت أكبر عدد من الاتصالات لدى شركة هواتف محمولة وذلك اعتباراً من سجل اتصالات الزبائن callog المؤلف من حقول اسم المستخدم username ورقم هاتف المستخدم phoneNumber وبفرض ان نظام ادارة قواعد المعطيات المستخدم هو نظام Oracle  نستخدم الصيغة التالية :
Select phoneNumber, count(userName) from callLog
Group by phoneNumber
Order by count(userName)
Where rowNum<= 3

مسألة :
تحتفظ شركة متعددة الفروع بسجل خاص بالمهام والأعمال التي نفذها موظفو الشركة والدخل الناتج عن كل مهمة من هذه المهام. بفرض أن جدول المعلومات المتوفرة هو جدول المهام tasks التالية :
شرح sql بالعربي - يتبع

حيث يعبر الحقل taskID عن رقم المهمة .
و taskDate عن تاريخ المهمة .
و taskIncom عن الدخل الناتج عن المهمة .
و taskHandler عن اسم الموظف الذي نفذ المهمة .

والمطلوب الحصول على جدول يحدد:
 • عدد الأعمال التي قام بها كل موظف.
 • الربح الكلي الذي حصلت عليه الشركة من عمل هذا الموظف وذلك خلال العام 2004.
مع ترتيب الجدول على نحو يظهر فيه الموظف الذي نفذ المهمة التي حققت أعلى دخل للمؤسسة، في أول سجل في الجدول.

الحل:
سيظهر في جدول النتيجة معلومات حول اسم الموظف، وعدد المهمات التي أوكلت له، ومجموع الدخول التي حصلت عليها الشركة من عمل الموظف، وقيمة الدخل الأعظمي الذي حصل عليه الموظف من مهامه، مع ترتيب قيم الدخول الأعظمية ترتيبًا تنازليًا، فيكون أول اسم في الجدول هو اسم الموظف الذي نفذ المهمة التي حققت أعلى دخل للمؤسسة.
يمكن الحصول على الحل المطلوب بالصيغة التالية:
Select taskHandler, count(taskID), sum(taskIncom), max(taskIncom)
From tasks
Group by taskHandler
Where taskDate between 01/01/2004 and 31/12/2004
Order by max(taskIncom) DES

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

.