0Pricing
SQL Academy · درس

مقارنة الصفوف في الجدول نفسه

اعثر على الأزواج والعلاقات

مقارنة الصفوف في الجدول نفسه درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

ما الربط الذاتي؟

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

تخيّل جدول employees يحتوي كل موظف فيه على manager_id يشير إلى صف آخر في الجدول نفسه. يتيح لك الربط الذاتي مطابقة كل موظف بمديره في استعلام واحد.

إعداد جدول المثال

لننشئ جدولًا بسيطًا باسم employees لاستخدامه طوال هذا الدرس. يحتوي كل صف على id وname وsalary وmanager_id يشير إلى موظف آخر في الجدول نفسه.

CREATE TABLE employees (
  id         INT PRIMARY KEY,
  name       VARCHAR(50),
  salary     INT,
  manager_id INT
);

INSERT INTO employees VALUES
  (1, 'Alice',   90000, NULL),
  (2, 'Bob',     70000, 1),
  (3, 'Carol',   65000, 1),
  (4, 'Dave',    55000, 2),
  (5, 'Eve',     60000, 2),
  (6, 'Frank',   48000, 3);

صيغة الربط الذاتي الأساسية

لإجراء ربط ذاتي، أشر إلى الجدول نفسه مرتين باستخدام اسمين مستعارين مختلفين. ويتصرف الاسمان المستعاران كما لو كان لديك نسختان منفصلتان من الجدول. ثم تحدد شرط الربط الذي يصل بين النسختين.

نستخدم هنا الاسم المستعار e لجدول employees، للدلالة على الموظف، والاسم المستعار m للدلالة على المدير، ثم نطابق وفق e.manager_id = m.id.

SELECT
  e.name   AS employee,
  m.name   AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

تضمين الصفوف العليا باستخدام LEFT JOIN

يحذف INNER JOIN العادي الصفوف التي تكون فيها قيمة manager_id هي NULL، ما يعني استبعاد الموظف الموجود في أعلى التسلسل الهرمي، وهو Alice المديرة التنفيذية CEO، من النتائج.

استخدم LEFT JOIN لكي يظهر كل موظف، حتى الموظفون الذين ليس لهم مدير. وسيكون عمود المدير ببساطة NULL لديهم.

SELECT
  e.name          AS employee,
  m.name          AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
ORDER BY m.name NULLS LAST, e.name;

العثور على أزواج تتشارك خاصية

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

يمنع الشرط a.id < b.id ظهور أزواج مكررة مثل (Bob, Carol) و(Carol, Bob) معًا في النتائج.

SELECT
  a.name       AS employee_1,
  b.name       AS employee_2,
  a.manager_id AS shared_manager
FROM employees a
JOIN employees b
  ON a.manager_id = b.manager_id
 AND a.id < b.id;

مقارنة الرواتب بين الصفوف

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

SELECT
  e.name       AS employee,
  e.salary     AS emp_salary,
  m.name       AS manager,
  m.salary     AS mgr_salary
FROM employees e
JOIN employees m ON e.manager_id = m.id
WHERE e.salary > m.salary;

العثور على الصفوف التي لا تملك تطابقًا

يتيح لك الربط الذاتي باستخدام LEFT JOIN وفحص WHERE ... IS NULL العثور على الصفوف التي ليس لها نظير مطابق. نعثر هنا على الموظفين الذين لا يوجد من يرفع تقاريره إليهم، أي العقد الطرفية في التسلسل الهرمي.

SELECT e.name AS employee
FROM employees e
LEFT JOIN employees sub ON sub.manager_id = e.id
WHERE sub.id IS NULL
ORDER BY e.name;

حساب المرؤوسين المباشرين

من خلال ربط الجدول بنفسه والتجميع باستخدام جهة المدير، يمكنك حساب عدد المرؤوسين المباشرين لكل مدير. ويُضمَّن الموظفون الذين ليس لديهم مرؤوسون باستخدام LEFT JOIN.

SELECT
  m.name           AS manager,
  COUNT(e.id)      AS direct_reports
