انتقل إلى محتوى الدرس

Why WHERE Rejects Aggregates لماذا يرفض WHERE التجميع

افهم سبب رفض جملة WHERE للدوال التجميعية بناءً على الترتيب المنطقي لتنفيذ الاستعلام.
1 صفوف تعليمية
MySQL
7 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

من الأخطاء الشائعة محاولة كتابة دالة تجميعية داخل جملة WHERE مثل WHERE COUNT(*) > 5، وهو ما يرفضه محرك MySQL فوراً بالخطأ Error 1111: Invalid use of group function.

  • توقيت التنفيذ المنطقي: تُنفَّذ جملة WHERE على كل صف مفرد قبل الوصول إلى مرحلة GROUP BY وقبل تكوين المجموعات أصلاً.
  • عدم اكتمال الحساب التجميعي: أثناء فحص صف واحد من الجدول، لا يملك المحرك بعدُ قيمة المجموع الكلي SUM() أو العدد النهائي COUNT(*) للمجموعة!

ولذلك وفّرت لغة SQL جملة HAVING المخصصة لتصفية المجموعات بعد اكتمال تجميعها وحساب دوالها.

الفرق الدقيق بين تصفية الصفوف بـ WHERE وتصفية المجموعات بـ HAVING

قاعدة الأداء الذهبية: صفِّ الصفوف مبكراً بجملة WHERE، وخصص جملة HAVING لشروط الدوال التجميعية فقط
مخطط توضيحي لدرس تصفية المجموعات بجملة HAVING والفرق الدقيق بينها وبين WHERE
مخطط توضيحي لدرس تصفية المجموعات بجملة HAVING والفرق الدقيق بينها وبين WHERE
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;