الفرق بين المراجعتين لصفحة: «SQL/join»

من موسوعة حسوب
< SQL
ط خطأ مطبعي
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}'
سطر 486: سطر 486:
* [https://www.sqlite.org/syntax/join-operator.html توثيق JOIN في محرك SQLite]
* [https://www.sqlite.org/syntax/join-operator.html توثيق JOIN في محرك SQLite]
* [https://msdn.microsoft.com/en-us/library/zt8wzxy4.aspx?f=255&MSPPError=-2147217396 توثيق JOIN في محرك SQLServer]
* [https://msdn.microsoft.com/en-us/library/zt8wzxy4.aspx?f=255&MSPPError=-2147217396 توثيق JOIN في محرك SQLServer]
[[تصنيف:SQL]]
[[تصنيف:SQL|{{SUBPAGENAME}}]]
[[تصنيف:SQL Join]]
[[تصنيف:SQL Join|{{SUBPAGENAME}}]]

مراجعة 15:39، 28 يناير 2018

تخزن البيانات عادةً في قواعد البيانات بأكثر من جدول لتسهيل تنظيمها وإدارتها، وتُربط هذه الجداول فيما بينها من خلال الأعمدة المترابطة فيما بينها، وذلك بالاعتماد على مفهومي المفتاح الأولي Primary Key والمفتاح الثانوي Foreign Key، وله عدة أنواع ستُذكر تباعًا.

أنواع ربط الجداول

توجد عدة أنواع للربط بين جدولين (أو أكثر)، إذ يسمى الجدول الأول يساريًا والجدول الثاني يمينًا:

  1. الربط الداخلي INNER JOIN: تحديد بعض السجلات من الجدول اليساري والجدول اليميني بحيث تحقق شرط الربط.
  2. الربط اليساري LEFT JOIN: تحديد كافة السجلات من الجدول اليساري وبعض السجلات من الجدول اليميني التي تحقق شرط الربط.
  3. الربط اليميني RIGHT JOIN: تحديد بعض السجلات التي تحقق شرط الربط من الجدول اليساري وكافة السجلات من الجدول اليميني.
  4. الربط التام FULL JOIN: تحديد كافة السجلات من الجدولين اليساري واليميني بغض النظر عن تحقيقها للشرط.

وهذه الأنواع موضحة باستخدام مخططات Venn.

ربط أكثر من جدولين

عند ربط أكثر من جدول يكون الربط باستخدام JOIN (بأحد الأنواع الأربع) عدة مرات لتشكيل جداول مرحلية يُربط فيما بينها للحصول على جدول الربط النهائي.

مثال

تحتوي قاعدة بيانات أحد المراكز التعليمية الجداول الآتية:

الجدول الأول: جدول الطلاب students

(المفتاح الأولي فيه هو عمود StudentID والمفتاح الثانوي هو عمود CourseID للربط مع جدول الدورات التدريبية)

RegDate CourseID LastName FirstName StudentID
‎07-JUL-2017 0206 Najjar Rama 1147
‎08-NOV-2017 0604 Kordi Jenan 1148
‎07-JUL-2017 0206 Bitar Rahaf 1149
‎20-AUG-2017 0607 Taweel Farah 1150
‎08-NOV-2017 0610 Arab Rami 1151
‎24-OCT-2017 0803 Akkad Aya 1152
‎08-NOV-2017 0504 Haddad Abed 1153
‎20-AUG-2017 0801 Fares Tasneem 1154
‎24-OCT-2017 0607 Hamsho Monther 1155
‎30-SEP-2017 0607 Abd Allah Hiba 1156
‎07-JUL-2017 0509 Khatib Mohammad 1157
‎20-AUG-2017 0801 Sharif Ibrahim 1158
‎24-OCT-2017 0802 Fehmi Hanin 1159
‎20-AUG-2017 0204 Zein Loujain 1160
‎08-NOV-2017 0503 Helali Ammar 1161

الجدول الثاني: جدول الدورات التدريبية courses

(المفتاح الأولي فيه هو عمود CourseID والمفتاح الثانوي هو عمود DepartmentID للربط مع جدول الأقسام)

DepartmentID Lecturer Course CourseID
EN01 Dr. Reem Hadi English (Adv)‎ 0204
EN01 Dr. Shadi Balid English (Int)‎ 0206
EN02 Dr. Firas Abd English (TOEFL)‎ 0211
IT01 Eng. Nasser Sharif Artificial Intelligence 0604
IT01 Eng. Amal Safi Networks 0607
IT01 Eng. Salem Najm ICDL 0610
IT02 Eng. Nasser Sharif SQL Programming 0703
IT02 Eng. Amal Safi FrontEnd Programming 0704
IT03 Mr. Maher Siraj Photoshop Design 0801
IT03 Ms. Nadia Taleb Illustrator Design 0802
IT03 Mr. Maher Siraj UI Design 0803

الجدول الثالث: جدول الأقسام departments

(المفتاح الأولي فيه هو DepartmentID)

Head DepatementName DepartmentID
Dr. Firas Abd General English EN01
Dr. Saer Raslan Advanced English EN02
Dr. Osama Najjar Information Technology IT01
Eng. Amal Safi Programming IT02
Eng. Fares Ahmad Graphic Design IT03

لربط الجداول الثلاث السابقة يُربط الجدول الأول students مع الجدول الثاني courses عبر العمود CourseID بالعبارة:

students INNER JOIN courses ON students.CourseID = courses.CourseID

ومن ثم يربط الجدول الناتج مع الجدول الثالث عبر العمود DepartmentID بالعبارة:

INNER JOIN departments ON courses.DepartmentID = departments.DepartmentID

ليصبح الاستعلام بشكله الكامل:

SELECT StudentID, FirstName, Course, Lecturer, DepartmentName
FROM (
  (students INNER JOIN courses ON students.CourseID = courses.CourseID)
  INNER JOIN departments ON courses.DepartmentID = departments.DepartmentID);

وتظهر النتائج بالشكل الآتي:

DepartmentName Lecturer Course FirstName StudentID
General English Dr. Shadi Balid English (Int)‎ Rama 1147
Information Technology Eng. Nasser Sharif Artificial Intelligence Jenan 1148
General English Dr. Shadi Balid English (Int)‎ Rahaf 1149
Information Technology Eng. Amal Safi Networks Farah 1150
Information Technology Eng. Salem Najm ICDL Rami 1151
Graphic Design Mr. Maher Siraj UI Design Aya 1152
Graphic Design Mr. Maher Siraj Photoshop Design Tasneem 1154
Information Technology Eng. Amal Safi Networks Monther 1155
Information Technology Eng. Amal Safi Networks Hiba 1156
Graphic Design Mr. Maher Siraj Photoshop Design Ibrahim 1158
Graphic Design Ms. Nadia Taleb Illustrator Design Hanin 1159
General English Dr. Reem Hadi English (Adv)‎ Loujain 1160

دمج النتائج من استعلامي SELECT في جدول واحد

يمكن دمج السجلات الناتجة عن استعلامي SELECT في جدول واحد من خلال الكلمة المفتاحية UNION التي توضع بين الاستعلامين.

مثال

إذا كان الجدولان الآتيان موجودَين في قاعدة البيانات بالشكل الآتي:

الجدول الأول: مجموعة الدورات التدريبية في المركز الأول

Lecturer Course CourseID
Dr. Reem Hadi English (Adv)‎ 0204
Dr. Shadi Balid English (Int)‎ 0206
Dr. Firas Abd English (TOEFL)‎ 0211
Eng. Nasser Sharif Artificial Intelligence 0604
Eng. Amal Safi Networks 0607
Eng. Salem Najm ICDL 0610
Eng. Nasser Sharif SQL Programming 0703
Eng. Amal Safi FrontEnd Programming 0704
Mr. Maher Siraj Photoshop Design 0801
Ms. Nadia Taleb Illustrator Design 0802
Mr. Maher Siraj UI Design 0803

الجدول الثاني: مجموعة الدورات التدريبية في المركز الثاني

Lecturer Course CourseID
Dr. Reem Hadi English (Bas)‎ 0205
Dr. Shadi Balid English (Int)‎ 0206
Dr. Firas Abd English (IELTS)‎ 0208
Eng. Nasser Sharif C# Programming 0705
Eng. Amal Safi PHP Programming 0706
Mr. Maher Siraj AfterEffects Design 0804
Ms. Nadia Taleb 3D MAX Design 0805

فيمكن عرض سجلات الجدولين ضمن جدول واحد عبر الاستعلام الآتي:

SELECT CourseID, Course
FROM firstCentre
UNION
SELECT CourseID, Course
FROM secondCentre
ORDER BY Course DESC;

إذ دُمجت سجلات الجدولين عبر الكلمة المفتاحية UNION ورُتبت النتائج بشكل تنازليّ بحسب اسم الدورة التدريبية لتظهر النتائج الآتية:

Course CourseID
UI Design 0803
SQL Programming 0703
PHP Programming 0706
Photoshop Design 0801
Networks 0607
Illustrator Design 0802
ICDL 0610
FrontEnd Programming 0704
English (TOEFL)‎ 0211
English (Int)‎ 0206
English (IELTS)‎ 0208
English (Bas)‎ 0205
English (Adv)‎ 0204
C# Programming 0705
Artificial Intelligence 0604
AfterEffects Design 0804
3D MAX Design 0805

ويُلاحظ أن السجل المكرر في الجدولين لم يظهر سوى كسجل وحيد في النتائج لأن الكلمة المفتاحية UNION لا تعرض السجلات المكررة إلا بوجود الكلمة المفتاحية ALL والتي ستحدد عرض كافة السجلات متضمنةً التكرار إن وُجد، أي يصبح الاستعلام بالشكل الآتي:

SELECT CourseID, Course
FROM firstCentre
UNION ALL
SELECT CourseID, Course
FROM secondCentre
ORDER BY Course DESC;

وستظهر نفس النتائج السابقة مع تكرار سجل الدورة التدريبية English (Int)‎.

التوافقية

SQLServer SQLite Oracle PostgreSQL MySQL
نعم نعم نعم نعم نعم

مصادر