شرح صفوف ومحتوى الفقرة
من الأخطاء الشائعة محاولة كتابة دالة تجميعية داخل جملة WHERE مثل WHERE COUNT(*) > 5، وهو ما يرفضه محرك MySQL فوراً بالخطأ Error 1111: Invalid use of group function.
- توقيت التنفيذ المنطقي: تُنفَّذ جملة
WHEREعلى كل صف مفرد قبل الوصول إلى مرحلةGROUP BYوقبل تكوين المجموعات أصلاً. - عدم اكتمال الحساب التجميعي: أثناء فحص صف واحد من الجدول، لا يملك المحرك بعدُ قيمة المجموع الكلي
SUM()أو العدد النهائيCOUNT(*)للمجموعة!
ولذلك وفّرت لغة SQL جملة HAVING المخصصة لتصفية المجموعات بعد اكتمال تجميعها وحساب دوالها.
الفرق الدقيق بين تصفية الصفوف بـ WHERE وتصفية المجموعات بـ HAVING
قاعدة الأداء الذهبية: صفِّ الصفوف مبكراً بجملة WHERE، وخصص جملة HAVING لشروط الدوال التجميعية فقط
SQL
-- Valid pre-grouping row filter in WHERE (no aggregates)
SELECT dept_id,
COUNT(*) AS active_staff,
AVG(salary) AS avg_salary
FROM employees
WHERE is_active = 1
GROUP BY dept_id;