شرح صفوف ومحتوى الفقرة
يوضّح الجدول التالي الفروق الجوهرية الكاملة بين جملتي WHERE و HAVING في MySQL 8:
| وجه المقارنة | جملة WHERE | جملة HAVING |
|---|---|---|
| هدف التصفية | الصفوف الفردية الخام في الجدول | المجموعات الملخصة الناتجة عن التجميع |
| توقيت التنفيذ المنطقي | قبل مرحلة GROUP BY والتجميع | بعد مرحلة GROUP BY وحساب الدوال |
| الدوال التجميعية | ممنوعة (تُطلق الخطأ Error 1111) | مدعومة بالكامل (COUNT و SUM و AVG) |
| الأسماء المستعارة في SELECT | غير متاحة للاستخدام | متاحة للاستخدام في MySQL 8 |
| استثمار فهارس B-Tree | تستخدم الفهارس مباشرة لتقليص الصفوف المقروءة | تفحص نتائج المجموعات المحسوبة في الذاكرة |
ملخص الدرس: تعلّمت في هذا الدرس سبب رفض WHERE للدوال التجميعية، وكيفية تصفية المجموعات عبر HAVING، وطريقة الجمع بين WHERE و HAVING في استعلام واحد، وأهمية التصفية المبكرة بـ WHERE لتحسين الأداء.
الخطوة التالية والدرس القادم: نختتم وحدة التجميع في الدرس القادم بتعلّم توليد المجاميع الفرعية والكلية عبر WITH ROLLUP، وتمييز صفوف المجموع بدالة GROUPING()، وإتقان الترتيب المنطقي الكامل لتنفيذ استعلام SQL.
-- Pipeline: WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT
SELECT category,
COUNT(*) AS active_items,
SUM(stock_qty) AS category_stock,
AVG(unit_price) AS avg_category_price
FROM products
WHERE is_active = 1
GROUP BY category
HAVING COUNT(*) >= 3
AND SUM(stock_qty) >= 50
ORDER BY category_stock DESC
LIMIT 10;
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
أتقنّا في هذا الدرس تصفية المجموعات بجملة HAVING والفرق الدقيق بينها وبين WHERE في MySQL 8 مع أمثلة عملية.
الخطوة التالية والدرس القادم
أكمل التدريبات والاختبار التفاعلي أدناه قبل الانتقال إلى الدرس التالي في مسار MySQL.