S.06 - ‫‪S.06‬‬ ‫رب الجداول‬...

Info icon This preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: ‫‪S.06‬‬ ‫ربط الجداول‬ ‫‪Joining Tables‬‬ ‫الكلمات المفتاحية‪:‬‬ ‫جداء ديكارتي ‪،Cartesian product‬‬ ‫ربط داخلي ‪،Inner join‬‬ ‫ربط خارجي ‪،Outer join‬‬ ‫ربط بالتساوي ‪،Equi join‬‬ ‫جدول ‪ ،Table‬حقل ‪،Field‬‬ ‫صيغة ‪،Syntax‬‬ ‫تعبير ‪،Clause‬‬ ‫استعل م فرعي ‪،Sub-query‬‬ ‫مفتاح رئيسي ‪،Primary key‬‬ ‫مفتاح خارجي ‪.Foreign key‬‬ ‫ملخص‪:‬‬ ‫‪-1-‬‬ ‫سنناقش في هذا الدرس مبادئ وتقنيات إنشاء استعلمات متعددة الجداول‪.‬‬ ‫إذ يمكن لستعل م ‪ SQL‬التعامل مع عدد كبير من الجككداول‪ ,‬لكككن لسككتخدا م‬ ‫جدولين يجب أن يتشاركا بحقول معينة‪.‬‬ ‫يتضمن ربط الجداول عبر علقة ‪ .primary key – foreign key‬ليس ضروريا ا‬ ‫أن تتشارك جميع الجككداول بنفككس الحقككل‪ ،‬لكككن يجككب علككى كككل جككدول أن‬ ‫يتشارك بحقل مع جدول واحد على القكل ليتكم تشككيل مكا يسكمى سلسكلة‬ ‫العلقات أو ‪ .Relationship chain‬يوجد العديد مككن أشكككال الربككط بيككن‬ ‫الجداول‪ ،‬وتختلف الصيغة باختل ف نظا م إدارة قواعد البيانات‪.‬‬ ‫مواضيع الدرس‪:‬‬ ‫‪ .1‬كيف يقو م ‪ SQL‬بربط الجداول؟‬ ‫‪ .2‬الربط البسيط أو الجداء الديكارتي ‪Cartesian Product‬‬ ‫‪ .3‬الربط بالتساوي ‪Equi Join‬‬ ‫‪ .4‬الربط باللمساواة ‪Non-Equi Join‬‬ ‫‪ .5‬الربط الداخلي ‪Inner Join‬‬ ‫‪ .6‬الربط الخارجي ‪Outer Join‬‬ ‫‪ .7‬الربط الطبيعي ‪Natural Join‬‬ ‫‪ .8‬الربط باستخدا م التعبير ‪Using‬‬ ‫‪ .9‬الربط الذاتي ‪Self Join‬‬ ‫مقدمة‪:‬‬ ‫وجدنا فيما سبق أن الستعل م عن أكثر مككن جككدول باسككتخدا م السككتعلمات‬ ‫الفرعية قد وفر قدرات جيدة على معالجة البيانات‪ .‬ولكن هذه القككدرات قككد‬ ‫ل تمكننا دائما ا من الحصول على كل النتائج التي نحتاجها‪ .‬كما أن الصيغة قككد‬ ‫تصبح صعبة الفهم بعض الشيء وقد تؤدي إلى انخفاض مستوى الداء أحياناا‪.‬‬ ‫توفر ‪ SQL‬إمكانية الستعل م عن جداول متعددة في وقككت واحككد باسككتخدا م‬ ‫صيغة أبسط ندعوها الربط‪.‬‬ ‫‪-2-‬‬ ‫ل تستطيع الصيغة الجديدة استبدال كل التقنيكات الكتي تؤمنهكا السكتعلمات‬ ‫ة فككي‬ ‫الفرعيككة‪ ،‬ولكنهككا تمثككل الحككل المثككل فككي بعككض الحككالت‪ ،‬وخاصكك ا‬ ‫الستعلمات التي تربط بين سجلت من جداول مختلفة‪.‬‬ ‫نبدأ فيما يلي بعرض حالت الربكط البسككيطة لنصككل بعكد ذلكك إلكى الحكالت‬ ‫الكثر تعقيداا‪:‬‬ ‫‪‬‬ ‫الربط البسيط أو الجداء الديكارتي ‪Cartesian product‬‬ ‫‪‬‬ ‫الربط بالتساوي ‪Equi join‬‬ ‫‪‬‬ ‫الربط بعد م المساواة ‪Non-Equi join‬‬ ‫‪‬‬ ‫الربط الخارجي ‪Outer join‬‬ ‫كيف يقوم ‪ SQL‬بربط الجداول؟‬ ‫ليكن لدينا الجدولين التاليين‪:‬‬ ‫‪Department‬‬ ‫‪DeptName‬‬ ‫‪Accounting‬‬ ‫‪Administration‬‬ ‫‪Finance‬‬ ‫‪Marketing‬‬ ‫‪DeptID‬‬ ‫‪Actg‬‬ ‫‪Admn‬‬ ‫‪Fin‬‬ ‫‪Mktg‬‬ ‫‪Employee‬‬ ‫‪DeptID‬‬ ‫‪Actg‬‬ ‫‪Mktg‬‬ ‫‪Mktg‬‬ ‫‪Admn‬‬ ‫‪EmpID FirstNam LastNam Sex‬‬ ‫‪Male‬‬ ‫‪Male‬‬ ‫‪Female‬‬ ‫‪Female‬‬ ‫‪e‬‬ ‫‪Wallace‬‬ ‫‪Anderson‬‬ ‫‪Miller‬‬ ‫‪Ryan‬‬ ‫‪-3-‬‬ ‫‪e‬‬ ‫‪Tim‬‬ ‫‪Jacob‬‬ ‫‪Laura‬‬ ‫‪Anne‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪Children‬‬ ‫‪ChildID ChildNam Sex‬‬ ‫‪Birthdate EmpID‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪1‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪11/02/1990‬‬ ‫‪19/02/1990‬‬ ‫‪30/08/1992‬‬ ‫‪19/09/1980‬‬ ‫‪04/03/1999‬‬ ‫‪02/07/2000‬‬ ‫‪29/05/1991‬‬ ‫‪09/01/2001‬‬ ‫‪Female‬‬ ‫‪Male‬‬ ‫‪Female‬‬ ‫‪Female‬‬ ‫‪Male‬‬ ‫‪Male‬‬ ‫‪Male‬‬ ‫‪Female‬‬ ‫‪e‬‬ ‫‪Nancy‬‬ ‫‪Andrew‬‬ ‫‪Janet‬‬ ‫‪Margaret‬‬ ‫‪Steven‬‬ ‫‪Michael‬‬ ‫‪Robert‬‬ ‫‪Laura‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪8‬‬ ‫تعريفات‪:‬‬ ‫‪-‬‬ ‫المفتاح الرئيسي ‪:Primary key‬‬ ‫حقل أو أكككثر تعككرر ف فيككه قيمككة أو قيككم فريككدة ‪Unique‬لكككل سككجل فككي‬ ‫الجدول‪ .‬فككي الجككداول السككابقة يمث رككل الحقككل ‪ EmpID‬مفتاح ا ا رئيسككيا ا‬ ‫للجككدول ‪ ،Employee‬ويمرثككل الحقككل ‪ DeptID‬مفتاح ا ا رئيسككيا ا للجككدول‬ ‫‪ .Department‬ويمرثل الحقل ‪ ChildID‬مفتاحا ا رئيسيا ا للجدول ‪.Children‬‬ ‫‪-‬‬ ‫المفتاح الخارجي ‪:Foreign key‬‬ ‫حقل أو أككثر مكن حقكول الجككدول يشكير إلككى حقككل أو حقكول المفتككاح‬ ‫الرئيسي في جدول آخككر‪ .‬فككي الجككداول السككابقة يمث رككل الحقككل ‪DeptID‬‬ ‫الموجود في الجدول ‪ Employee‬مفتاحا ا خارجيا ا للجدول ‪.Department‬‬ ‫الربط البسيط أو الجداء الديكارتي ‪Cartesian Product‬‬ ‫تتم عملية الربط بمقابلة كل سجل من الجدول الول مع جميع سككجلت‬ ‫الجككدول الثككاني‪ .‬وهككذا مككا يككدعى بالجككداء الككديكارتي أو ‪Cartesian‬‬ ‫‪-4-‬‬ ‫ وفي هذه الحالة يكون عدد السجلت الناتجة عن الستعلم‬.product .‫هو عدد سجلت الجدول الول × عدد سجلت الجدول الثاني‬ :‫ هي‬Department ‫ و‬Employee :‫ نتيجة الربط البسيط بين الجدولين‬:‫مثال‬ Cartesian Product EmpID FirstNam LastNam Sex e Tim Jacob Laura Anne Tim 1 2 3 4 1 2 Jacob e Wallace Anderson Miller Ryan Wallace Male Male Female Female Male Anderson Male DeptID DeptI DeptName Actg Mktg Mktg Admn Actg D Actg Actg Actg Actg Admn Mktg n Admn Administratio Accounting Accounting Accounting Accounting Administratio 3 Laura Miller Female Mktg n Admn Administratio 4 Anne Ryan Female Admn n Admn Administratio 1 2 3 4 1 2 3 4 Tim Jacob Laura Anne Tim Jacob Laura Anne Wallace Anderson Miller Ryan Wallace Anderson Miller Ryan Male Male Female Female Male Male Female Female Fin Fin Fin Fin Mktg Mktg Mktg Mktg Actg Mktg Mktg Admn Actg Mktg Mktg Admn n Finance Finance Finance Finance Marketing Marketing Marketing Marketing :‫يمكن التعبير عن صيغة الربط بالصيغة التالية‬ SELECT Table1.Column1, Table2.Column2 FROM Table1, Table2; -5- ‫يسمى استعلم الربط البسيط أيضا ا بالربط المتصالب ‪ .Cross join‬ويمك ن‬ ‫التعبير عن نفس صيغة الربط السابقة‪ ،‬بالصيغة‪:‬‬ ‫‪SELECT‬‬ ‫‪Table1.Column1,‬‬ ‫‪Table2.Column2‬‬ ‫‪FROM‬‬ ‫;‪Table1 CROSS JOIN Table2‬‬ ‫انتبكككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككه‪:‬‬ ‫ل تدعم قواعد بيانات ‪ DB2‬التعبير ‪.CROSS JOIN‬‬ ‫الربط بالتساوي ‪Equi Join‬‬ ‫ييعرر ف الربط بالتساوي على أنككه الربككط البسككيط بيككن سككجلت جككدول أول‪،‬‬ ‫وسجلت جدول ثان اعتمادا ا على مساواة بيككن قيمككة حقككل فككي سككجل مككن‬ ‫الجدول الول )عادة المفتاح الخارجي( وقيمة حقل في سجل من الجككدول‬ ‫الثاني )عادة المفتاح الرئيسي(‪.‬‬ ‫ييعربر عن الربط بالتساوي بالصيغة‪:‬‬ ‫‪SELECT‬‬ ‫‪Table1.Column1,‬‬ ‫‪Table1.Column2,‬‬ ‫‪Table2.Column3‬‬ ‫‪FROM‬‬ ‫‪Table1,‬‬ ‫‪Table2‬‬ ‫‪WHERE‬‬ ‫;‪Table1.Column1 = Table2.Column2‬‬ ‫عموماا‪ ،‬ل تستخدم عمليكة الربكط بالضككرورة نفككس الحقكول الكتي يجكب أن‬ ‫يعيدها الستعلم‪.‬‬ ‫‪-6-‬‬ :‫مثال‬ .‫لنفرض أننا نبحث عن أسماء الموظفين الذين يعملون في قسم المحاسبة‬ :‫عندها سيكون الستعلم على الشكل التالي‬ SELECT DeptName, FirstName, LastName FROM Employee, Department WHERE Employee.DeptID = dbo.Department.DeptID AND DeptName = 'Accounting' :‫وستكون النتيجة هي‬ DeptName FirstName LastName ­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­ Accounting Tim Wallace Equi Join Access, SQL Server, Oracle, MySQL SELECT Synta Table1.Column1, x Table1.Column2, ‫الصيغة‬ Table2.Column3 FROM Table1, Table2 WHERE Table1.Column1 = Table2.Column2; -7- SELECT Table1.Column1, Table1.Column2, Table2.Column3 FROM Table1 Join Table2 ON Table1.Column1 = Table2.Column2; .Michael ‫ أسماء الموظفين الذين لديهم ولد اسمه‬.1 SELECT FirstName, LastName FROM Employee, Children WHERE Employee.EmpID = Children.EmpID AND ChildName = 'Michael' .‫ أسماء البناء الذكور للموظفين العاملين في قسم التسويق‬.2 SELECT ChildName FROM Department, Employee, Children WHERE Department.DeptID = Employee.DeptID ‫أمثلة‬ AND Employee.EmpID = Children.EmpID AND Children.Sex = 'Male' AND DeptName = 'Marketing' .‫ أسماء وأعداد أولد الموظفين في جميع القسا م‬.3 SELECT FirstName, LastName, Count(ChildID) As ChidrenCount FROM Employee, Children WHERE Employee.EmpID = Children.EmpID GROUP BY FirstName, LastName :‫انتبكككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككه‬ ‫ يتم اسككتعمال اسككم‬،Primary key – Foreign key ‫عند إضافة العلقة‬ ‫’ لمنع اللتباس عنككد تشككابه أسككماء الحقككول‬.‘ ‫الجدول ملحقا ا بنقطة‬ -8- ‫الموجكككككككككككككككودة فكككككككككككككككي عكككككككككككككككدة جكككككككككككككككداول‪.‬‬ ‫كما يجب استخدام اسم الجدول ملحقا ا بنقطة ضمن التعككبير ‪ Select‬أو‬ ‫‪ Where‬أيضا ا عند إمكانية حدوث التباس بالحقول‪ .‬انظر المثال ‪ 2‬فككي‬ ‫الجدول السابق‪.‬‬ ‫الربط باللمساواة ‪Non-Equi Join‬‬ ‫يعتمككد الربككط بالمسككاواة علككى اسككتخدام المسككاواة فككي شككرط التعككبير‬ ‫‪ WHERE‬ولك ن هككذا ل يعنككي أننككا ل نسككتطيع اسككتخدام عمليككات المقارنككة‬ ‫الخرى )أكبر‪ ،‬أصغر‪ ،‬وغيرها( كما في الصيغة التالية‪:‬‬ ‫‪SELECT Table1.Column1,‬‬ ‫‪Table2.Column2‬‬ ‫‪FROM Table1,‬‬ ‫‪Table2‬‬ ‫‪WHERE Table1.Column1 < Table2.Column2‬‬ ‫مثال‪:‬‬ ‫تحديد الستعلم الذي يعطي أسماء القسككام وأسككماء المككوظفين الككذين ل‬ ‫يعملون فيها‪.‬‬ ‫عندها سيكون الستعلم على الشكل التالي‪:‬‬ ‫‪SELECT DeptName, FirstName, LastName‬‬ ‫‪FROM Employee, Department‬‬ ‫‪WHERE Employee.DeptID <> dbo.Department.DeptID‬‬ ‫وستكون النتيجة هي‪:‬‬ ‫‪LastName‬‬ ‫‪FirstName‬‬ ‫‪DeptName‬‬ ‫­­­­­­­­­­­­­­‬ ‫­­­­­­­­­­­­­­‬ ‫­­­­­­­­­­­­­­‬ ‫‪Anderson‬‬ ‫‪Jacob‬‬ ‫‪Accounting‬‬ ‫‪-9-‬‬ ‫‪Miller‬‬ ‫‪Laura‬‬ ‫‪Accounting‬‬ ‫‪Ryan‬‬ ‫‪Anne‬‬ ‫‪Accounting‬‬ ‫‪Wallace‬‬ ‫‪Tim‬‬ ‫‪Administration‬‬ ‫‪Anderson‬‬ ‫‪Jacob‬‬ ‫‪Administration‬‬ ‫‪Miller‬‬ ‫‪Laura‬‬ ‫‪Administration‬‬ ‫‪Wallace‬‬ ‫‪Tim‬‬ ‫‪Finance‬‬ ‫‪Anderson‬‬ ‫‪Jacob‬‬ ‫‪Finance‬‬ ‫‪Miller‬‬ ‫‪Laura‬‬ ‫‪Finance‬‬ ‫‪Ryan‬‬ ‫‪Anne‬‬ ‫‪Finance‬‬ ‫‪Wallace‬‬ ‫‪Tim‬‬ ‫‪Marketing‬‬ ‫‪Ryan‬‬ ‫‪Anne‬‬ ‫‪Marketing‬‬ ‫الربط الداخلي ‪Inner Join‬‬ ‫يعطي الربط الداخلي نفس النتيجة التي يعطيها الربط بالتسككاوي‪ ،‬الفككرق‬ ‫فقككط بالصككيغة‪ .‬إذ ل تزودنككا جميككع أنككواع أنظمككة إدارة قواعككد المعطيككات‬ ‫بالربط الداخلي‪ .‬فنسخ ‪ Oracle‬ما قبل ‪ 9‬ل تدعم الربط الداخلي‪.‬‬ ‫بالنسبة للصيغة‪ ،‬يوجد اختلفان‪:‬‬ ‫‪-‬‬ ‫يفصل بين أسماء الجداول الكلمات ‪ Inner Join‬بدل ا من الفواصل ‘‪.’,‬‬ ‫‪-‬‬ ‫يتغير موضع تحديد العلقة بين الجداول من ‪ Where‬إل ى ‪ ،On‬تككاركين‬ ‫بذلك التعبير ‪ Where‬للشروط التقليدية‪.‬‬ ‫المثلة الواردة في الجدول التالي هككي نفسككها الككواردة فككي فقككرة الربككط‬ ‫بالتساوي‪ ،‬وبالتالي يمكنك المقارنة‪.‬‬ ‫‪- 10 -‬‬ Inner Join Access, SQL Server, Oracle 9i, MySQL Syntax SELECT Field | Field, Field, Field | * FROM Table1 INNER JOIN Table2 ON Table1.Field = Table2.Field ‫الصيغة‬ .Michael ‫ أسماء الموظفين الذين لديهم ولد اسمه‬.1 SELECT FirstName, LastName ‫مثال‬ FROM Employee Inner Join Children ON Employee.EmpID = Children.EmpID WHERE ChildName = 'Michael' .‫ أسماء البناء الذكور للموظفين العاملين في قسم التسويق‬.‫أ‬.2 SELECT ChildName FROM Department Oracle 9i, Inner Join Employee SQL ON Department.DeptID = Employee.DeptID Server, Inner Join Children MySQL ON Employee.EmpID = Children.EmpID WHERE Children.Sex = 'Male' AND DeptName = 'Marketing' .‫ أسماء البناء الذكور للموظفين العاملين في قسم التسويق‬.‫ب‬.2 SELECT ChildName Access, FROM (Department Oracle 9i, Inner Join Employee ON Department.DeptID = Employee.DeptID) Inner Join Children ON Employee.EmpID = Children.EmpID SQL Server, MySQL WHERE Children.Sex = 'Male' AND DeptName = 'Marketing' .‫ أسماء وأعداد أولد الموظفين في جميع القسا م‬.3 SELECT FirstName, LastName, Count(ChildID) As ChidrenCount FROM Employee Inner Join Children - 11 ON Employee.EmpID = Children.EmpID GROUP BY FirstName, LastName ‫مثال‬ ‫انتبكككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككه‪:‬‬ ‫يواجه ‪ MS Access‬صعوبة في ترجمة عمليات الربط بصكورة مباشكرة‪،‬‬ ‫لذلك نلجأ إلى توليد بنى ربط متداخلة مجمعة بأقواس‪ .‬كما هو مككبين‬ ‫في المثال ‪.2‬ب في الجدول السابق‪.‬‬ ‫ملحظة‪:‬‬ ‫رأينا فيما سبق كيفية تغيير اسم حقل أو عمود ضمن التعبير ‪ Select‬ف ي أي‬ ‫استعلم‪ ،‬وذلك عبر ما يسمى ‪ .Alias‬يمكننا أيضا ا تغيير أسماء الجداول ضمن‬ ‫‪ ،SQL‬بهد ف تقصير طول الستعلم أو تسهيل قراءته‪.‬‬ ‫لستعمال ‪ alias‬ضمن التعبير ‪ ،From‬أتببع السم الحقيقي للجدول بفراغ ثم‬ ‫السم الجديد الكذي ترغكب بالتعامككل معككه‪ .‬ويمكنكك إضكافة ‪ As‬بي ن السكم‬ ‫الحقيقي للجدول والسم الجديد له‪.‬‬ ‫وعند تغيير تسككمية جككدول‪ ،‬ل يمكككن اسككتخدام السككم الحقيقككي فككي بقيككة‬ ‫الستعلم‪ .‬يبرين الجككدول التككالي عككدة أمثلككة علككى اسككتخدام إعككادة تسككمية‬ ‫الجداول‪.‬‬ ‫‪Table Aliases‬‬ ‫‪Access, SQL Server, Oracle, MySQL‬‬ ‫* | ‪SELECT Field | Field, Field, Field‬‬ ‫‪FROM Table1 Alias1 Inner Join Table2 Alias2‬‬ ‫‪Synta‬‬ ‫‪On Alias1.Field = Alias2.Field‬‬ ‫‪x‬‬ ‫* | ‪SELECT Field | Field, Field, Field‬‬ ‫الصيغة‬ ‫‪FROM Table1 Alias1, Table2 Alias2‬‬ ‫‪Where Alias1.Field = Alias2.Field‬‬ ‫‪- 12 -‬‬ ‫‪ .1‬أسماء الموظفين الذين لديهم ولد اسمه ‪.Michael‬‬ ‫‪SELECT FirstName, LastName‬‬ ‫‪FROM Employee E, Children C‬‬ ‫'‪WHERE E.EmpID = C.EmpID AND ChildName = 'Michael‬‬ ‫‪ .2‬أسماء البناء الذكور للموظفين العاملين في قسم التسويق‪.‬‬ ‫أمثلة‬ ‫‪SELECT ChildName‬‬ ‫‪FROM Department D‬‬ ‫‪Inner Join Employee E ON D.DeptID = E.DeptID‬‬ ‫‪ Inner Join Children C ON E.EmpID = C.EmpID‬‬ ‫'‪WHERE Children.Sex = 'Male‬‬ ‫'‪ AND DeptName = 'Marketing‬‬ ‫الربط الخارجي ‪Outer Join‬‬ ‫فككي حالككة ‪ ،INNER JOIN‬كككانت السككجلت الككتي أرجعهككا السككتعلم‪ ،‬هككي‬ ‫السجلت التي تحقق شككرط الربككط الككذي يظهككر بعككد تعككبير ‪ ،ON‬حيككث تككم‬ ‫إسقاط السجلت غير المتطابقة من جككدول النتائككج‪ .‬أمككا فككي حالككة الربككط‬ ‫الخارجي ‪ Outer Join‬فل يتم إسقاط السجلت غير المتطابقة‪.‬‬ ‫للربط الخارجي ثلثة أنواع‪.LEFT, RIGHT, FULL :‬‬ ‫‪:Left Outer Join .1‬‬ ‫لخذ جميع السجلت من الجدول الول ‪ Table1‬وفقط السجلت من الجككدول‬ ‫الثاني ‪ Table2‬التي تتطابق فيها قيمة الحقككل ‪ Column1‬م ن الجككدول ‪Table1‬‬ ‫مع قيمة الحقل ‪ Column2‬من الجدول الثاني ‪ ،Table2‬نكتب الصيغة‪:‬‬ ‫‪SELECT‬‬ ‫*‬ ‫‪FROM‬‬ ‫‪- 13 -‬‬ ‫‪Table1‬‬ ‫‪LEFT OUTER JOIN‬‬ ‫‪Table2‬‬ ‫‪ON‬‬ ‫‪Table1.Column1 = Table2.Column2‬‬ ‫‪:Right Outer Join .2‬‬ ‫لخذ جميع السجلت من الجدول الثاني ‪ 2Table‬وفقط السجلت من الجدول‬ ‫الول ‪ Table1‬التي تتطابق فيها قيمككة الحقككل ‪ Column1‬م ن الجككدول ‪Table1‬‬ ‫مع قيمة الحقل ‪ Column2‬من الجدول الثاني ‪ ،Table2‬نكتب الصيغة‪:‬‬ ‫‪SELECT‬‬ ‫*‬ ‫‪FROM‬‬ ‫‪Table1‬‬ ‫‪RIGHT OUTER JOIN‬‬ ‫‪Table2‬‬ ‫‪ON‬‬ ‫;‪Table1.Column1 = Table2.Column2‬‬ ‫ملحظة‪:‬‬ ‫ينتج عن عمليات الربط الخارجي‪ ،‬في الحالككة العامككة‪ ،‬سككجلت تحتككوي فككي‬ ‫حقول معينة القيمة ‪ NULL‬بسبب اختل ف عدد السجلت التي نريككد ربطهككا‪،‬‬ ‫وهذا ما سنوضحه بالتفصيل لحقا ا مككع مثككال مناسككب لكككل نككوع مككن أنككواع‬ ‫الربط الخارجي ‪.‬‬ ‫ل تعتمد جميع أنظمة إدارة قواعد البيانات ‪ DBMS‬نفس الصيغة في التعككبير‬ ‫عن أشكال ‪ Outer Join‬المختلفة‪ .‬إذ يوجد ثلثة صيغ مختلفة‪.‬‬ ‫الصيغة الولى‪:‬‬ ‫‪- 14 -‬‬ ‫هي الصيغة المطابقة تقريبا ا لصيغة ‪) Inner Join‬وهي مككا اسككتخدمناه فيمككا‬ ‫سبق من هذه الفقرة(‪ .‬أي يتم وضع الكلمات ‪) Left Outer Join‬أو اختصككارا ا‬ ‫‪ (Left Join‬أو الكلمات ‪) Right Outer Join‬أو اختصارا ا ‪ (Right Join‬أو الكلمات‬ ‫‪) Full Outer Join‬أو اختصارا ا ‪ (Full Join‬بي ن أسككماء الجككداول‪ ،‬ويلككي اسككم‬ ‫الجدول الثاني تعليمة ‪ ON‬لتحديد الحقول الرابطة بين الجداول‪.‬‬ ‫الصيغة الثانية‪:‬‬ ‫هي وضع أسماء الجداول في عبارة ‪ ،FROM‬مفصولة عن بعضها بالفواصل‬ ‫‘‪ ،’,‬وبعد ذلك في عبارة ‪ WHERE‬يتم وضع حقول الربط‪ .‬ويتم تحديكد اتجكاه‬ ‫الربط )يسار‪ ،‬يمين‪ ،‬كامل( برمز يختلف من ‪ DBMS‬إل ى آخككر‪ .‬ففككي ‪Oracle‬‬ ‫توضع إشارة )‪ (+‬إلى جانب الجككدول الككذي ينقصككه معلومككات‪ .‬أي نسككتخدم‬ ‫‪ (+) Table1.Field = Table2.Field‬لعرض جميع سجلت الجدول ‪ Table1‬مع مككا‬ ‫يقابلها في الجدول ‪.Table2‬‬ ‫بالنسبة لنظمة إدارة قواعد البيانات التي ندرسها‪ ،‬هذه الصككيغة مسككتخدمة‬ ‫من قبل ‪ Oracle‬فقط‪ .‬مع العلم أن ‪ Oracle 9i‬يمكنها استخدام الصيغة الثانية‬ ‫أيضاا‪.‬‬ ‫الصيغة الثالثة‪:‬‬ ‫وهي صيغة اختيارية لنظام ‪ SQL Server‬فقط‪ .‬وهي مشابهة للصيغة الثانية‬ ‫إلى حد ما‪ .‬إذ يتم استخدام *= للتعبير عن ‪ ،Left Join‬و =* للتعبير عن ‪Right‬‬ ‫‪ Join‬وهي صيغة ملغاة للصدارات الحدث من الصدار ‪.7‬‬ ‫)‪Outer Join (first syntax form‬‬ ‫‪Access, SQL Server, Oracle 9i, MySQL‬‬ ‫‪SELECT Table1.Column1, Table1.Column2, Table2.Column3‬‬ ‫‪Syntax‬‬ ‫‪FROM Table1 LEFT | RIGHT | FULL JOIN Table2‬‬ ‫الصيغة‬ ‫‪On Table1.Field = Table2.Field‬‬ ‫مثال‪ .1‬اعرض أسماء جميع القسا م مع مكا يقابلهكا مكن مكوظفين يعملككون فكي هكذه‬ ‫القسا م‪.‬‬ ‫‪SELECT DeptName, FirstName, LastName‬‬ ‫‪- 15 -‬‬ FROM Department LEFT JOIN Employee ON Department.DeptID = Employee.DeptID Outer Joins (second syntax form) Oracle (all versions) SELECT Table1.Column1, Table1.Column2, Table2.Column3 Syntax FROM Table1, Table2 WHERE Table1.Field = Table2.Field (+) | Table1.Field (+) = Table2.Field ‫الصيغة‬ ‫ اعرض أسماء جميع القسا م مع ما يقابلهككا مككن مككوظفين يعملككون فككي هككذه‬.1 .‫القسا م‬ ‫مثال‬ SELECT DeptName, FirstName, LastName FROM Department, Employee ON Department.DeptID = Employee.DeptID (+) Outer Joins (third syntax form) SQL Server SELECT Table1.Column1, Table1.Column2, Table2.Column3 Syntax FROM Table1, Table2 WHERE Table1.Field *= Table2.Field | Table1.Field =* Table2.Field ‫الصيغة‬ ‫ اعرض أسماء جميع القسا م مع ما يقابلهككا مككن مككوظفين يعملككون فككي هككذه‬.1 .‫القسا م‬ SELECT DeptName, FirstName, LastName FROM Department, Employee ON Department.DeptID *= Employee.DeptID - 16 - ‫مثال‬ :‫انتبكككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككه‬ .Full Join ‫ الربط‬MySQL ‫ و‬MS Access ‫ل يدعم كل من‬ ‫ ففككي جميككع الصككيغ سككتكون‬.‫ اختل ف الصيغة ل يعني اختل ف النتيجة‬،‫طبعاا‬ :‫النتيجة هي‬ DeptName FirstName LastName ------------- ------------- ------------ Accounting Tim Wallace Administration Anne Ryan Finance NULL NULL Marketing Jacob Anderson Marketing Laura Miller :‫تمرين‬ .Not IN ‫ بدل ا من‬Outer Join ‫أعد كتابة الستعلم التالي مستخدما ا‬ Select Artistname From Artists Where ArtistID NOT IN(Select ArtistID From Titles); :‫الحل‬ Select Artistname From Artists A Left Join Titles T ON A.ArtistID = T.ArtistID - 17 - ‫;‪WHERE T.ArtistIS Is NULL‬‬ ‫الربط الطبيعي ‪Natural Join‬‬ ‫يقوم التعبير ‪ NATURAL JOIN‬بعملي ة ربككط اعتمككادا ا علككى الحقككول ذات‬ ‫مشتركة بين الجدولين والتي تحتوي على قيم متطابقة‪.‬‬ ‫السماء ال ي‬ ‫يأخذ التعبير الصيغة‪:‬‬ ‫‪SELECT‬‬ ‫‪Table1.Column1,‬‬ ‫‪Table2.Column1‬‬ ‫‪FROM‬‬ ‫‪Table1‬‬ ‫‪NATURAL JOIN‬‬ ‫‪Table2‬‬ ‫الربط باستخدام التعبير ‪Using‬‬ ‫يستخدم التعبير ‪ USING‬في حال كان اسم الحقل الذي نعتمد عليككه فككي‬ ‫عملية الربط متشابها ا في الجدولين‪ .‬وهو يأخذ الصيغة‪:‬‬ ‫‪SELECT‬‬ ‫‪Table1.Column2,‬‬ ‫‪Table2.Column3‬‬ ‫‪FROM‬‬ ‫‪Table1‬‬ ‫‪JOIN‬‬ ‫‪- 18 -‬‬ ‫‪Table2‬‬ ‫;)‪USING(Column1‬‬ ‫اعتبرنا هنا أن الربط يتم اعتمككادا ا علككى قيككم الحقككل ‪ Column1‬م ن الجككدول‬ ‫الول و‪ Column1‬من الجدول الثاني‪.‬‬ ‫انتبكككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككككه‪:‬‬ ‫التعككبيران ‪ USING‬و ‪ NATURAL JOIN‬م دعومان مككن قواعككد بيانككات‬ ‫‪ Oracle‬في نسختها ‪.9i‬‬ ‫الربط الذاتي ‪Self Join‬‬ ‫الربط الذاتي هو ربط جدول مع نفسه‪ .‬ويمكن ذلك عبر ‪ Inner Join‬أو ‪Outer‬‬ ‫‪ .Join‬لنأخ ذ بنيككة معدلككة عككن الجككدول ‪ Employee‬ال ذي عررفنككاه فككي بدايككة‬ ‫الجلسة‪ ،‬وذلك بإضافة ‪ ManagerID‬إليه كما هو موضح في الجدول التالي‪.‬‬ ‫‪Employee‬‬ ‫‪ManagerID‬‬ ‫‪DeptID‬‬ ‫‪NULL‬‬ ‫‪NULL‬‬ ‫‪2‬‬ ‫‪NULL‬‬ ‫‪Actg‬‬ ‫‪Mktg‬‬ ‫‪Mktg‬‬ ‫‪Admn‬‬ ‫‪EmpID FirstNam LastNam Sex‬‬ ‫‪Male‬‬ ‫‪Male‬‬ ‫‪Female‬‬ ‫‪Female‬‬ ‫‪e‬‬ ‫‪Wallace‬‬ ‫‪Anderson‬‬ ‫‪Miller‬‬ ‫‪Ryan‬‬ ‫‪e‬‬ ‫‪Tim‬‬ ‫‪Jacob‬‬ ‫‪Laura‬‬ ‫‪Anne‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫يعب رككر الحقككل الجديككد ‪ ManagerID‬ع ن الرقككم ‪ EmpID‬لم دير الموظككف‪ .‬وإذا‬ ‫كانت قيمته ‪ NULL‬فهذا يعني أن الموظف الحالي هو مدير‪.‬‬ ‫تمرين‪:‬‬ ‫اكتب الستعلم الذي يعطي أسماء جميع المككوظفين مككع اسككم المككدير )إن‬ ‫كان موجوداا(‪.‬‬ ‫‪- 19 -‬‬ :‫الحل‬ Select CONCAT(E.FirstName, CONCAT(' ', E.LastName)) AS EmpName, CONCAT(M.FirstName, CONCAT(' ', M.LastName) ) AS Manager From Employee E ON E.ManagerID LEFT JOIN Employee M = M.EmpID; ‫ في‬From ‫( ضمن عبارة‬Aliasing) ‫ل حظ الستخدام الجباري لعادة التسمية‬ .‫التمرين السابق‬ Self Join Access, SQL Server, Oracle, MySQL SELECT Alias1.Field1, Alias2.Field2 FROM Table Alias1 Inner | Left | Right | Full Join Table Alias2 ‫الصيغة‬ On Alias1.Field1 = Alias2.Field2 Syntax SELECT Alias1.Field1, Alias2.Field2 FROM Table Alias1, Table Alias2 Where Alias1.Field1 = Alias2.Field2 ‫ اكتب الستعلم الذي يعطي أسماء جميع الموظفين مككع اسككم‬.‫أ‬.1 .(‫المدير )إن كان موجوداا‬ Oracle 9i, SQL Select CONCAT(E.FirstName, CONCAT(' ', E.LastName)) AS EmpName,Server, CONCAT(M.FirstName, CONCAT(' ', M.LastName)) ASMySQL, ManagerAccess From Employee E LEFT JOIN Employee M ON E.ManagerID = M.EmpID; ‫ اكتب الستعلم الذي يعطي أسماء جميع الموظفين مع اسم‬.‫ب‬.1Oracle (all .(‫المدير )إن كان موجوداا‬versions), SQL Select CONCAT(E.FirstName, CONCAT(' ', E.LastName)) AS Server, EmpName,MySQL, CONCAT(M.FirstName, CONCAT(' ', M.LastName)) AS - 20 - Manager From Employee E, Employee WHERE E.ManagerID = M.EmpID; M Access - 21 - ...
View Full Document

{[ snackBarMessage ]}

What students are saying

  • Left Quote Icon

    As a current student on this bumpy collegiate pathway, I stumbled upon Course Hero, where I can find study resources for nearly all my courses, get online help from tutors 24/7, and even share my old projects, papers, and lecture notes with other students.

    Student Picture

    Kiran Temple University Fox School of Business ‘17, Course Hero Intern

  • Left Quote Icon

    I cannot even describe how much Course Hero helped me this summer. It’s truly become something I can always rely on and help me. In the end, I was not only able to survive summer classes, but I was able to thrive thanks to Course Hero.

    Student Picture

    Dana University of Pennsylvania ‘17, Course Hero Intern

  • Left Quote Icon

    The ability to access any university’s resources through Course Hero proved invaluable in my case. I was behind on Tulane coursework and actually used UCLA’s materials to help me move forward and get everything together on time.

    Student Picture

    Jill Tulane University ‘16, Course Hero Intern