الجزء ال11: الربط Joins
قبل البدء بمعرفة ماهو الJoin وكيف نستخدم الJoin وماهي انواع
الjoin , لنفهم مبدء العلاقات بين الجداول, لنفرض ان لديك جدول به
البيانات التالية:
ID
|
Name
|
Gender
|
City
|
Salary
|
1
|
صفاء
|
ذكر
|
أربيل
|
295000
|
2
|
علاء
|
ذكر
|
أربيل
|
670000
|
3
|
سوزان
|
أنثى
|
بغداد
|
930000
|
4
|
أمير
|
ذكر
|
أربيل
|
350000
|
5
|
سارة
|
أنثى
|
بغداد
|
730000
|
6
|
محمد
|
ذكر
|
البصرة
|
890000
|
7
|
أحمد
|
ذكر
|
البصرة
|
980000
|
8
|
كمال
|
ذكر
|
دهوك
|
1000000
|
كمل تلاحظ في حقل المدينة city تكررت
"أربيل" 3 مرات , وبغداد 2 مرة, والبصرة 2 مرة, وكذلك في حقل نوع الجنس Gender التكرار
مستمر ل"ذكر" و "أنثى" لماذا نكرر البيانات؟ طبعاً تكرار
البيانات يحتاج الى مساحة خزن البيانات وكذلك عند استرجاع البيانات سيؤثر ذلك على
سرعة تنفيذ جمل الأستعلام وبهذا جاء المبدء من العلاقات هو أزالة هذا النوع من
التكرار عن طريق استخدام مفهوم الPK-FK المذكورة في الجزء الثاني,
فمثلاً في حقل نوع الجنس Gender بدل ماتكون
القيم "ذكر" و "أنثى" ستكون عبارة عن ارقام 1 يرمز للذكر و2
ترمز للأنثى, وهذا يعني الأتي:
ولهذا فصلنا القيم المتكررة في
جدول اخر والأشارة لها عن طريق الFK
نفس الفكرة بالنسبة الى المدينة City :
والأن تم ازالة تكرار البيانات بتقسيم الجدول الى ثلاث جداول : جدول لنوع
الجنس وجدول للمدن وجدول للموظفين.
ملاحظة: عند ربط جدول الموظفين بجدول نوع
الجنس سيتم ذلك بأنشاء حقل في جدول الموظفين وتسميته GenderID والذي سيصبح المفتاح الخارجي FK الذي سيشير الى الID في جدول نوع الجنس والذي هو بدوره المفتاح
الرئيسي PK ونفس الفكرة
بالنسبة الى جدول المدن حيث تم انشاء حقل في جدول الموظفين اسمه CityID هو المفتاح الخارجي FK الذي يشير الى الID في جدول المدن وهو بدورة المفتاح الرئيسي PK.
والأن لنأخذ مثال
: اريد استرجاع البيانات التالية للموظفين : اسم الموظف ومن اي مدينة ونوع جنسه؟
الجواب هو عن
طريق استخدام الربط Join
, والأن نستطيع ان نعُرف الJoin
هو عبارة عن استرجاع قيم من جدولين او اكثر, وفي المثال السابق حددت استرجاع
البيانات من ثلاث جداول وهي "جدول الموظفين" و"جدول المدن" و
"جدول نوع الجنس"
يوجد ثلاث انواع
رئيسية للربط Joins :
1)
الربط الداخلي او الربط Inner Join or Join: سيسترجع فقط القيم
من جدولين الذين بينهما قيم مشتركة
2)
الربط الخارجي Outer Join وهو
بدورة ثلاث انواع:
a)
الربط الخارجي نوع يمين Right Outer join or Right join: سيسترجع القيم
المشتركة من الجدولين والقيم المشتركة والغير مشتركة من الجدول الذي على اليمين.
b)
الربط الخارجي نوع يسار Left Outer join or Left join: سيسترجع القيم
المشتركة من الجدولين والقيم المشتركة والغير مشتركة من الجدول الذي على اليسار.
c)
الربط الخارجي الأجمالي Full Outer join or Full join: سيسترجع القيم
المشتركة والغير مشتركة من كلا الجدولين.
3)
الربط المتقاطع Cross join: هو عبارة عن cartesian product اي اذا كان في احد
الجدولين 40 سجل بيانات وفي الجدول الأخر 4 سجلات للبيانات فالناتج هو 4*10 = 40
سجل للبيانات مسترجع! لم ادخل في تفاصيل هذا النوع من الربط لعدم وجود تطبيق منطقي
من ناحية الحياة اليومية لهذا النوع من الربط.
والأن سوف افصل جدول الموظفين الى
ثلاث جداول واربطهم بمبدأ الPK-FK كالأتي:
في البداية يجب حذف الحقلين Gender ,City :
ALTER TABLE [test].[dbo].[tblEmployees]
DROP Column [City]
ALTER TABLE [test].[dbo].[tblEmployees]
DROP Column [Gender]
سأنشأ جدول لنوع الجنس tblGender :
CREATE TABLE [test].[dbo].[tblGender]
(
[ID] INT NOT NULL PRIMARY KEY,
[GenderName] NVARCHAR(20) NOT NULL
)
سأنشأ جدول للمدن tblCity:
CREATE TABLE [test].[dbo].[tblCity]
(
[ID] INT NOT NULL PRIMARY KEY,
[CityName] NVARCHAR(20) NOT NULL
)
واخيراً في جدول الموظفين حقلين GenderID يعتبر
المفتاح الخارجي الذي يشير الى المفتاح الرئيسي في جدول tblGender للحقل ID , وحقل اخر CityID يعتبر المفتاح الخارجي الذي يشير الى المفتاح
الرئيسي في جدول tblCity للحقل ID , عن طريق
جملة الأستعلام التالية:
ALTER TABLE [test].[dbo].[tblEmployees]
ADD [GenderID] INT
CONSTRAINT FK_tblEmployees_GenderID
REFERENCES tblGender(ID),
[CityID] INT
CONSTRAINT FK_tblEmployees_CityID
REFERENCES tblCity(ID)
في جدول tblGender قمت بأضافة
القيم التالية:
وفي جدول tblCity قمت بأضافة
القيم التالية:
والأن نعود لجدول الtblEmployees ونعدل القيم
كالأتي:
بهذا انتهينا من فصل الجداول
وانشاء العلاقة بينهم وادخال البيانات لكل منهم.
الجزء الأخير كيفية استخدام الربط Join لأسترجاع البيانات من ثلاث جداول بأستخدام
انواعه الثلاث,
الصيغة العامة لكتابة اي جملة
الأستعلام للJoin :
SELECT {COLUMN_LIST}
FROM {LEFT_TABLE}
{JOIN_TYPE} {RIGHT_TABLE}
ON {LEFT_TABLE.FK = RIGHT_TABLE.PK}
مثال: اريد استرجاع اسم الموظف ومن
اي مدينة (هو/هي)?
SELECT [Name],[CityName]
FROM tblEmployees
INNER JOIN tblCity
ON tblEmployees.CityID = tblCity.ID
في المثال السابق استخدمنا الINNER JOIN او بأمكاننا
فقط نكتب JOIN , بهذا النوع من الربط سيسترجع القيم التي
بينها قيمة مشتركة في الفقرة ON واذا لم تكن القيم في احد الجدولين مرتبط
بقيمة في الأخر فستهمل!
لنفرض بأن اسم الموظف "سامر" موظف ولكن في حقل
الCityID لم يتم تحديد رقم المدينة اي NULL ونريد
استعادة كل الموظفين بغض النظر الى ان كان قد حدد الموظف من اي مدينة هو ام لا؟
اذا استخدمنا الINNER JOIN او JOIN كما في المثال السابق, فسيهمل "سامر" ؟؟
الحل بأستخدام الربط الخارجي نوع يسار LEFT OUTER JOIN او LEFT JOIN لأن الجدول على اليسار هو جدول الموظفين
وعلى اليمين جدول المدن , فستسترجع كافة البيانات من الجدول على اليسار مع القيم
المشتركة من الجدول على اليمين كالأتي:
نفس الفكرة للRight
Outer Join : حيث لو أفترضنا ان هنالك مدينة لا يوجد موظف فيها
فستسترجع رغم ذلك بأستخدام الRight
Join والسبب الRight لأن جدول المدن تم تحديده على اليمين في جملة
الأستعلام:
سؤال اخير اريد اسماء كل الموظفين مع نوع الجنس واسم
المدينة, بغض النظر اذا قاموا بتحديد حقل المدينة او حقل الجنس, مع كل المدن(كل)
سواء اذا كانوا بها موظفين ام لا؟
الجواب: كل الموظفين مع كل المدن يعني الربط الذي يجمعهم
هو Full Join , مع كل الموظفين ونوع الجنس الربط الذي يجمعهم LEFT OUTER JOIN .
Comments
Post a Comment