انتقل إلى محتوى الدرس
الدرس 43
دورة MySQL

الربط التبادلي CROSS JOIN والربط الذاتي SELF JOIN في MySQLMySQL CROSS JOIN and SELF JOIN

تعلّم الربط التبادلي CROSS JOIN والربط الذاتي SELF JOIN في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

بخلاف الربط الداخلي والخارجي اللذين يعتمدان على شرط تطابق المفاتيح، ينتج الربط التبادلي CROSS JOIN ما يُعرف رياضياً باسم الضرب الديكارتي (Cartesian Product)؛ حيث يُقترن كل صف من الجدول الأول بجميع صفوف الجدول الثاني دون أي شرط ON:

  • تضاعف عدد الصفوف: إذا كان الجدول الأول يضم M صفاً والجدول الثاني يضم N صفاً، فإن A CROSS JOIN B يرجع M × N صفاً بالضبط.
  • التصريح المتعمّد الواضح: اكتب دائماً الكلمتين CROSS JOIN صراحةً عندما تقصد توليد الضرب الديكارتي، ليدرك فريق التطوير أن غياب شرط ON مقصود هندسياً.
مخطط الربط التبادلي CROSS JOIN والربط الذاتي SELF JOIN في MySQL 8
SQL
-- Produce the Cartesian product of 4 sizes and 5 colors (20 rows)
SELECT
  s.size_code,
  c.color_name
FROM sizes AS s
CROSS JOIN colors AS c
ORDER BY s.size_code, c.color_name;

يُستخدم CROSS JOIN في الأنظمة الفعلية كأداة هندسية فعالة لتوليد مصفوفات التوافيق وشبكات التقارير الكاملة:

  • توليد نسخ المنتجات (SKUs): ضرب جدول المقاسات في جدول الألوان لتوليد جميع النسخ الفرعية الممكنة للمنتج تلقائياً.
  • شبكات التقارير الزمنية الكاملة: ضرب جدول فروع الشركة في جدول أشهر السنة، ثم ربط الناتج عبر LEFT JOIN بالمبيعات الفعلية لضمان ظهور جميع الأشهر الاثني عشر لكل فرع حتى لو كانت مبيعات بعض الأشهر صفراً.
SQL
-- Generate full branch x quarter reporting grid with SKU prices
SELECT
  b.branch_name,
  q.quarter_label,
  CONCAT(b.branch_code, '-', q.quarter_label) AS report_slot
FROM branches AS b
CROSS JOIN fiscal_quarters AS q
ORDER BY b.branch_name, q.quarter_label;

في معيار SQL القياسي، يشترط INNER JOIN وجود جملة ON أو USING. غير أن MySQL يعامل الكلمات JOIN وINNER JOIN وCROSS JOIN كمترادفات نحوية؛ فإذا كتبت FROM users JOIN orders ونسيت سهواً كتابة شرط ON، فلن يطلق MySQL خطأ نحوياً، بل سينفذ ضرباً ديكارتياً كاملاً بصمت!

  • خطر انفجار عدد الصفوف: إن ربط جدول يضم 50,000 مستخدم بجدول يضم 200,000 طلب بدون شرط ON يحاول توليد 10 مليارات صف، مما يستنزف المعالج والذاكرة فوراً.
SQL
-- Always include ON or USING when writing INNER JOIN in MySQL
SELECT
  u.user_id,
  o.order_id
FROM users AS u
INNER JOIN orders AS o
  ON u.user_id = o.user_id
LIMIT 10;

يُعرَف الجدول المرجعي الذاتي (Self-Referencing Table) بأنه جدول يحتوي على عمود مفتاح أجنبي يشير مباشرةً إلى عمود المفتاح الأساسي داخل الجدول نفسه:

  • الهياكل التنظيمية للموظفين: جدول employees يضم المفتاح الأساسي emp_id وعموداً قابلاً للفراغ manager_id يشير إلى employees(emp_id) لأن المدير هو موظف أيضاً في الجدول ذاته.
  • شجرة التصنيفات الفرعية: جدول categories يشير فيه العمود parent_id إلى categories(category_id)، حيث تمثل القيمة NULL القسم الرئيسي الجذري.
SQL
-- Create a self-referencing categories table in InnoDB
CREATE TABLE store_categories (
  category_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  category_name VARCHAR(100) NOT NULL,
  parent_id INT UNSIGNED DEFAULT NULL,
  FOREIGN KEY (parent_id) REFERENCES store_categories (category_id)
);

لا توجد كلمة مفتاحية مستقلة باسم SELF JOIN في لغة SQL؛ بل يُكتب الربط الذاتي باستخدام INNER JOIN أو LEFT JOIN العادي لربط الجدول بنفسه، مع شرط إلزامي هو منح الجدول اسمين مستعارين مختلفين:

  • إلزامية الأسماء المستعارة: تؤدي كتابة FROM employees JOIN employees بدون أسماء مستعارة إلى توقف الاستعلام بالخطأ رقم 1066 لتكرار اسم الجدول.
  • اختيار الربط الداخلي أو الأيسر: استخدم INNER JOIN لعرض الموظفين الذين لديهم مدير فقط، واستخدم LEFT JOIN مع COALESCE() لإظهار المدير العام أو الأقسام الجذرية التي تكون قيمة manager_id فيها NULL.
SQL
-- Pair every employee (e) with their manager (m) via Self Join
SELECT
  e.emp_id,
  e.emp_name AS employee_name,
  COALESCE(m.emp_name, 'Executive Board') AS manager_name
FROM employees AS e
LEFT JOIN employees AS m
  ON e.manager_id = m.emp_id
ORDER BY e.emp_id;

يقارن الجدول التالي بين أنماط الربط التبادلي CROSS JOIN والربط الذاتي SELF JOIN في MySQL 8:

نمط الربطبنية الاستعلام في SQLشرط الربطالاستخدام الهندسي الأمثل
CROSS JOINFROM sizes s CROSS JOIN colors cبدون شرط (ضرب M × N)توليد مصفوفات المقاسات والألوان وشبكات التقارير الزمنية
ربط ذاتي بـ INNER JOINFROM employees e INNER JOIN employees m ON e.manager_id = m.emp_idالمفتاح الأجنبي = الأساسي بالجدول ذاتهعرض الموظفين أو الأقسام الفرعية المرتبطة بمدير أو قسم أب فقط
ربط ذاتي بـ LEFT JOINFROM employees e LEFT JOIN employees m ON e.manager_id = m.emp_idالمفتاح الأجنبي = الأساسي بالجدول ذاتهعرض الهيكل التنظيمي كاملاً بما فيه المدير العام والأقسام الجذرية
ربط ذاتي للأزواج المتناظرةFROM products p1 INNER JOIN products p2 ON p1.cat_id = p2.cat_id AND p1.id < p2.idصفة مشتركة + عدم مساواة <استخراج أزواج العناصر المشتركة في الفئة أو المدينة دون تكرار

ملخص الدرس: تعلمنا في هذا الدرس كيفية استخدام CROSS JOIN لتوليد الضرب الديكارتي ومصفوفات التوافيق، وخطر نسيان شرط ON في MySQL، وكيفية تصميم الجداول المرجعية الذاتية واستعلامها عبر الربط الذاتي بالأسماء المستعارة.
الخطوة التالية والدرس القادم: في الدرس القادم سننتقل إلى دراسة «معاملات المجموعات UNION و INTERSECT و EXCEPT في MySQL» لدمج ومقارنة نتائج الاستعلامات عمودياً.

خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

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

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

يمكّنك CROSS JOIN من توليد شبكات التوافيق، بينما يتيح الربط الذاتي بالأسماء المستعارة استعراض العلاقات الشجرية داخل الجدول الواحد. الخطوة التالية: انتقل إلى درس «معاملات المجموعات UNION و INTERSECT و EXCEPT في MySQL».

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات5

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 5 مفهومةأول بطاقة، أول خطوة
01 Self Joins الربط الذاتي
تعلّم الربط التبادلي CROSS JOIN والربط الذاتي SELF JOIN في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
للمراجعة
02 Cartesian Product with CROSS JOIN الضرب الديكارتي بـ CROSS JOIN
المفهوم الهندسي والصياغة العملية الخاصة بقسم الضرب الديكارتي بـ CROSS JOIN في MySQL 8.
للمراجعة
03 Generating Combinations Matrices توليد مصفوفات التوافيق عملياً
المفهوم الهندسي والصياغة العملية الخاصة بقسم توليد مصفوفات التوافيق عملياً في MySQL 8.
للمراجعة
04 Accidental Missing ON Clause Risk خطر الربط التبادلي العشوائي
المفهوم الهندسي والصياغة العملية الخاصة بقسم خطر الربط التبادلي العشوائي في MySQL 8.
للمراجعة
05 Concept of Self Referencing Tables مفهوم الجدول المرتبط بنفسه
المفهوم الهندسي والصياغة العملية الخاصة بقسم مفهوم الجدول المرتبط بنفسه في MySQL 8.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات2

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 2 مفهومةأول بطاقة، أول خطوة
01 SKU SKU
Stock Keeping Unit
رمز الصنف المخزني الفريد الذي يولَّد لكل نسخة منتج (مثل المقاس × اللون) عبر CROSS JOIN.
للمراجعة
02 SELF JOIN SELF JOIN
Self-Referencing Table Join
ربط الجدول بنفسه باستخدام اسمين مستعارين مختلفين لتمثيل علاقة الأب بالابن أو المدير بالموظف.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ أمثلة SQL المشروحة في قسم الضرب الديكارتي بـ CROSS JOIN داخل قاعدة بياناتك المحلية وتحقق من مجموعة النتائج.

  2. بدّل بين الحالات التفاعلية في قسم توليد مصفوفات التوافيق عملياً وقارن كيف ينفّذ محرك MySQL 8 كل استعلام.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

5أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي5 أسئلة تنتظرك
01

إذا كان الجدول A يحتوي على 6 صفوف والجدول B يحتوي على 8 صفوف، فكم صفاً يرجعه الاستعلام SELECT * FROM A CROSS JOIN B؟

اضرب عدد صفوف الجدول الأول في عدد صفوف الجدول الثاني (M × N).

02

ماذا يفعل محرك MySQL إذا كتبت SELECT * FROM users INNER JOIN orders; دون تحديد شرط ON أو USING؟

تذكّر كيف يعامل MySQL جملة INNER JOIN عند حذف شرط ON.

03

ما هو الشرط الإلزامي في SQL عند كتابة استعلام ربط ذاتي يربط جدول الموظفين employees بنفسه؟

تذكّر كيف يميّز MySQL بين نسختي الجدول نفسه داخل الاستعلام.

04

في جدول الموظفين المرجعي الذاتي، يجب أن يسمح عمود المفتاح الأجنبي manager_id بالقيمة الفارغة NULL لتخزين المدير التنفيذي الأعلى الذي لا يملك مديراً فوقه.

تحقق من كيفية تمثيل عقدة الجذر العليا في الجداول المرجعية الذاتية.

05

أي نوع ربط يجب استخدامه في الربط الذاتي على جدول الموظفين إذا أردت ظهور المدير التنفيذي الأعلى (الذي تكون قيمة manager_id له NULL) ضمن النتيجة؟

اختر نوع الربط الذي يحتفظ بصفوف الجدول الأيسر حتى لو كان المفتاح الأجنبي فارغاً.