بسم الله الرحمن الرحيم
عنوان الدرس : الاستعلامات المتقدمة في MySQL - الجزء الثالث
الرابطة الخارجية outer join
تدعى الرابطة الخارجية باسم الرابطة اليسارية left join و عندما تكتب استعلاماً يستخدم الرابطة الخارجية ستستخدم العبارة left join و ليس العبارة outer join
أكتب لنا استعلاماً يعيد ما يلي:
اسم الموظف name و راتبه salary و كل المعلومات المتعلقة به و الموجودة في الجدول adrs
طبعاً ستكتب أنت الاستعلام التالي:
select name , salaty , adrs.* from emp , adrs
where
emp.emp_no = adrs.emp_no ;
ستكون النتيجة هي:
emp_email |
state |
emp_no |
add_no |
salary |
name |
omar@mail.sy |
Syria |
1 |
1 |
12000 |
omar |
nour@lycos.com |
Egypt |
2 |
2 |
8000 |
nour |
ameen@lycos.com |
Yemen |
4 |
3 |
5000 |
ameen |
NULL |
Syria |
3 |
4 |
5000 |
ahmed |
طبعاً أنت لاحظت عدم وجود السجل الخاص بالموظف أسامة الذي يملك سجلاً في جدول الموظفين emp و ليس له سجل في الجدول adrs, و بالتالي فإن الرابطة المشتركة لن تفي بالغرض و كذلك الأمر بالنسبة للرابطة الداخلية كونها (كما قلنا سابقاً) أنها عبارة عن شكل آخر للرابطة المشتركة.
قدمت لنا MySQL ما يسمى بالرابطة الخارجية التي تستطيع أن تظهر لنا السجل الخاص بالموظف أسامة, سنكتب هذا الاستعلام أولاً ثم نعلق عليه.
select name , salary , adrs.* from emp
left join adrs on emp._emp_no = adrs.emp_no ;
و ستكون النتيجة كما يلي:
+---------------+--------------+---------------+---------------+---------------+-------------------------+
|name |salary |add_no |emp_no |state |emp_email |
+---------------+--------------+---------------+---------------+---------------+-------------------------+
|Omar |12000 |1 |1 |Syria | mar@mail.sy">omar@mail.sy |
|nour |8000 |2 |2 |Egypt | nour@lycos.com |
|ahmad |5000 |4 |3 |Syria |NULL |
|ameen |5000 |3 |4 |Yemen | ameen@lycos.com |
|osama |9000 |NULL |NULL |NULL |NULL |
+---------------+--------------+---------------+---------------+---------------+-------------------------+
إذن تقوم الرابطة
left join بمقارنة تحقق الشرط بين الجدول الوارد بعد العبارة from (و الذي سنسميه
الجدول الرئيسي و هو في مثالنا هذا الجدول emp) و الجدول الوارد بعد العبارة left join
(و الذي سنسميه بالجدول الثانوي و هو في مثالنا هذا الجدول adrs) فيعيد السجلات التي تطابق الشرط, و أما السجلات التي لا تطابق الشرط فإنها (أي الرابط اليسارية) تفعل ما يلي:
1. تقوم بطباعة الحقول (أي الأعمدة) المطلوبة من الجدول الرئيسي.
2. يقوم بطباعة الكلمة NULL مكان الحقول المحددة في الاستعلام من الجدول الثانوي.
3. يهمل جميع السجلات التي توجد في الجدول الثانوي و الغير موجودة في الجدول الرئيسي.
و بالتالي فإن التبديل بين مواقع الجداول في الاستعلامات ذات الروابط اليسارية تعطينا نتائج مختلفة و ليس مثل الروابط الداخلية التي لا تؤثر عملية التبديل في النتائج.
حسناً .. كيف سنميز بين أن هذا الجدول هو جدول رئيسي و أن ذاك الجدول هو جدول ثانوي؟
الأمر بسيط جداً إذ أن الجدول الثانوي هو الجدول الذي يحوي على المفتاح الغريب foreign key و الذي يشير إلى المفتاح الأساسي في الجدول الآخر, و الذي هو بدوره يكون الجدول الأساسي في الاستعلامات ذات الرابطة اليسارية.
ملاحظة: يفضل استخدام الروابط الخارجية على الروابط الداخلية عند كتابة استعلامات من أكثر من جدول.
و آخر دعوانا أن الحمد لله رب العالمين
أخوكم أبـو عمر