كيف أعرض جميع الموظفين الذين يملكون أعلى راتب في كل قسم؟

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

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

الإجابة

تعيد MAX(salary) أعلى قيمة راتب داخل القسم، لكنها لا تعيد تلقائيا أسماء أصحابها. للحصول على الأسماء، يمكن حساب أعلى راتب لكل قسم في نتيجة مجمعة، ثم ربطها بجدول الموظفين على القسم والراتب معا. يعيد ذلك كل موظف يطابق القيمة القصوى، بما في ذلك حالات التعادل.

مثال

SELECT e.department, e.name, e.salary
FROM employees AS e
JOIN (
  SELECT department, MAX(salary) AS max_salary
  FROM employees
  GROUP BY department
) AS m
  ON e.department = m.department
 AND e.salary = m.max_salary;

إذا كان موظفان في القسم نفسه يتقاضيان الراتب الأعلى، فسيظهر كلاهما. لا يختار هذا الحل اسما عشوائيا، ولا يفترض أن ترتيب الأسماء مرتبط بترتيب الرواتب. وهو مناسب عندما تكون أعمدة القسم والراتب غير مفقودة.

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

باختصار: احسب الراتب الأعلى ثم طابقه مع الصفوف الأصلية لإظهار جميع أصحابه دون فقدان التعادلات.

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

اختبر فهمك

ما الأسماء التي يعيدها الاستعلام بالترتيب؟

CREATE TABLE employees (
  id INT PRIMARY KEY,
  department VARCHAR(20) NOT NULL,
  name VARCHAR(20) NOT NULL,
  salary INT NOT NULL
);
INSERT INTO employees VALUES
  (1, 'IT', 'Ali', 5000),
  (2, 'IT', 'Mona', 5000),
  (3, 'IT', 'Ziad', 4000);
SELECT e.name
FROM employees AS e
JOIN (
  SELECT department, MAX(salary) AS max_salary
  FROM employees
  GROUP BY department
) AS m
  ON e.department = m.department
 AND e.salary = m.max_salary
ORDER BY e.id;