MySQL انضم: داخلي، خارجي، يسار، يمين، متقاطع

⚡ ملخص ذكي

MySQL تجمع عمليات الربط (JOIN) صفوفًا من جدولين أو أكثر من الجداول المرتبطة في مجموعة نتائج واحدة. يشرح هذا المورد عمليات الربط المتقاطع (CROSS)، والربط الداخلي (INNER)، والربط الأيسر (LEFT)، والربط الأيمن (RIGHT)، والربط الخارجي (OUTER JOIN) مع استعلامات قابلة للتنفيذ، وبيانات نموذجية، وجداول مخرجات واضحة لتطبيقات عملية في قواعد البيانات.

  • 🔗 المبدأ الأساسي: تقوم عملية الربط (JOIN) بمطابقة الصفوف عبر الجداول باستخدام علاقات المفتاح الأساسي والمفتاح الخارجي.
  • ⚡ لماذا يهم: تستخدم استعلامات JOIN الفهرسة وتقلل من عدد مرات الوصول إلى الخادم مقارنةً بالعديد من الاستعلامات المنفصلة.
  • ✖️ سلوك الانضمام المتقاطع: كل صف من الجدول الأول يرتبط بكل صف من الجدول الثاني، مما ينتج عنه حاصل ضرب ديكارتي.
  • 🎯 سلوك الانضمام الداخلي: يتم إرجاع الصفوف التي تستوفي شرط المطابقة في كلا الجدولين فقط.
  • ↔️ سلوك الربط الخارجي: كما تقوم عمليات الربط LEFT و RIGHT JOIN بإرجاع الصفوف غير المتطابقة وملء الأعمدة المفقودة بـ NULL.
  • 🧩 تشغيل مقابل استخدام: يتطلب استخدام عبارة USING أسماء أعمدة متطابقة، بينما تدعم عبارة ON أي تعبير مطابق.

MySQL تنضم

ما هي الصلات؟

تساعد عمليات الانضمام في استرداد البيانات من جدولين أو أكثر من جداول قاعدة البيانات.

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

ملاحظة: تُعدّ عملية الربط (JOIN) من أكثر المواضيع التي يساء فهمها بين متعلمي لغة SQL. ولتبسيط الأمر وتسهيل فهمه، سنستخدم قاعدة بيانات جديدة كمثال عملي. كما هو موضح أدناه.

تستخدم جميع الأمثلة أدناه هذين الجدولين. movie_id العمود في الأعضاء يشير إلى id العمود في أفلام — العلاقة التي تتطابق عليها كل عملية ربط.

الأعضاء

id الاسم الاول الكنية movie_id
1 ادم سميث 1
2 مسرورون كومار 2
3 Susan ديفيدسون 5
4 أنثي الطائر أدريانا 8
5 لي بونغ 10

أفلام

id الاسم الفئة
1 قاتل العقيدة: الجمر الرسوم المتحركة
2 الصلب الحقيقي (2012) الرسوم المتحركة
3 ألفين والسنجاب و الرسوم المتحركة
4 مغامرات تن تن الرسوم المتحركة
5 سيف (2012) اكشن
6 البيت الآمن (2012) اكشن
7 الجماعة الإسلامية المسلحة 18+
8 الموعد النهائي 2009 18+
9 الصورة القذرة 18+
10 مارلي وأنا رومانس

لماذا يجب علينا استخدام عمليات الربط (JOINS)؟

قبل النظر في كل نوع من أنواع JOIN، يجدر معرفة سبب تفضيل JOIN على تشغيل عدة استعلامات.

الآن قد تفكر في سبب استخدامنا لـ JOINs عندما يمكننا القيام بنفس المهمة من خلال تشغيل الاستعلامات. خاصة إذا كان لديك بعض الخبرة في برمجة قواعد البيانات، فأنت تعلم أنه يمكننا تشغيل الاستعلامات واحدًا تلو الآخر، واستخدام مخرجات كل منها في استعلامات متتالية. بالطبع، هذا ممكن. ولكن باستخدام JOINs، يمكنك إنجاز العمل باستخدام استعلام واحد فقط مع أي معلمات بحث. على الجانب الآخر MySQL يمكن أن يحقق أداء أفضل مع JOINs حيث يمكنه استخدام الفهرسة. ما عليك سوى استخدام استعلام JOIN واحد بدلاً من تشغيل استعلامات متعددة مما يؤدي إلى تقليل الحمل الزائد على الخادم. استخدام استعلامات متعددة بدلاً من ذلك يؤدي إلى المزيد من عمليات نقل البيانات فيما بينها MySQL والتطبيقات (البرمجيات). علاوة على ذلك، فإنه يتطلب المزيد من معالجة البيانات في نهاية التطبيق أيضًا.

