كيف أقارن زوج أعمدة باستعلام فرعي دون خلط القيم بين الصفوف؟

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

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

الإجابة

عندما تمثل العلاقة زوجًا من القيم، مثل القسم والراتب، فقد تحتاج إلى مطابقة الزوج كاملًا مع صف في نتيجة استعلام فرعي. تدعم MySQL استخدام تركيب صف مثل (department_id, salary) مع IN، بشرط أن يعيد الاستعلام الداخلي عمودين بالترتيب المقابل.

هذه الصيغة تختلف عن اختبار كل عمود بصورة مستقلة باستخدام شرطين منفصلين. الاختبار المنفصل قد يجد القسم في صف والراتب في صف آخر، فيقبل زوجًا لم يظهر أصلًا ضمن النتائج الداخلية. أما مقارنة الزوج فتشترط أن تجتمع القيمتان في الصف الداخلي نفسه.

مثال

WITH employees AS (
  SELECT 1 AS id, 10 AS department_id, 100 AS salary
  UNION ALL SELECT 2, 10, 200
  UNION ALL SELECT 3, 20, 100
)
SELECT id FROM employees
WHERE (department_id, salary) IN (
  SELECT department_id, MAX(salary)
  FROM employees
  GROUP BY department_id
);

في مثال أعلى راتب لكل قسم، يحافظ الزوج على ارتباط كل قيمة قصوى بقسمها. وتظهر جميع التعادلات لأن الاختبار يصفّي الصفوف ولا يختار موظفًا واحدًا فقط.

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

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

اختبر فهمك

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

CREATE TABLE employees (
  id INT PRIMARY KEY,
  department_id INT NOT NULL,
  salary INT NOT NULL
);
INSERT INTO employees (id, department_id, salary)
VALUES (1, 10, 100), (2, 10, 200), (3, 20, 100), (4, 20, 100);

SELECT id
FROM employees
WHERE (department_id, salary) IN (
  SELECT department_id, MAX(salary)
  FROM employees
  GROUP BY department_id
)
ORDER BY id;