أنواع الربط في SQL: الفرق بين INNER JOIN وOUTER JOIN مع أمثلة عملية
مقدمة: لماذا نحتاج إلى JOIN في SQL؟
في قواعد البيانات العلائقية، من الأفضل تخزين كل معلومة مرة واحدة فقط لتجنّب التكرار وتعارض البيانات. لكن عملياً، غالباً ما تكون المعلومات المرتبطة موزعة على أكثر من جدول. هنا تظهر أهمية جملة JOIN في SQL، إذ تتيح لك دمج البيانات المرتبطة من عدة جداول في نتيجة واحدة قابلة للتحليل والاستخدام.
على سبيل المثال، قد يكون لديك جدول للحيوانات الأليفة وجدول آخر للمالكين. كل جدول يؤدي وظيفة مختلفة، لكنك قد تحتاج إلى عرض اسم الحيوان بجانب اسم مالكه. في هذه الحالة، تستخدم JOIN لربط الجدولين اعتماداً على العلاقة بينهما.

ما هو JOIN في SQL؟
المعامل JOIN هو أداة تُستخدم لدمج الصفوف من جدولين أو أكثر بناءً على شرط ارتباط معيّن. هذا الشرط يُكتب عادة باستخدام الكلمة ON لتحديد الأعمدة المرتبطة بين الجداول.
تنقسم أنواع الربط غالباً إلى فئتين رئيسيتين:
INNER JOINOUTER JOIN
الفرق الجوهري بينهما هو أن INNER JOIN يعرض فقط البيانات المشتركة بين الجدولين، بينما OUTER JOIN يمكنه الاحتفاظ أيضاً بالبيانات غير المرتبطة من أحد الجدولين أو كليهما، بحسب النوع المستخدم.
كيف يعمل INNER JOIN؟
يُستخدم INNER JOIN عندما تريد إظهار الصفوف التي لها تطابق فعلي في كلا الجدولين فقط. بمعنى آخر، إذا لم توجد علاقة بين صف في الجدول الأول وصف في الجدول الثاني، فلن يظهر هذا الصف في النتائج.
إذا تخيلت الجدولين على شكل مخطط تقاطعي، فإن نتيجة INNER JOIN تمثل منطقة التقاطع فقط.
صيغة INNER JOIN
SELECT *
FROM table1
JOIN table2
ON relation;
في هذا النوع من الربط، تُعرض فقط الصفوف التي تحقق شرط العلاقة المحدد في ON.
ما هو OUTER JOIN في SQL؟
إذا كنت لا تريد الاكتفاء بالصفوف المشتركة فقط، وتحتاج إلى الاحتفاظ بالبيانات غير المرتبطة أيضاً، فعندها تستخدم OUTER JOIN. هذا النوع مناسب جداً عند فحص البيانات الناقصة، أو اكتشاف السجلات التي لا تملك علاقة مقابلة في جدول آخر.
تنقسم أنواع OUTER JOIN إلى ثلاثة أنواع رئيسية:
LEFT JOINRIGHT JOINFULL JOIN
عندما لا توجد قيمة مقابلة في أحد الجداول، يتم ملء الحقل الناتج بالقيمة NULL.
ملاحظة مهمة: النوع LEFT JOIN هو الأكثر دعماً في معظم أنظمة SQL، بينما قد لا يتوفر RIGHT JOIN أو FULL JOIN في بعض المحركات أو الإصدارات.
شرح LEFT OUTER JOIN
يحافظ LEFT JOIN على جميع الصفوف الموجودة في الجدول الأيسر، حتى لو لم يكن لها تطابق في الجدول الأيمن. وإذا لم توجد بيانات مرتبطة من الجدول الثاني، فستظهر قيم NULL في الأعمدة المقابلة.
صيغة LEFT JOIN
SELECT columns
FROM table1
LEFT JOIN table2
ON relation;
شرح RIGHT OUTER JOIN
يحافظ RIGHT JOIN على جميع الصفوف الموجودة في الجدول الأيمن، حتى لو لم يكن لها تطابق في الجدول الأيسر. وإذا غابت البيانات المقابلة من الجدول الأول، فستظهر قيمة NULL في النتيجة.
صيغة RIGHT JOIN
SELECT columns
FROM table1
RIGHT JOIN table2
ON relation;
شرح FULL OUTER JOIN
يمكن اعتبار FULL JOIN مزيجاً بين LEFT JOIN وRIGHT JOIN. فهو يحتفظ بكل الصفوف من الجدولين معاً، سواء وُجد تطابق أم لا. وعند غياب البيانات المقابلة من أحد الجانبين، يتم تعويضها بالقيمة NULL.
صيغة FULL JOIN
SELECT columns
FROM table1
FULL JOIN table2
ON relation;
مثال عملي على أنواع JOIN في SQL
لنفترض أن لدينا قاعدة بيانات لعيادة بيطرية. يمكن أن تحتوي على جدول باسم pets لتخزين بيانات الحيوانات الأليفة، وجدول باسم owners لتخزين بيانات المالكين. وبما أن المالك الواحد قد يمتلك أكثر من حيوان أليف، فإن جدول pets يحتوي على العمود owner_id الذي يشير إلى العمود id في جدول owners.
بيانات جدول pets
| id | name | age | owner_id |
|---|---|---|---|
| 1 | Fido | 7 | 1 |
| 2 | Missy | 3 | 1 |
| 3 | Sissy | 10 | 2 |
| 4 | Copper | 1 | 3 |
| 5 | Hopper | 2 | 0 |
بيانات جدول owners
| id | name | phone_number |
|---|---|---|
| 1 | Johnny | 4567823 |
| 2 | Olly | 7486513 |
| 3 | Ilenia | 3481365 |
| 4 | Luise | 1685364 |
الهدف هو إظهار اسم الحيوان الأليف بجانب اسم المالك باستخدام أنواع الربط المختلفة.
مثال INNER JOIN
باستخدام INNER JOIN، ستظهر فقط السجلات التي لها علاقة فعلية بين الجدولين. سنقوم باختيار العمود name من جدول pets وإعادة تسميته إلى pet_name، ثم اختيار العمود name من جدول owners وإعادة تسميته إلى owner.
SELECT pets.name AS pet_name, owners.name AS owner
FROM pets
JOIN owners ON pets.owner_id = owners.id;
النتيجة ستكون كالتالي:
| pet_name | owner |
|---|---|
| Fido | Johnny |
| Missy | Johnny |
| Sissy | Olly |
| Copper | Ilenia |
نلاحظ أن الحيوان Hopper لم يظهر، لأنه غير مرتبط بأي مالك في الجدول الآخر. كذلك لم تظهر المالكة Luise لأنها لا تملك حيواناً مسجلاً.
مثال LEFT JOIN
إذا استخدمت LEFT JOIN مع بقاء جدول pets على اليسار، فستحصل على جميع الحيوانات الأليفة، سواء كانت مرتبطة بمالك أم لا.
SELECT pets.name AS pet_name, owners.name AS owner
FROM pets
LEFT JOIN owners ON pets.owner_id = owners.id;
النتيجة:
| pet_name | owner |
|---|---|
| Fido | Johnny |
| Missy | Johnny |
| Sissy | Olly |
| Copper | Ilenia |
| Hopper | NULL |
هذا يكشف أن هناك حيواناً أليفاً غير مرتبط بمالك مسجل، وهو Hopper.
مثال RIGHT JOIN
باستخدام RIGHT JOIN، سيتم الاحتفاظ بجميع صفوف جدول owners لأنه يقع على اليمين في الاستعلام.
SELECT pets.name AS pet_name, owners.name AS owner
FROM pets
RIGHT JOIN owners ON pets.owner_id = owners.id;
النتيجة:
| pet_name | owner |
|---|---|
| Fido | Johnny |
| Missy | Johnny |
| Sissy | Olly |
| Copper | Ilenia |
| NULL | Luise |
يتضح هنا أن Luise موجودة في قاعدة البيانات كمالكة، لكنها لا تملك أي حيوان أليف مسجل.
مثال FULL JOIN
أما FULL JOIN فيحتفظ بجميع الصفوف من الجدولين، لذلك ستظهر كل الحيوانات وكل المالكين سواء وُجدت علاقة بينهم أم لا.
SELECT pets.name AS pet_name, owners.name AS owner
FROM pets
FULL JOIN owners ON pets.owner_id = owners.id;
النتيجة:
| pet_name | owner |
|---|---|
| Fido | Johnny |
| Missy | Johnny |
| Sissy | Olly |
| Copper | Ilenia |
| Hopper | NULL |
| NULL | Luise |
هذا النوع مفيد جداً عند تدقيق جودة البيانات واكتشاف السجلات غير المكتملة في كلا الجدولين.
مقارنة سريعة بين أنواع JOIN
| النوع | ما الذي يحتفظ به؟ | أفضل استخدام |
|---|---|---|
INNER JOIN |
الصفوف المشتركة فقط | عند الحاجة إلى البيانات المرتبطة حصراً |
LEFT JOIN |
كل صفوف الجدول الأيسر + المتطابق من الأيمن | اكتشاف السجلات التي لا تملك تطابقاً في الجدول الثاني |
RIGHT JOIN |
كل صفوف الجدول الأيمن + المتطابق من الأيسر | فحص السجلات غير المرتبطة في الجدول الأيسر |
FULL JOIN |
جميع صفوف الجدولين | تحليل شامل واكتشاف البيانات الناقصة من الجانبين |
متى تختار نوع الربط المناسب؟
- استخدم
INNER JOINعندما تريد عرض البيانات التي لها علاقة مؤكدة بين الجدولين. - استخدم
LEFT JOINعندما يكون الجدول الأول هو الأساس، وتريد رؤية جميع صفوفه حتى لو لم يوجد تطابق. - استخدم
RIGHT JOINعندما يكون الجدول الثاني هو الأهم في نتيجة الاستعلام. - استخدم
FULL JOINإذا كان هدفك التحليل الشامل واكتشاف كل حالات النقص أو الانفصال بين الجداول.
نصائح عملية عند استخدام JOIN في SQL
- احرص على كتابة شرط
ONبدقة، لأن أي خطأ فيه قد يؤدي إلى نتائج مضللة. - استخدم أسماء مستعارة للأعمدة عبر
ASلتسهيل قراءة النتائج، خاصة عندما تتكرر أسماء الأعمدة بين الجداول. - تأكد من وجود فهارس على أعمدة الربط مثل
idوowner_idلتحسين الأداء في الجداول الكبيرة. - افهم اتجاه الربط جيداً في
LEFT JOINوRIGHT JOIN، لأن تبديل مواقع الجداول يغيّر النتيجة. - تعامل مع قيم
NULLبحذر، فهي غالباً مؤشر على بيانات مفقودة أو غير مرتبطة.
الخلاصة التقنية
فهم أنواع JOIN في SQL ليس مجرد معرفة بصيغة الاستعلام، بل هو جزء أساسي من بناء تحليلات دقيقة واستخراج معلومات موثوقة من قواعد البيانات. إذا كان هدفك هو إظهار العلاقات الفعلية فقط، فاختر INNER JOIN. أما إذا كنت تريد تحليل السجلات الناقصة أو غير المرتبطة، فإن أنواع OUTER JOIN تمنحك مرونة أكبر. من الناحية العملية، يُعد LEFT JOIN الأكثر استخداماً، لأنه متوفر على نطاق واسع ويغطي كثيراً من سيناريوهات العمل اليومية بكفاءة ووضوح.