الفرق بين المراجعتين لصفحة: «SQL/join»
ط خطأ مطبعي |
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{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، وله عدة أنواع ستُذكر تباعًا.
أنواع ربط الجداول
توجد عدة أنواع للربط بين جدولين (أو أكثر)، إذ يسمى الجدول الأول يساريًا والجدول الثاني يمينًا:
- الربط الداخلي INNER JOIN: تحديد بعض السجلات من الجدول اليساري والجدول اليميني بحيث تحقق شرط الربط.
- الربط اليساري LEFT JOIN: تحديد كافة السجلات من الجدول اليساري وبعض السجلات من الجدول اليميني التي تحقق شرط الربط.
- الربط اليميني RIGHT JOIN: تحديد بعض السجلات التي تحقق شرط الربط من الجدول اليساري وكافة السجلات من الجدول اليميني.
- الربط التام 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 |
---|---|---|---|---|
نعم | نعم | نعم | نعم | نعم |