لماذا يرفض ONLY_FULL_GROUP_BY عرض اسم موظف مع متوسط قسمه؟

متقدمقراءة دقيقةآخر تحديث 2 أكتوبر 2026

SQL قواعد البيانات

الإجابة

عند تجميع الموظفين حسب القسم، يمثل كل صف ناتج مجموعة قد تضم عدة موظفين. لذلك لا يمكن عرض اسم موظف عادي بجانب متوسط القسم دون تحديد كيفية اختياره. في الإعداد الافتراضي ONLY_FULL_GROUP_BY، يرفض MySQL الأعمدة غير المجمعة التي لا تعتمد اعتمادا وظيفيا على أعمدة التجميع.

مثال

SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department;

هذا الاستعلام واضح لأنه يعرض مفتاح المجموعة وقيمة محسوبة منها. إضافة name مباشرة لا تكون صحيحة إذا كان القسم يسمح بوجود أسماء متعددة. كما أن وجود مفتاح أساسي لكل موظف لا يجعل القسم يحدد موظفا واحدا، ما دام التجميع ليس حسب ذلك المفتاح.

إذا كان المطلوب متوسط القسم فقط، احذف الاسم. وإذا كان المطلوب صاحب أعلى راتب، فهذه مسألة أخرى تحتاج إلى ربط الاسم بالراتب المختار. استخدام MIN(name) يختار أصغر اسم وفق ترتيب المقارنة، وليس الموظف الأعلى راتبا.

باختصار: يجب أن يكون لكل عمود ظاهر معنى محدد داخل المجموعة، وإلا يرفضه الإعداد الافتراضي.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

لماذا يفشل الاستعلام الأخير مع ONLY_FULL_GROUP_BY المفعّل؟

CREATE TABLE employees (
  id INT PRIMARY KEY,
  department VARCHAR(20) NOT NULL,
  name VARCHAR(50) NOT NULL,
  salary DECIMAL(10,2) NOT NULL
);
INSERT INTO employees VALUES
  (1, 'IT', 'Ali', 4000),
  (2, 'IT', 'Mona', 6000);
-- الاستعلام التالي يحتوي على الخطأ المطلوب تفسيره.
SELECT department, name, AVG(salary) AS average_salary
FROM employees
GROUP BY department;