ومن الواضح أنه يمكننا تحقيق ما هو أفضل MySQL وأداء التطبيق عن طريق استخدام الصلات.

أنواع الوصلات

MySQL يدعم هذا النظام عدة أنواع من عمليات الربط (JOIN)، يجيب كل منها على سؤال مختلف حول نفس الجدولين. يقارن الجدول أدناه بينها؛ ثم يتم توضيح كل نوع من خلال استعلام ونتائجه.

نوع الانضمام صفوف العودة هل توجد قيم فارغة في النتيجة؟ الاستخدام النموذجي
الصليب الانضمام كل صف من الجدول أ مقترن بكل صف من الجدول ب لا توليد جميع التركيبات الممكنة
INNER JOIN الصفوف التي تطابق الشرط في كلا الجدولين فقط لا الأعضاء الذين استأجروا فيلمًا بالفعل
LEFT JOIN جميع الصفوف من الجدول الأيسر، بالإضافة إلى المباريات من الجدول الأيمن نعم، على الجانب الأيمن جميع الأفلام، حتى تلك التي لم يتم استئجارها مطلقًا
الانضمام الصحيح جميع الصفوف من الجدول الأيمن، بالإضافة إلى المباريات من الجدول الأيسر نعم، على الجانب الأيسر جميع الأفلام، حتى تلك التي لا يوجد بها أي عضو مشارك

الصليب الانضمام

يعد Cross JOIN أبسط أشكال JOIN التي تطابق كل صف من جدول قاعدة بيانات واحد مع جميع الصفوف في جدول آخر.

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

لنفترض أننا نريد الحصول على جميع سجلات الأعضاء مقابل جميع سجلات الأفلام، يمكننا استخدام البرنامج النصي الموضح أدناه للحصول على النتائج المرجوة.

أنواع الصلات

SELECT * FROM `movies` CROSS JOIN `members`

تنفيذ البرنامج النصي أعلاه في MySQL طاولة العمل ويعطينا النتائج التالية.

id title id first_name last_name movie_id
1 ASSASSIN'S CREED: EMBERS Animations 1 Adam Smith 1
1 ASSASSIN'S CREED: EMBERS Animations 2 Ravi Kumar 2
1 ASSASSIN'S CREED: EMBERS Animations 3 Susan Davidson 5
1 ASSASSIN'S CREED: EMBERS Animations 4 Jenny Adrianna 8
1 ASSASSIN'S CREED: EMBERS Animations 6 Lee Pong 10
2 Real Steel(2012) Animations 1 Adam Smith 1
2 Real Steel(2012) Animations 2 Ravi Kumar 2
2 Real Steel(2012) Animations 3 Susan Davidson 5
2 Real Steel(2012) Animations 4 Jenny Adrianna 8
2 Real Steel(2012) Animations 6 Lee Pong 10
3 Alvin and the Chipmunks Animations 1 Adam Smith 1
3 Alvin and the Chipmunks Animations 2 Ravi Kumar 2
3 Alvin and the Chipmunks Animations 3 Susan Davidson 5
3 Alvin and the Chipmunks Animations 4 Jenny Adrianna 8
3 Alvin and the Chipmunks Animations 6 Lee Pong 10
4 The Adventures of Tin Tin Animations 1 Adam Smith 1
4 The Adventures of Tin Tin Animations 2 Ravi Kumar 2
4 The Adventures of Tin Tin Animations 3 Susan Davidson 5
4 The Adventures of Tin Tin Animations 4 Jenny Adrianna 8
4 The Adventures of Tin Tin Animations 6 Lee Pong 10
5 Safe (2012) Action 1 Adam Smith 1
5 Safe (2012) Action 2 Ravi Kumar 2
5 Safe (2012) Action 3 Susan Davidson 5
5 Safe (2012) Action 4 Jenny Adrianna 8
5 Safe (2012) Action 6 Lee Pong 10
6 Safe House(2012) Action 1 Adam Smith 1
6 Safe House(2012) Action 2 Ravi Kumar 2
6 Safe House(2012) Action 3 Susan Davidson 5
6 Safe House(2012) Action 4 Jenny Adrianna 8
6 Safe House(2012) Action 6 Lee Pong 10
7 GIA 18+ 1 Adam Smith 1
7 GIA 18+ 2 Ravi Kumar 2
7 GIA 18+ 3 Susan Davidson 5
7 GIA 18+ 4 Jenny Adrianna 8
7 GIA 18+ 6 Lee Pong 10
8 Deadline(2009) 18+ 1 Adam Smith 1
8 Deadline(2009) 18+ 2 Ravi Kumar 2
8 Deadline(2009) 18+ 3 Susan Davidson 5
8 Deadline(2009) 18+ 4 Jenny Adrianna 8
8 Deadline(2009) 18+ 6 Lee Pong 10
9 The Dirty Picture 18+ 1 Adam Smith 1
9 The Dirty Picture 18+ 2 Ravi Kumar 2
9 The Dirty Picture 18+ 3 Susan Davidson 5
9 The Dirty Picture 18+ 4 Jenny Adrianna 8
9 The Dirty Picture 18+ 6 Lee Pong 10
10 Marley and me Romance 1 Adam Smith 1
10 Marley and me Romance 2 Ravi Kumar 2
10 Marley and me Romance 3 Susan Davidson 5
10 Marley and me Romance 4 Jenny Adrianna 8
10 Marley and me Romance 6 Lee Pong 10

