HAVING
تصفية المجموعات بعد التجميع HAVING
HAVING يصفّي نتيجة GROUP BY على مستوى المجموعات، بعد حساب دوال التجميع — بخلاف WHERE الذي يصفّي الصفوف الخام قبل التجميع.
HAVING يُنفَّذ بعد GROUP BY، ويسمح بوضع شرط على نتيجة دالة تجميع مباشرة (مثل COUNT(*) أو SUM(total))، وهو ما لا يمكن فعله في WHERE لأن دوال التجميع غير محسوبة بعد عند تقييم WHERE.
يمكن استخدام WHERE وHAVING معًا في نفس الاستعلام: WHERE يصفّي الصفوف الخام أولًا، ثم يجري التجميع على الباقي، ثم HAVING يصفّي المجموعات الناتجة.
الصياغة
SELECT column, AGG_FUNC(other_column) FROM table GROUP BY column HAVING AGG_FUNC(other_column) condition;
📄 مثال
SELECT city, COUNT(*) AS user_count FROM users GROUP BY city HAVING COUNT(*) > 10;
أهم النقاط
| النقطة | الوظيفة |
|---|---|
| HAVING مع COUNT | تصفية المجموعات حسب عدد صفوفها |
| HAVING مع SUM/AVG | تصفية المجموعات حسب مجموع أو متوسط عمود رقمي فيها |
| WHERE + HAVING معًا | WHERE يصفّي قبل التجميع، HAVING يصفّي بعده — في نفس الاستعلام |
💡 نصائح عملية
- إن كان شرطك على عمود خام (لا نتيجة دالة تجميع)، ضعه في WHERE — أسرع لأنه يقلّل الصفوف قبل التجميع أصلًا
- استخدم alias المعرّف في SELECT داخل HAVING إن كانت قاعدة بياناتك تدعم ذلك، لتقصير التكرار
⚠️ أخطاء شائعة
- استخدام HAVING بدل WHERE لتصفية عمود عادي — يعمل غالبًا لكنه أبطأ لأنه يصفّي بعد التجميع لا قبله
- نسيان أن HAVING يتطلّب GROUP BY في نفس الاستعلام غالبًا ليكون له معنى
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار SQL الكامل بالعربي.