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

ما هي الصلات؟
تساعد عمليات الانضمام في استرداد البيانات من جدولين أو أكثر من جداول قاعدة البيانات.
ترتبط الجداول ببعضها البعض باستخدام المفاتيح الأساسية والأجنبية.
ملاحظة: تُعدّ عملية الربط (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 لذلك، والذي يُعيد صفوفًا من كلا الجدولين تُحقق الشروط المُحددة.
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 |
الانضمام الصحيح
من الواضح أن 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 |
جملتي "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، الخ.




