في هذا الدرس 6تصفّح المواضيع
بخلاف الربط الداخلي والخارجي اللذين يعتمدان على شرط تطابق المفاتيح، ينتج الربط التبادلي CROSS JOIN ما يُعرف رياضياً باسم الضرب الديكارتي (Cartesian Product)؛ حيث يُقترن كل صف من الجدول الأول بجميع صفوف الجدول الثاني دون أي شرط ON:
- تضاعف عدد الصفوف: إذا كان الجدول الأول يضم
Mصفاً والجدول الثاني يضمNصفاً، فإنA CROSS JOIN BيرجعM × Nصفاً بالضبط. - التصريح المتعمّد الواضح: اكتب دائماً الكلمتين
CROSS JOINصراحةً عندما تقصد توليد الضرب الديكارتي، ليدرك فريق التطوير أن غياب شرطONمقصود هندسياً.
-- 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بالمبيعات الفعلية لضمان ظهور جميع الأشهر الاثني عشر لكل فرع حتى لو كانت مبيعات بعض الأشهر صفراً.
-- 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 مليارات صف، مما يستنزف المعالج والذاكرة فوراً.
-- 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القسم الرئيسي الجذري.
-- 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.
-- 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 JOIN | FROM sizes s CROSS JOIN colors c | بدون شرط (ضرب M × N) | توليد مصفوفات المقاسات والألوان وشبكات التقارير الزمنية |
ربط ذاتي بـ INNER JOIN | FROM employees e INNER JOIN employees m ON e.manager_id = m.emp_id | المفتاح الأجنبي = الأساسي بالجدول ذاته | عرض الموظفين أو الأقسام الفرعية المرتبطة بمدير أو قسم أب فقط |
ربط ذاتي بـ LEFT JOIN | FROM 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 SKU SKU
- Stock Keeping Unit
- رمز الصنف المخزني الفريد الذي يولَّد لكل نسخة منتج (مثل المقاس × اللون) عبر CROSS JOIN.
- للمراجعة
- 02 SELF JOIN SELF JOIN
- Self-Referencing Table Join
- ربط الجدول بنفسه باستخدام اسمين مستعارين مختلفين لتمثيل علاقة الأب بالابن أو المدير بالموظف.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
نفّذ أمثلة SQL المشروحة في قسم الضرب الديكارتي بـ CROSS JOIN داخل قاعدة بياناتك المحلية وتحقق من مجموعة النتائج.
-
بدّل بين الحالات التفاعلية في قسم توليد مصفوفات التوافيق عملياً وقارن كيف ينفّذ محرك MySQL 8 كل استعلام.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي5 أسئلة تنتظرك +
إذا كان الجدول A يحتوي على 6 صفوف والجدول B يحتوي على 8 صفوف، فكم صفاً يرجعه الاستعلام SELECT * FROM A CROSS JOIN B؟
اضرب عدد صفوف الجدول الأول في عدد صفوف الجدول الثاني (M × N).
ماذا يفعل محرك MySQL إذا كتبت SELECT * FROM users INNER JOIN orders; دون تحديد شرط ON أو USING؟
تذكّر كيف يعامل MySQL جملة INNER JOIN عند حذف شرط ON.
ما هو الشرط الإلزامي في SQL عند كتابة استعلام ربط ذاتي يربط جدول الموظفين employees بنفسه؟
تذكّر كيف يميّز MySQL بين نسختي الجدول نفسه داخل الاستعلام.
في جدول الموظفين المرجعي الذاتي، يجب أن يسمح عمود المفتاح الأجنبي manager_id بالقيمة الفارغة NULL لتخزين المدير التنفيذي الأعلى الذي لا يملك مديراً فوقه.
تحقق من كيفية تمثيل عقدة الجذر العليا في الجداول المرجعية الذاتية.
أي نوع ربط يجب استخدامه في الربط الذاتي على جدول الموظفين إذا أردت ظهور المدير التنفيذي الأعلى (الذي تكون قيمة manager_id له NULL) ضمن النتيجة؟
اختر نوع الربط الذي يحتفظ بصفوف الجدول الأيسر حتى لو كان المفتاح الأجنبي فارغاً.