الرابطة الداخلية هي عبارة عن شكل آخر للرابطة المشتركة equal join أي أنهما يؤديان نفس الوظيفة ويستخدمان لنفس الهدف أما الفارق الوحيد بينهما فهو الصيغة القواعدية فقط.
لنعد إلى نفس المثال الذي في الدرس السابق وهو :
كتابة استعلاماً يعيد لنا:
اسم الموظف ورقمه وولايته.
الحل:
سأقوم بكتابة هذا الاستعلام بطريقة الرابطة المشتركة equal join كما يلي:
select emp.emp_no , name , state from emp , adrs
where
emp.emp_no = adrs.emp_no
والآن سأقوم بكتابة نفس الاستعلام السابق بطريقة الرابطة الداخلية inner join كما يلي:
select emp.emp_no , name , state from emp
inner join adrs on emp.emp_no = adrs.emp_no
قارن بين الحلين, ستجد أن الجدول الذي جاء بعد الكلمة المفتاحية from هو نفس الجدول الذي اخترناه لتحديد العمود emp_no وهو الجدول emp ثم استخدمنا العبارة inner join وكتبنا اسم الجدول الثاني ثم كتبنا الشرط المطلوب.
حسناً .. كيف سيصبح الأمر إذا كان الاستعلام من أكثر من جدولين ؟
لن يتطلب الأمر منا سوى كتابة ربط داخلي بحسب عدد الجداول التي لدينا في الاستعلام, ولتوضيح هذا الأمر دعنا نأخذ المثال التالي:
قم بإدراج البيانات التالية في الجدول bills حسبما تعلمت عن طريق التعليمة insert والبيانات هي:
mov_no = 1 و cli_no = 1 و paid = 250
الآن .. قم بكتابة استعلام يعيد لنا ما يلي:
اسم الزبون واسم الفيلم الذي اشتراه والثمن المدفوع للفيلم وتاريخ تحرير الفاتورة مع العلم أن الرقم التسلسلي لهذه الفاتورة هو واحد.
تحليل الاستعلام:
اسم الزبون cli_name نأخذه من الجدول clients .
اسم الفيلم mov_name نأخذه من الجدول movies .
الثمن المدفوع paid نأخذه من الجدول bills .
تاريخ تحرير الفاتورة bil_date نأخذه من الجدول bills .
الرقم التسلسلي للفاتورة bil_no نأخذه من الجدول bills .
وبالتالي سيكون الشكل النهائي للاستعلام هو:
select cli_name , mov_name , paid , bil_date from bills
inner join clients on bills.cli_no = clients.cli_no
inner join movies.mov_no = bills.mov_no and bil_no =1
وهناك صيغة أخرى بالنسبة للشروط في الرابطة الداخلية, إذ تستطيع أن تكتب:
select cli_name , mov_name , paid , bil_date from bills
inner join clients on bills.cli_no = clients.cli_no
inner join movies.mov_no = bills.mov_no
where bil_no =1
لاحظ أننا بدلنا العبارة and bil_no = 1 بالعبارة where bil_no=1 فكلا الطريقتين صحيحتين.
قد تتساءل كيف لي أن أعرف بأن الجدول الذي سأضعه بعد الكلمة from هو الجدول bills ؟
في الحقيقة لا يوجد أي فرق سواءً وضعت اسم الجدول bills أو الجدول clients أو الجدول movies
لكن مع مراعاة تغير صيغ الشروط كما يلي:
select cli_name , mov_name , paid , bil_date from clients
inner join movies on movies.mov_no = bills.mov_no
inner join bills on bills.cli_no = clients.cli_no
where bil_no = 1
ولكن من الأفضل أن نضع بعد from الجدول الذي يطابق العبارة where ففي مثالنا هذا كان الشرط where bil_no=1 وهو مأخوذ من الجدول bills لذلك من الأفضل أن نكتب from bills