شرح صفوف ومحتوى الفقرة
رغم أن MySQL يسمح نحوياً بكتابة شرط عادي على عمود التجميع داخل HAVING (مثل GROUP BY dept_id HAVING dept_id = 10)، إلا أن ذلك يُعد ممارسة خاطئة تضر بالأداء:
- تكلفة التصفية المتأخرة: وضع شرط غير تجميعي في
HAVINGيعني منطقياً تجميع كل أقسام الجدول وحساب مجاميعها في الذاكرة أولاً ثم رميها جميعاً باستثناء القسم رقم10! - سرعة التصفية المبكرة بـ
WHERE: كتابةWHERE dept_id = 10تصفّي الصفوف مبكراً عبر فهرس B-Tree قبل بدء التجميع أصلاً، مما يوفر استهلاك المعالج والذاكرة المؤقتة.
القاعدة الهندسية الثابتة: ضع كل شرط لا يحتوي على دالة تجميعية في WHERE، وخصص HAVING للشروط التجميعية فقط.
SQL
-- Best Practice: filter dept_id early in WHERE, not in HAVING
SELECT dept_id,
job_role,
COUNT(*) AS role_count,
AVG(salary) AS avg_salary
FROM employees
WHERE dept_id IN (10, 20)
AND is_active = 1
GROUP BY dept_id, job_role
HAVING COUNT(*) >= 3;