NahdaAIنهضة
SQL Databases • المستوى الثاني • الدرس 4

التجميع وتصفية المجموعات (GROUP BY & HAVING)

العودة لفهرس المستوى

أهداف الدرس

  • تجميع السجلات المتشابهة بـ GROUP BY لبناء التقارير.
  • فهم الفرق بين تصفية الصفوف WHERE وتصفية المجموعات التجميعية HAVING.
  • دمج WHERE + GROUP BY + HAVING + ORDER BY في استعلام واحد.
  • إنشاء شروط مركبة في HAVING باستخدام AND.

1. التقارير والتجميع الإحصائي

تكتسب GROUP BY قيمتها الحقيقية عند الرغبة في تصنيف البيانات حسب فئات (مثل البلدان، الفئات، أو الأشهر)، وتُمكّن HAVING من وضع الشروط الحسابية على مخرجات هذا التجميع.

sql
-- عدد المستخدمين لكل دولة
SELECT country, COUNT(*) AS user_count
FROM users
GROUP BY country;

-- تصفية الدول التي فيها أكثر من 10 مستخدمين
SELECT country, COUNT(*) AS user_count
FROM users
GROUP BY country
HAVING COUNT(*) > 10;

-- إحصائيات متعددة في استعلام واحد
SELECT
  country,
  COUNT(*) AS user_count,
  AVG(age) AS avg_age,
  MAX(age) AS oldest
FROM users
GROUP BY country;

2. الفرق الجوهري: WHERE vs HAVING

WHERE

يُصفّي الصفوف الفردية قبل التجميع.

WHERE age >= 25
-- يُطبَّق قبل GROUP BY
HAVING

يُصفّي المجموعات التجميعية بعد التجميع.

HAVING COUNT(*) > 10
-- يُطبَّق بعد GROUP BY

3. ترتيب تنفيذ SQL مع التجميع

#الجزءالوظيفةماذا يُصفّي؟
1FROMجلب الجدول—
2WHEREفلترة الصفوفصفوف
3GROUP BYالتجميع حسب فئة—
4HAVINGفلترة المجموعاتمجموعات
5SELECTاختيار الأعمدة—
6ORDER BYالترتيب النهائي—

4. قاعدة ذهبية

كل عمود في SELECT يجب أن يكون:

إما داخل GROUP BY

مثل: country

أو داخل دالة تجميعية

مثل: COUNT(*), AVG(age)

خطأ شائع: SELECT name, COUNT(*) FROM users GROUP BY country — اسم name ليس ضمن GROUP BY ولا دالة تجميعية!

التطبيق العملي المباشر

تحدي الدرس الرابع: تقارير متقدمة بـ GROUP BY

قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:

  1. غيّر شرط HAVING COUNT(*) > 10 إلى HAVING COUNT(*) > 5.
  2. أضف استعلاماً بـ 4 أعمدة: country, COUNT, AVG(age), SUM(age) مع GROUP BY.
  3. أضف استعلاماً بـ HAVING مركب: COUNT(*) > 5 AND AVG(age) > 28.
  4. أضف استعلاماً يجمع WHERE age >= 25 + GROUP BY + HAVING COUNT(*) >= 3 + ORDER BY user_count DESC.
  5. احتفظ بالاستعلامين الأصليين.
  6. اضغط "تشغيل الكود" لرؤية نتائج آخر استعلام.
⏳ جارٍ تحميل المحرر التفاعلي...