انتقل إلى محتوى الدرس

ONLY FULL GROUP BY Rule قاعدة التجميع القياسية الصارمة

اكتب استعلامات تجميعية قياسية تتوافق مع وضع ONLY_FULL_GROUP_BY المفعّل افتراضياً في MySQL 8.
1 صفوف تعليمية
MySQL
8 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

يُفعّل محرك MySQL 8 الوضع القياسي الصارم ONLY_FULL_GROUP_BY افتراضياً لفرض قاعدة SQL القياسية الصارمة على جميع استعلامات التجميع:

  • القاعدة الذهبية للتجميع: كل عمود يُذكر في جملة SELECT يجب إما أن يكون مذكوراً صراحةً في جملة GROUP BY، أو موضوعاً داخل دالة تجميعية مثل MAX() أو COUNT().
  • سبب رفض الأعمدة العشوائية: إذا جمّعت الموظفين حسب رقم القسم GROUP BY dept_id وكتبت في العرض SELECT dept_id, full_name، فإن القسم الواحد يضم عشرات الأسماء المختلفة! لذا يرفض MySQL 8 الاستعلام بالخطأ 1055 بدلاً من عرض اسم موظف عشوائي مضلل.

إذا أردت استخراج جميع الأسماء داخل المجموعة استخدم GROUP_CONCAT(full_name)، أو استخدم MIN(full_name) أو ANY_VALUE(full_name) عند الرغبة بقيمة تمثيلية واحدة.

SQL
-- Valid under ONLY_FULL_GROUP_BY: grouped or aggregated
SELECT dept_id,
       COUNT(*)        AS headcount,
       MIN(hired_date) AS earliest_hire,
       MAX(salary)     AS top_salary
FROM employees
GROUP BY dept_id;