FROM employees m
LEFT JOIN employees e ON e.manager_id = m.id
GROUP BY m.id, m.name
ORDER BY direct_reports DESC;

استخدام CTEs لتوضيح عمليات الربط الذاتي

عندما يصبح استعلام الربط الذاتي معقدًا، فإن وضعه داخل تعبير جدولي شائع (CTE) يجعل المنطق أسهل في القراءة. عرّف CTE واحدًا للتسلسل الهرمي، ثم استعلم عنه بوضوح.

WITH hierarchy AS (
  SELECT
    e.id         AS emp_id,
    e.name       AS employee,
    e.salary     AS emp_salary,
    m.name       AS manager,
    m.salary     AS mgr_salary
  FROM employees e
  LEFT JOIN employees m ON e.manager_id = m.id
)
SELECT *
FROM hierarchy
WHERE mgr_salary IS NOT NULL
  AND emp_salary > mgr_salary;

الربط الذاتي لجدول غير هرمي

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

CREATE TABLE products (
  id       INT PRIMARY KEY,
  name     VARCHAR(50),
  category VARCHAR(30)
);

INSERT INTO products VALUES
  (1, 'Laptop',  'Electronics'),
  (2, 'Phone',   'Electronics'),
  (3, 'Tablet',  'Electronics'),
  (4, 'Shirt',   'Clothing'),
  (5, 'Jeans',   'Clothing');

SELECT
  a.name AS product_1,
  b.name AS product_2,
  a.category
FROM products a
JOIN products b
  ON a.category = b.category
 AND a.id < b.id;

المزالق: المنتجات الديكارتية والأزواج المكررة

من الأخطاء الشائعة في عمليات الربط الذاتي المنتجات الديكارتية، أي نسيان شرط الربط تمامًا، والأزواج المكررة، أي استخدام a.id <> b.id بدلًا من a.id < b.id.

تحقق دائمًا من صحة شرط الربط، واستخدم < بدلًا من <> عندما تحتاج إلى أزواج غير مرتبة فقط، لا أزواج مرتبة.

-- Wrong: returns every ordered pair (A,B) AND (B,A)
SELECT a.name, b.name
FROM employees a
JOIN employees b ON a.manager_id = b.manager_id
                AND a.id <> b.id;

-- Correct: returns each unordered pair once
SELECT a.name, b.name
FROM employees a
JOIN employees b ON a.manager_id = b.manager_id
                AND a.id < b.id;

تحقق سريع

اختبروا مدى فهمكم للربط الذاتي ومقارنة الصفوف في الجدول نفسه.

مراجعة الدرس

تعلّمتم في هذا الدرس كيفية استخدام الربط الذاتي لمقارنة الصفوف داخل الجدول نفسه.

أهم النقاط:

  • استخدموا اسمًا مستعارًا للجدول مرتين (مثلًا: e وm) كي تتعامل قاعدة البيانات معهما كمصدرين منفصلين.
  • استخدموا INNER JOIN عندما تحتاجون فقط إلى الصفوف التي لها صف مطابق، واستخدموا LEFT JOIN عندما تريدون تضمين الصفوف غير المطابقة أيضًا.
  • استخدموا a.id < b.id لتجنب أزواج الصفوف المكررة غير المرتبة.
  • يفيد الربط الذاتي في التسلسلات الهرمية (المدير/الموظف)، وعمليات البحث عن التشابه (الفئة نفسها)، وأي مقارنة يجب فيها ربط صفين من الجدول نفسه.
  • يمكن أن تجعل CTEs استعلامات الربط الذاتي المعقدة أسهل بكثير في القراءة والصيانة.

الأسئلة الشائعة

هل درس «مقارنة الصفوف في الجدول نفسه» مجاني؟

نعم — نص درس «مقارنة الصفوف في الجدول نفسه» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «مقارنة الصفوف في الجدول نفسه»؟

اعثر على الأزواج والعلاقات تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «مقارنة الصفوف في الجدول نفسه»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ما هو الربط الذاتي
  2. الموظفون والمديرون
  3. مقارنة الصفوف في الجدول نفسه
  4. حدود الربط الذاتي
← العودة إلى SQL Academy