ذكرنا في الدرس الماضي أن التابع () count يستخدم للعمليات الإحصائية وفي هذا الدرس سنكمل ما قلناه إذن لنبدأ على بركة الله.
في كثير من الأحيان تقوم بكتابة استعلام يكون صحيح منطقياً ويعيد لك نتيجة ولكنها تحوي على خطأ غير متوقع وهنا تكمن الخطورة فتخيل أنك تقوم بالاشتراك في أحد المنتديات وعند الإرسال سيظهر لك رابط لتعديل بياناتك قد تدخل إلى هذا الرابط فتشاهد أنه قد تم وضع العنوان مكان اسم المشترك ورقم الهاتف بدلاً من العنوان ... الخ إذن لم يظهر أي خطأ برمجي ولكن ظهر خطأ في النتيجة دعنا الآن نأخذ مثالاً صحيحاً برمجياً وعند التنفيذ لا يعطينا أي خطأ بل سيعطينا نتيجة ولكنها مغلوطة.
قم بكتابة استعلاماً يعيد لنا ما يلي:
1. رقم و اسم وراتب الموظف.
2. مجموع الموظفين ذوي الرواتب المتساوية.
مع الأخذ بعين الاعتبار أن الراتب أكبر أو يساوي 5000 ومفروزين حسب الراتب تنازلياً.
الحل:
select emp_no , name , salary , count(*) as the same salary
لا تعر اهتماماً الآن إلى العبارة الجديدة group by فسنتكلم عنها في الدرس القادم إن شاء الله.
لاحظ أن هذا الاستعلام قد أعاد لك عدد الموظفين ذوي الراتب 8000 هو اثنان وعدد الموظفين ذوي الراتب 5000 هو اثنان وبالمقابل في خانة الأسماء أعاد لك اسماً واحداً فأين اسم الموظف الآخر؟ يعتبر هذا الخطأ خطأ فادح.
كيف يتم تلافي مثل هذه الأخطاء ؟
ببساطة يتم تلافي مثل هذه الأخطاء عن طريق تحليل الاستعلام الذي ستكتبه, مع الأخذ بعين الاعتبار أن هناك بعض الاستعلامات المعقدة التي تحتاج لإتمامها بشكل سليم إلى لغة برمجة مثل PHP لكن هناك استعلامات (مثل استعلامنا هذا) هي بحد ذاتها خاطئة فكيف تطلب مجموع الموظفين وبنفس الوقت تطلب اسم الموظف ورقمه في نفس الاستعلام ؟
لذلك وحتى يعيد لنا الاستعلام السابق نتيجة صحيحة يجب أن يكون طلباً صحيحاً فيمكنك أن تقول, اكتب استعلاماً يعيد مجموع الموظفين ذوي الرواتب التي أكبر أو تساوي 5000 مفروزين حسب الراتب وبالتالي سيكون شكل استعلامك الصحيح كالتالي:
select salary , count(*) as the same salary from emp