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 مع التجميع
| # | الجزء | الوظيفة | ماذا يُصفّي؟ |
|---|---|---|---|
| 1 | FROM | جلب الجدول | — |
| 2 | WHERE | فلترة الصفوف | صفوف |
| 3 | GROUP BY | التجميع حسب فئة | — |
| 4 | HAVING | فلترة المجموعات | مجموعات |
| 5 | SELECT | اختيار الأعمدة | — |
| 6 | ORDER BY | الترتيب النهائي | — |
4. قاعدة ذهبية
كل عمود في SELECT يجب أن يكون:
إما داخل GROUP BY
مثل: country
أو داخل دالة تجميعية
مثل: COUNT(*), AVG(age)
خطأ شائع: SELECT name, COUNT(*) FROM users GROUP BY country — اسم name ليس ضمن GROUP BY ولا دالة تجميعية!
التطبيق العملي المباشر
تحدي الدرس الرابع: تقارير متقدمة بـ GROUP BY
قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:
- غيّر شرط
HAVING COUNT(*) > 10إلىHAVING COUNT(*) > 5. - أضف استعلاماً بـ 4 أعمدة:
country,COUNT,AVG(age),SUM(age)مع GROUP BY. - أضف استعلاماً بـ HAVING مركب:
COUNT(*) > 5 AND AVG(age) > 28. - أضف استعلاماً يجمع
WHERE age >= 25+GROUP BY+HAVING COUNT(*) >= 3+ORDER BY user_count DESC. - احتفظ بالاستعلامين الأصليين.
- اضغط "تشغيل الكود" لرؤية نتائج آخر استعلام.
⏳ جارٍ تحميل المحرر التفاعلي...