تخطَّ إلى المحتوى

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 الكامل بالعربي.