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

الربط الخارجي LEFT JOIN و RIGHT JOIN في MySQLMySQL LEFT JOIN RIGHT JOIN and Outer Joins

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

بينما يستبعد الربط الداخلي INNER JOIN أي سجل رئيسي ليس له سجلات فرعية مرتبطة، تتطلب لوحات التقارير غالباً عرض جميع العملاء (حتى من لم يسجل أي طلب) أو جميع المنتجات (حتى التي لم تُبَع بعد). ويضمن الربط الخارجي الأيسر LEFT JOIN (وهو اختصار LEFT OUTER JOIN) بقاء كل صف من الجدول الأيسر المكتوب بعد FROM ضمن النتيجة:

  • الصفوف المتطابقة: تُعرض كاملةً مع بياناتها المقابلة من الجدول الأيمن.
  • الصفوف غير المتطابقة في اليسار: تبقى في النتيجة النهائية، وتُملأ جميع أعمدة الجدول الأيمن المقابلة لها بالقيمة الفارغة NULL.
مخطط الربط الخارجي LEFT JOIN و RIGHT JOIN واكتشاف السجلات غير المرتبطة في MySQL 8
SQL
-- Keep all users even if they have never placed an order
SELECT
  u.user_id,
  u.full_name,
  o.order_id,
  o.total_amount
FROM users AS u
LEFT JOIN orders AS o
  ON u.user_id = o.user_id;

يُعد نمط الاستبعاد الأيسر (Left Anti-Join) من أهم الأنماط الهندسية في SQL؛ إذ يُستخدم لاستخراج السجلات الموجودة في الجدول الأول والتي ليس لها أي سجل مقابل في الجدول الثاني (مثل العملاء المسجلين الذين لم يشتروا مطلقاً، أو المنتجات الراكدة). ويُبنى هذا النمط بدمج LEFT JOIN مع شرط WHERE right_table.primary_key IS NULL:

  • لماذا نفحص المفتاح الأساسي للجدول الأيمن؟ لأن المفتاح الأساسي لا يقبل القيمة الفارغة في أي صف حقيقي؛ وبالتالي فإن تحقق الشرط o.order_id IS NULL يعني قطعاً عدم وجود أي صف مرتبط في الجدول الأيمن.
SQL
-- Find customers who have never placed any order (Anti-Join)
SELECT
  u.user_id,
  u.full_name,
  u.email
FROM users AS u
LEFT JOIN orders AS o
  ON u.user_id = o.user_id
WHERE o.order_id IS NULL;

يعمل الربط الخارجي الأيمن RIGHT JOIN (أو RIGHT OUTER JOIN) كصورة معكوسة تماماً للربط الأيسر؛ إذ يحتفظ بجميع صفوف الجدول الأيمن المكتوب بعد RIGHT JOIN، ويملأ أعمدة الجدول الأيسر بالقيمة NULL عند غياب التطابق:

  • المعيار المهني لقابلية القراءة: يفضّل مهندسو قواعد البيانات عادةً كتابة الاستعلام بصيغة B LEFT JOIN A بدلاً من A RIGHT JOIN B، ليبقى الجدول الرئيسي المحتفظ بصفوفه في بداية جملة FROM دائماً.
SQL
-- Preserve all departments on the right even with 0 employees
SELECT
  d.dept_id,
  d.dept_name,
  e.emp_name
FROM employees AS e
RIGHT JOIN departments AS d
  ON e.dept_id = d.dept_id;

في استعلامات LEFT JOIN، يختلف سلوك الاستعلام جذرياً بحسب موضع كتابة شرط التصفية الخاص بأعمدة الجدول الأيمن بين جملة ON وجملة WHERE:

  • وضع الشرط داخل ON (AND o.status = 'paid'): يُطبَّق الشرط أثناء عملية المطابقة؛ فيبقى جميع المستخدمين في النتيجة، وتُعرض طلباتهم المدفوعة فقط أو NULL إن لم توجد.
  • وضع الشرط داخل WHERE (WHERE o.status = 'paid'): يُطبَّق الشرط بعد انتهاء الربط؛ وبما أن مقارنة NULL = 'paid' لا تتحقق، يتم حذف جميع المستخدمين غير المرتبطين، مما يحوّل LEFT JOIN بالخطأ إلى INNER JOIN!
SQL
-- Filter right-table rows inside ON to preserve all left rows
SELECT
  u.user_id,
  u.full_name,
  o.order_id,
  o.total_amount
FROM users AS u
LEFT JOIN orders AS o
  ON u.user_id = o.user_id
  AND o.status = 'paid';

عند تجميع نتائج LEFT JOIN باستخدام GROUP BY، يقع كثير من المطورين في فخ استدعاء COUNT(*)؛ فبما أن السجل الأيسر غير المرتبط يظل ممثلاً بصف واحد في النتيجة (مع قيم NULL في اليمين)، فإن COUNT(*) يحسب ذلك الصف ويعطي 1 بدلاً من 0! التزم دائماً بالقاعدتين التاليتين:

  • استخدم COUNT(right_table.pk): مرّر عمود المفتاح الأساسي للجدول الأيمن (COUNT(o.order_id)) ليتجاهل قيم NULL ويرجع 0 بدقة.
  • غلّف المجاميع بدالة COALESCE: استخدم COALESCE(SUM(o.total_amount), 0.00) لتحويل المجموع الفارغ إلى صفر رقمي نظيف.
SQL
-- Count right-table PK and coalesce NULL sums to zero
SELECT
  u.user_id,
  u.full_name,
  COUNT(o.order_id) AS orders_count,
  COALESCE(SUM(o.total_amount), 0.00) AS total_spent