INNER JOIN

تُعيد عملية الربط المتقاطع (CROSS JOIN) جميع الأزواج الممكنة، وهو أمر نادرًا ما يكون مطلوبًا. أما عملية الربط الداخلي (INNER JOIN) فتُضيّق نطاق النتائج لتقتصر على الأزواج المرتبطة فعليًا.

يتم استخدام JOIN الداخلي لإرجاع الصفوف من كلا الجدولين التي تستوفي الشرط المحدد.

لنفترض أنك تريد الحصول على قائمة بالأعضاء الذين استأجروا أفلامًا مع عناوين الأفلام التي استأجروها. يمكنك ببساطة استخدام INNER JOIN لذلك، والذي يُعيد صفوفًا من كلا الجدولين تُحقق الشروط المُحددة.

INNER JOIN

SELECT members.`first_name` , members.`last_name` , movies.`title`
FROM members ,movies
WHERE movies.`id` = members.`movie_id`

تنفيذ البرنامج النصي أعلاه يعطي

first_name last_name title
Adam Smith ASSASSIN'S CREED: EMBERS
Ravi Kumar Real Steel(2012)
Susan Davidson Safe (2012)
Jenny Adrianna Deadline(2009)
Lee Pong Marley and me

لاحظ أنه يمكن أيضًا كتابة نص النتائج أعلاه على النحو التالي لتحقيق نفس النتائج.

SELECT A.`first_name` , A.`last_name` , B.`title`
FROM `members` AS A
INNER JOIN `movies` AS B
ON B.`id` = A.`movie_id`

الصلات الخارجية

تقوم عملية الربط الداخلي (INNER JOIN) بحذف الصفوف التي ليس لها نظير دون تنبيه. وعندما تكون هذه الصفوف غير المتطابقة مهمة، فإن عملية الربط الخارجي (OUTER JOIN) هي الخيار الأمثل.

MySQL تُعيد عمليات الربط الخارجي جميع السجلات المتطابقة من كلا الجدولين.

يمكنه اكتشاف السجلات التي ليس لها تطابق في الجدول المرتبط. يعود اغية قيم سجلات الجدول المرتبط إذا لم يتم العثور على تطابق.

يبدو الأمر مربكاً؟ دعونا نلقي نظرة على مثال –

LEFT JOIN

افترض الآن أنك تريد الحصول على عناوين جميع الأفلام مع أسماء الأعضاء الذين استأجروها. ومن الواضح أن بعض الأفلام لم يتم تأجيرها من قبل أي شخص. يمكننا ببساطة استخدام LEFT JOIN لغرض.

الصلات الخارجية

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

SELECT A.`title` , B.`first_name` , B.`last_name`
FROM `movies` AS A
LEFT JOIN `members` AS B
ON B.`movie_id` = A.`id`

تنفيذ البرنامج النصي أعلاه في MySQL يُظهر برنامج Workbench النتائج التالية. ستلاحظ في النتائج المعروضة أدناه أن حقول أسماء الأعضاء للأفلام غير المستأجرة تحتوي على قيم فارغة (NULL). هذا يعني عدم وجود عضو مطابق في جدول الأعضاء لهذا الفيلم تحديدًا.

