شرح صفوف ومحتوى الفقرة
يُفعّل محرك 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;