SQLطرق ربط المعلومات عند جلبها
- مفهوم ربط المعلومات عند جلبها
- طرق ربط القيم التي يتم جلبها من عدة جداول
- تجهيز قاعدة البيانات التي سنطبق عليها
- كيف يتم ربط قيم الجداول في الإستعلام
- جلب القيم المشتركة بين الجداول
- جلب كل قيم الجدول الأيسر بالإضافة إلى القيم المشتركة معه من الجدول الأيمن
- جلب كل قيم الجدول الأيمن بالإضافة إلى القيم المشتركة معه من الجدول الأيسر
- جلب القيم المشتركة و الغير مشتركة بين الجداول
مفهوم ربط المعلومات عند جلبها
بعد تخزين البيانات في جداول متفرقة و بشكل منطقي كما شاهدنا في الدرسين السابقين, لا بد لنا الآن من معرفة كيف سنسترجع هذه المعلومات بشكل مرتب و كأنها موضوعة في جدول واحد لأن أي معلومات سنطلبها من قاعدة البيانات سترجعها لنا في جدول واحد.
إذاً, في هذا الدرس سنتعلم طرق ربط المعلومات المخزنة في عدة جداول عند جلبها و عرضها في جدول واحد.
طرق ربط القيم التي يتم جلبها من عدة جداول
عند جلب المعلومات المخزنة في عدة جداول في وقت واحد, يوجد 4 طرق أساسية لتحديد كيف سيتم دمج معلوماتهم التي سيتم إرجاعها كالتالي.
- إذا اخترت الدمج Inner Join فأنت بذلك تريد الحصول فقط على القيم المشتركة بين الجدولين.
- إذا اخترت الدمج Full Join فأنت بذلك تريد الحصول على القيم المشتركة و الغير مشتركة بين الجدولين.
- إذا اخترت الدمج Left Join فأنت بذلك تريد الحصول على كل قيم الجدول الأيسر بالإضافة إلى القيم المشتركة معه من الجدول الأيمن.
- إذا اخترت الدمج Right Join فأنت بذلك تريد الحصول على كل قيم الجدول الأيمن بالإضافة إلى القيم المشتركة معه من الجدول الأيسر.
تجهيز قاعدة البيانات التي سنطبق عليها
قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash
تحتوي على الجداول التالية:
- الجدول الأول إسمه
countries
و هو مخصص لحفظ معلومات البلدان. - الجدول الثاني إسمه
users
و هو مخصص لحفظ معلومات المستخدمين و التي من ضمنها بلد كل مستخدم.
الإستعلام
بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash
و إنشاء الجدولين countries
و users
بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash
من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.
الجدول التالي يظهر البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول countries
.
countries | ||
---|---|---|
id | name | |
1 | KSA | |
2 | Oman | |
3 | Egypt | |
4 | Kuwait | |
5 | Bahrain |
الجدول التالي يظهر البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول users
.
users | ||||
---|---|---|---|---|
id | username | first_name | last_name | country_id |
1 | rami | Rami | Masri | 1 |
2 | ahmad | Ahmad | Naji | 2 |
3 | hanan | Hanan | Mostafa | 5 |
4 | saly | Saly | Harmush | NULL |
5 | samir | Samir | Saleh | 3 |
6 | hamad | Hamad | Akel | 2 |
7 | abdullah | Abdullah | Helmi | 1 |
8 | rashed | Rashed | Masri | 5 |
9 | majed | Majed | Alali | NULL |
10 | rayan | Rayan | Kasabi | NULL |
الآن, إذا وضعنا الجدولين بجانب بعض, سنلاحظ كيف ربطنا قيم الجدول users
بقيم الجدول countries
من خلال رقم التعرفة id
الخاص بكل بلد.
ملاحظات حول الجدول users
:
- عند تحديد بلدان المستخدمين لم نقم بكتابة أسماء البلدان من جديد, بل وضعنا فقط رقم
id
البلد المذكور في الجدولcountries
. - يوجد 3 مستخدمين لم يتم تحديد بلدهم, أي عندهم قيمة الحقل
country_id
تساوي NULL. - لا يوجد أي مستخدم من البلد الذي يملك رقم
id
يساوي 4, أي لا يوجد أي مستخدم من Kuwait.
كيف يتم ربط قيم الجداول في الإستعلام
حل مشكلة تضارب أسماء الأعمدة
عند جلب البيانات من أكثر من جدول, يجب تحديد إسم الجدول الذي يحتوي على العمود لتضمن أن لا يحدث تضارب في الأسماء.
فعلى سبيل المثال, في كل من الجدولين users
و countries
يوجد عمود إسمه id
.
إذا كنت سنحضر البيانات من هذين الجدولين في نفس الوقت فإنك حتماً ستواجه مشكلة تضارب الأسماء عند محاولة عرض قيم العمود id
لأن قاعدة البيانات لن تعرف أي id
بالضبط أنت تريد.
كل ما عليك فعله لتجنب حدوث تضارب في الأسماء هو ذكر إسم الجدول الذي تريد إحضار قيم العمود منه قبله كالتالي.
ذكر أسماء الجداول و أسماء الأعمدة التي تربط الجداول ببعضها
نقطة أخرى عليك الإنتباه لها و هي أنك حتى لو ذكرت إسم كل جدول ستحضر قيم أعمدته, فإنك لا تزال مجبر على ذكر إسم كل جدول بعد الكلمة FROM.
بالإضافة إلى ذلك فإنك أيضاً, يجب أن تحدد إسم العمود الذي يربطين الجدولين ببعضهما في نهاية الإستعلام بعد الكلمة ON كالتالي.
فمثلاً, إذا كنت ستحضر قيم من الجدولين users
و countries
في نفس الإستعلام, فيجب أن تفعل التالي:
- ذكر إسم الجدولين
users
وcountries
بعد الكلمة FROM لأنك يجب أن تذكر من أين ستحضر قيم الجداول. - وضع كلمة بين إسم الجدولين تحدد من خلالها كيف تريد أن يتم ربط قيمهما.
- وضع الكلمة ON في النهاية لتحديد أسماء الأعمدة التي تربط الجدولين ببعض.
جلب القيم المشتركة بين الجداول
نقصد بالقيم المشتركة بين الجداول, هو عندما يكون الجدول يشير إلى معلومة موجودة في جدول آخر. عندها تكون المعلومة مشتركة بينهما.
الصورة التالية توضح القيم المشتركة بين الجدولين users
و countries
.
قاعدة عامة
لجلب الأسطر التي تحتوي قيم مشتركة نضع بين الجداول الكلمة INNER JOIN و التي يمكنك اختصارها بالكلمة JOIN فقط.
لتحديد ما هو الحقل المشترك بين الجداول و الذي يربطهم مع بعض, نستخدم الكلمة ON.
مثال
الإستعلام التالي, يقوم بطباعة id
و username
و country
كل مستخدم بشرط ان يكون المستخدم يملك رقم بلد موجود في الجدول countries
.
الإستعلام
الفيديو التالي يشرح كود الإستعلام بدقة و يشرح كيف حصلنا على النتيجة.
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
لاحظ أن كل مستخدم لا يملك country_id
لم يتم وضعه في النتيجة.
id | username | country |
---|---|---|
1 | rami | KSA |
2 | ahmad | Oman |
3 | hanan | Bahrain |
5 | samir | Egypt |
6 | hamad | Oman |
7 | abdullah | KSA |
8 | rashed | Bahrain |
جلب كل قيم الجدول الأيسر بالإضافة إلى القيم المشتركة معه من الجدول الأيمن
لجلب كل قيم الجدول الأيسر بالإضافة إلى القيم المشتركة معه من الجدول الأيمن, نضع بين الجداول LEFT OUTER JOIN أو LEFT JOIN فقط.
الفكرة هنا هي أنه في حال كانت القيم التي ننوي إحضارها من الجداول الأيسر غير موجودة في الجدول الأيمن فإننا أيضاً نريد وضعها كالتالي.
مثال
الإستعلام التالي, يقوم بطباعة id
و username
و country
كل مستخدم موجود في الجدول users
سواء كان يملك رقم بلد محدد أم لا لأننا وضعنا الجدول users
من الناحية اليسرى و حددنا أننا نريد ربط الجدولين بطريقة LEFT JOIN.
إذاً في حال كان المستخدم يملك رقم بلد محدد, سيتم إستبداله بإسم بلده.
و في حال لم يكن يملك رقم بلد المستخدم محدد, سيتم وضع القيمة الموجودة أصلاً في العمود.
الإستعلام
الفيديو التالي يشرح كود الإستعلام بدقة و يشرح كيف حصلنا على النتيجة.
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
لاحظ أنه تم وضع كل المستخدمين, و تم وضع إسم بلد كل مستخدم يملك country_id
يشير لبلد موجود في الجدول countries
.
id | username | country |
---|---|---|
1 | rami | KSA |
2 | ahmad | Oman |
3 | hanan | Bahrain |
4 | saly | NULL |
5 | samir | Egypt |
6 | hamad | Oman |
7 | abdullah | KSA |
8 | rashed | Bahrain |
9 | majed | NULL |
10 | rayan | NULL |
جلب كل قيم الجدول الأيمن بالإضافة إلى القيم المشتركة معه من الجدول الأيسر
لجلب كل قيم الجدول الأيمن بالإضافة إلى القيم المشتركة معه من الجدول الأيسر, نضع بين الجداول RIGHT OUTER JOIN أو RIGHT JOIN فقط.
الفكرة هنا هي أنه في حال كانت القيم التي ننوي إحضارها من الجداول الأيسر غير موجودة في الجدول الأيمن فإننا أيضاً نريد وضعها كالتالي.
مثال
الإستعلام التالي, يقوم بطباعة id
و username
و country
كل مستخدم بشرط أن يكون يملك رقم بلد موجود في الجدول countries
.
كما أنه سيتم ذكر أسماء كل البلدان الموجودة في الجدول countries
سواء كان هناك مستخدم من هذا البلد أم لم يكن لأننا وضعنا الجدول countries
من الناحية اليمنى و حددنا أننا نريد ربط الجدولين بطريقة RIGHT JOIN.
إذاً في حال كان المستخدم يملك رقم بلد محدد, سيتم إستبداله بإسم بلده.
و في حال كان رقم البلد غير محدد من قبل أي مستخدم فإنه أيضاً سيتم عرضه.
الإستعلام
الفيديو التالي يشرح كود الإستعلام بدقة و يشرح كيف حصلنا على النتيجة.
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
لاحظ أنه تم وضع كل المستخدمين, و تم وضع إسم بلد كل مستخدم يملك country_id
يشير لبلد موجود في الجدول countries
.
id | username | country |
---|---|---|
1 | rami | KSA |
2 | ahmad | Oman |
3 | hanan | Bahrain |
5 | samir | Egypt |
6 | hamad | Oman |
7 | abdullah | KSA |
8 | rashed | Bahrain |
NULL | NULL | Kuwait |
جلب القيم المشتركة و الغير مشتركة بين الجداول
نقصد بالقيم المشتركة و الغير مشتركة هي أنه يجب إحضار كل المعلومات الموجودة في الجداول مع ربط القيم المشتركة بينهما.
الصورة التالية توضح القيم المشتركة و الغير مشتركة بين الجدولين users
و countries
.
قاعدة عامة
جلب الأسطر التي تحتوي قيم مشتركة و غير مشتركة يختلف من قاعدة بيانات لأخرى.
في قواعد بيانات SQL Server يمكنك بكل سهولة وضع الكلمة FULL OUTER JOIN بين أسماء الجداول فقط و التي يمكنك اختصارها بالكلمة FULL JOIN أيضاً.
و بالطبع لتحديد ما هو الحقل المشترك بين الجداول و الذي يربطهم مع بعض, نستخدم الكلمة ON.
كحل عام يمكن تطبيقه مع جميع قواعد البيانات بما فيها قواعد بيانات MySQL, يمكنك إحضار كل القيم الموجودة في الجدول الأيسر مع القيم المشتركة معها في الجدول الأيمن و إحضار كل القيم الموجودة في الجدول الأيمن مع القيم المشتركة معها في الجدول الأيسر و من ثم دمجها مع بعض و إزالة القيم المكررة بواسطة الأمر UNION.
مثال
الإستعلام التالي, يقوم بجلب معلومات المستخدم سواء كانت مرتبطة بالجدول countries
أو غير مرتبطة به.
كما أنه يقوم بجلب أسماء البلدان سواء كانت مرتبطة بالجدول users
أو غير مرتبطة به.
الإستعلام
الفيديو التالي يشرح كود الإستعلام بدقة و يشرح كيف حصلنا على النتيجة.
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
لاحظ أنه تم وضع كل مستخدم سواء كان يملك رقم بلد محدد أم لا, و تم وضع كل بلد سواء كان هناك مستخدم منه أم لا.
id | username | country |
---|---|---|
1 | rami | KSA |
2 | ahmad | Oman |
3 | hanan | Bahrain |
4 | saly | NULL |
5 | samir | Egypt |
6 | hamad | Oman |
7 | abdullah | KSA |
8 | rashed | Bahrain |
9 | majed | NULL |
10 | rayan | NULL |
NULL | NULL | Kuwait |