FROM users AS u
LEFT JOIN orders AS o ON u.user_id = o.user_id
GROUP BY u.user_id, u.full_name;

يقارن الجدول التالي بين سلوك الربط الداخلي وأنواع الربط الخارجي في MySQL 8:

نوع الربطصفوف اليسار غير المتطابقةصفوف اليمين غير المتطابقةحالة الاستخدام الهندسي المثلى
INNER JOINتُستبعدتُستبعداسترجاع التقاطع الصارم للسجلات الموجودة في الجدولين معاً
LEFT JOINتبقى (واليمين NULL)تُستبعدتقارير تعرض جميع السجلات الرئيسية حتى لو لم تملك سجلات فرعية
LEFT JOIN ... WHERE r.pk IS NULLتبقى وحدها فقطتُستبعدنمط Anti-Join لاكتشاف السجلات التي لا تملك أي ارتباط
RIGHT JOINتُستبعدتبقى (واليسار NULL)الاحتفاظ بصفوف الجدول الثاني (ويُفضّل كتابتها بـ LEFT JOIN)

ملخص الدرس: تعرّفنا في هذا الدرس على آلية عمل LEFT JOIN وRIGHT JOIN للاحتفاظ بالسجلات غير المتطابقة، ونمط IS NULL لاكتشاف السجلات المفقودة، والفرق الحاسم بين وضع شروط الجدول الأيمن في ON مقابل WHERE، والعد الصحيح عبر COUNT(right.pk).
الخطوة التالية والدرس القادم: في الدرس القادم سندرس «الربط التبادلي CROSS JOIN والربط الذاتي SELF JOIN في MySQL» لتوليد التوافيق واستعراض الجداول الهرمية.

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

ملخص الدرس

حصاد الدرس

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

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

يضمن LEFT JOIN الاحتفاظ بجميع صفوف الجدول الرئيسي ويمكّنك من بناء استعلامات Anti-Join والتجميع الدقيق عبر COUNT(right.pk). الخطوة التالية: انتقل إلى درس «الربط التبادلي CROSS JOIN والربط الذاتي SELF JOIN في MySQL».

مشاركة

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

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

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

المصطلحات5

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

0 / 5 مفهومةأول بطاقة، أول خطوة
01 Outer Joins الربط الخارجي
تعلّم الربط الخارجي LEFT JOIN و RIGHT JOIN في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
للمراجعة
02 Preserving Unmatched Rows LEFT JOIN الربط الخارجي الأيسر LEFT JOIN
المفهوم الهندسي والصياغة العملية الخاصة بقسم الربط الخارجي الأيسر LEFT JOIN في MySQL 8.
للمراجعة
03 Finding Missing Records Anti Join اكتشاف السجلات غير المرتبطة
المفهوم الهندسي والصياغة العملية الخاصة بقسم اكتشاف السجلات غير المرتبطة في MySQL 8.
للمراجعة
04 Right Table Preservation RIGHT JOIN الربط الخارجي الأيمن RIGHT JOIN
المفهوم الهندسي والصياغة العملية الخاصة بقسم الربط الخارجي الأيمن RIGHT JOIN في MySQL 8.
للمراجعة
05 ON vs WHERE Join Condition شرط الربط ON مقابل WHERE
المفهوم الهندسي والصياغة العملية الخاصة بقسم شرط الربط ON مقابل WHERE في MySQL 8.
للمراجعة

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

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

الاختصارات2

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

0 / 2 مفهومةأول بطاقة، أول خطوة
01 LEFT JOIN LEFT JOIN
Left Outer Join
ربط خارجي يحتفظ بجميع صفوف الجدول الأيسر ويملأ أعمدة الجدول الأيمن غير المتطابقة بالقيمة NULL.
للمراجعة
02 ANTI-JOIN ANTI-JOIN
Relational Anti-Semi-Join Pattern
نمط استعلام يرجع صفوف الجدول الأيسر التي لا تملك أي صف مطابق في الجدول الأيمن.
للمراجعة

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

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

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

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

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

  2. بدّل بين الحالات التفاعلية في قسم اكتشاف السجلات غير المرتبطة وقارن كيف ينفّذ محرك MySQL 8 كل استعلام.

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

مساحة التحدي

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

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

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

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

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

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

عند تنفيذ LEFT JOIN بين جدول المستخدمين (يساراً) وجدول الطلبات (يميناً)، ماذا يظهر في أعمدة الطلبات للمستخدم الذي لم يسجل أي طلب؟

تذكّر كيف يتعامل LEFT JOIN مع أعمدة الجدول الأيمن عند عدم وجود تطابق.

02

ما هو شرط WHERE الذي يكمل نمط Anti-Join مع LEFT JOIN لاستخراج المستخدمين الذين ليس لديهم أي طلبات؟

افحص المفتاح الأساسي للجدول الأيمن للتأكد من كونه فارغاً NULL.

03

ماذا يحدث إذا كتبت LEFT JOIN orders o ON u.id = o.user_id ثم أضفت الشرط WHERE o.status = 'paid'؟

فكّر كيف يتعامل شرط WHERE مع القيم الفارغة NULL في أعمدة الجدول الأيمن.

04

عند حساب عدد الطلبات لكل عميل في استعلام LEFT JOIN، لماذا يجب استخدام COUNT(o.order_id) بدلاً من COUNT(*)؟

قارن بين تعامل COUNT(*) وCOUNT(column) مع الصف الذي يحتوي على NULL في الجانب الأيمن.

05

يمكن إعادة كتابة أي استعلام RIGHT JOIN إلى استعلام LEFT JOIN مكافئ تماماً عن طريق عكس ترتيب الجدولين.

تذكّر العلاقة التناظرية بين الربط الأيسر والربط الأيمن.