title first_name last_name
ASSASSIN'S CREED: EMBERS Adam Smith
Real Steel(2012) Ravi Kumar
Safe (2012) Susan Davidson
Deadline(2009) Jenny Adrianna
Marley and me Lee Pong
Alvin and the Chipmunks NULL NULL
The Adventures of Tin Tin NULL NULL
Safe House(2012) NULL NULL
GIA NULL NULL
The Dirty Picture NULL NULL
Note: Null is returned for non-matching rows on right

الانضمام الصحيح

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

في مثالنا، لنفترض أنك بحاجة إلى الحصول على أسماء الأعضاء والأفلام التي استأجروها. الآن لدينا عضو جديد لم يستأجر أي فيلم بعد

الانضمام الصحيح

SELECT A.`first_name` , A.`last_name`, B.`title`
FROM `members` AS A
RIGHT JOIN `movies` AS B
ON B.`id` = A.`movie_id`

تنفيذ البرنامج النصي أعلاه في MySQL يعطي workbench النتائج التالية.

first_name last_name title
Adam Smith ASSASSIN'S CREED: EMBERS
Ravi Kumar Real Steel(2012)
Susan Davidson Safe (2012)
Jenny Adrianna Deadline(2009)
Lee Pong Marley and me
NULL NULL Alvin and the Chipmunks
NULL NULL The Adventures of Tin Tin
NULL NULL Safe House(2012)
NULL NULL GIA
NULL NULL The Dirty Picture
Note: Null is returned for non-matching rows on left

جملتي "ON" و"USING".

كل استعلام حتى الآن طابق الصفوف باستخدام عبارة ON. MySQL يوفر بديلاً أقصر عندما تشترك الأعمدة المتطابقة في نفس الاسم.

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

يمكن أيضًا استخدام جملة USING لنفس الغرض. الفرق مع باستخدام هل هو يجب أن يكون له أسماء متطابقة للأعمدة المتطابقة في كلا الجدولين.

في جدول "الأفلام" استخدمنا حتى الآن مفتاحه الأساسي بالاسم "id". لقد أشرنا إلى نفس الشيء في جدول "الأعضاء" بالاسم "movie_id".

دعونا نعيد تسمية الحقل "معرف" جداول "الأفلام" ليكون له اسم "movie_id". نحن نفعل ذلك من أجل الحصول على أسماء الحقول المتطابقة المتطابقة.

ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;

بعد ذلك، لنستخدم الاستخدام مع مثال LEFT JOIN أعلاه.

SELECT A.`title` , B.`first_name` , B.`last_name`
FROM `movies` AS A
LEFT JOIN `members` AS B
USING ( `movie_id` )

بصرف النظر عن استخدام ON و الاستخدام مع الصلات يمكنك استخدام العديد من الآخرين MySQL عبارات مثل GROUP BY، أين وحتى وظائف مثل مجموع, AVG، الخ.

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

تجمع عملية الربط (JOIN) أعمدة من جدولين جنبًا إلى جنب، وتطابق الصفوف بناءً على مفتاح. أما عملية الاتحاد (UNION) فتُرصّ نتائج استعلامين عموديًا، وتتطلب تطابق عدد الأعمدة وأنواعها.

نعم. قم بربط عبارات JOIN إضافية، كل منها بشرط ON خاص بها. MySQL يقوم بربط الجدولين الأولين، ثم يربط تلك النتيجة الوسيطة بالجدول التالي، وهكذا.

تربط عملية الربط الذاتي (SELF JOIN) جدولاً بنفسه باستخدام اسمين مستعارين. وتقارن هذه العملية الصفوف داخل جدول واحد، مثل مطابقة صف موظف مع صف مدير ذلك الموظف.

نعم. مساعدو الذكاء الاصطناعي المدمجون في برامج التحرير مثل MySQL طاولة العمل يمكنك صياغة استعلامات JOIN من موجه بلغة بسيطة. راجع دائمًا شروط ON المُنشأة، لأن المفتاح غير الصحيح يُنتج نتائج خاطئة دون أن يظهر ذلك في النص.

جزئياً. يقترح مستشارو الذكاء الاصطناعي فهارس وترتيبات ربط أفضل، مما يقلل وقت التنفيذ في كثير من الأحيان. ومع ذلك، لا يزال مُحسِّن الاستعلام هو من يختار الخطة النهائية، لذا يبقى الفهرسة الصحيحة لمفاتيح الربط العامل الأهم.

تلخيص هذه التدوينة بـ: