SQLite ضم: طبيعي يسار خارجي، داخلي، متقاطع مع الجداول
⚡ ملخص ذكي
SQLite تجمع عبارات JOIN الصفوف من جدولين أو أكثر باستخدام INNER JOIN و JOIN USING و NATURAL JOIN و LEFT OUTER JOIN و CROSS JOIN، مما يتيح لك مطابقة السجلات ذات الصلة بواسطة الأعمدة المشتركة وقراءة البيانات عبر قاعدة بيانات موحدة.

SQLite يدعم أنواع مختلفة من SQL عمليات الانضمام، مثل INNER JOIN، وLEFT OUTER JOIN، وCROSS JOIN. يتم استخدام كل نوع من أنواع JOIN لحالة مختلفة كما سنرى في هذا البرنامج التعليمي.
مقدمة إلى SQLite شرط الانضمام
عندما تعمل على قاعدة بيانات تحتوي على جداول متعددة، غالبًا ما تحتاج إلى الحصول على البيانات من هذه الجداول المتعددة.
باستخدام جملة JOIN، يمكنك ربط جدولين أو أكثر من الجداول أو الاستعلامات الفرعية من خلال الانضمام إليهم. يمكنك أيضًا تحديد العمود الذي تريد ربط الجداول به وبأي شروط.
يجب أن يحتوي أي شرط JOIN على الصيغة التالية:
تحتوي كل جملة انضمام على:
- جدول أو استعلام فرعي وهو الجدول الأيسر؛ الجدول أو الاستعلام الفرعي قبل عبارة الربط (على يساره).
- عامل الانضمام - حدد نوع الانضمام (إما انضمام داخلي، أو انضمام خارجي يسار، أو انضمام متقاطع).
- قيد الانضمام - بعد تحديد الجداول أو الاستعلامات الفرعية للانضمام، تحتاج إلى تحديد قيد الربط، والذي سيكون شرطًا يتم من خلاله تحديد الصفوف المطابقة التي تطابق هذا الشرط اعتمادًا على نوع الربط.
لاحظ أنه بالنسبة لكل ما يلي SQLite بالنسبة لأمثلة جداول JOIN، يجب عليك تشغيل sqlite3.exe وفتح اتصال بقاعدة البيانات النموذجية كما يلي:
الخطوة 1) في هذه الخطوة، افتح جهاز الكمبيوتر الخاص بك وانتقل إلى الدليل التالي "C:\sqlite" ثم افتح "sqlite3.exe":
الخطوة 2) افتح قاعدة البيانات "TutorialsSampleDB.db" باستخدام الأمر التالي:
أنت الآن جاهز لتشغيل أي نوع من الاستعلامات في قاعدة البيانات.
SQLite INNER JOIN
تقوم عملية الربط الداخلي (INNER JOIN) بإرجاع الصفوف التي تطابق شرط الربط فقط، وتزيل جميع الصفوف الأخرى التي لا تطابق شرط الربط.
مثال
في المثال التالي، سنقوم بربط الجدولين "الطلاب" و "الأقسام" باستخدام DepartmentId للحصول على اسم القسم لكل طالب، كما يلي:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
شرح الكود
يعمل INNER JOIN على النحو التالي:
- في جملة التحديد، يمكنك تحديد الأعمدة التي تريد تحديدها من الجدولين المشار إليهما.
- تتم كتابة جملة INNER JOIN بعد الجدول الأول المشار إليه بجملة "من".
- ثم يتم تحديد شرط الانضمام مع ON.
- يمكن تحديد الأسماء المستعارة للجداول المشار إليها.
- الكلمة الداخلية اختيارية، يمكنك فقط كتابة JOIN.
الناتج
تُنتج عملية الربط الداخلي (INNER JOIN) السجلات من كلا الجدولين - جدول الطلاب وجدول الأقسام - التي تُطابق الشرط "Students.DepartmentId = Departments.DepartmentId". وسيتم تجاهل الصفوف غير المطابقة ولن تُدرج في النتيجة.
لهذا السبب، لم تظهر سوى 8 طلاب من أصل 10 طلاب في هذا الاستعلام من أقسام تكنولوجيا المعلومات والرياضيات والفيزياء. أما الطالبان "جينا" و"جورج" فلم يتم تضمينهما، لأن معرّف القسم الخاص بهما فارغ، وهو لا يتطابق مع عمود معرّف القسم في جدول الأقسام. كما يلي:
SQLite انضم...استخدم
يمكن كتابة INNER JOIN باستخدام عبارة "USING" لتجنب التكرار، لذلك بدلاً من كتابة "ON Student.DepartmentId = Departments.DepartmentId"، يمكنك فقط كتابة "USING(DepartmentID)".
يمكنك استخدام "JOIN .. USING" عندما تكون الأعمدة التي ستقارنها في شرط الربط بنفس الاسم. في مثل هذه الحالات، ليست هناك حاجة لتكرارها باستخدام الشرط، فقط قم بذكر أسماء الأعمدة و SQLite سوف يكتشف ذلك.
الفرق بين INNER JOIN و JOIN .. USING:
باستخدام "JOIN … USING" لا تكتب شرط الربط، بل تكتب فقط عمود الربط المشترك بين الجدولين المربوطين، فبدلاً من كتابة table1 "INNER JOIN table2 ON table1.cola = table2.cola" نكتبها هكذا "table1 JOIN table2 USING(cola)".
مثال
في المثال التالي، سنقوم بربط الجدولين "الطلاب" و "الأقسام" باستخدام DepartmentId للحصول على اسم القسم لكل طالب، كما يلي:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments USING(DepartmentId);
تفسير
- على عكس المثال السابق، لم نكتب "ON Students.DepartmentId = Departments.DepartmentId". بل كتبنا فقط "USING(DepartmentId)".
- SQLite يستنتج شرط الانضمام تلقائيًا ويقارن DepartmentId من كلا الجدولين - الطلاب والأقسام.
- يمكنك استخدام بناء الجملة هذا عندما يكون العمودان اللذان تقارنهما بنفس الاسم.
الناتج
سيعطيك هذا نفس النتيجة تمامًا مثل المثال السابق:
SQLite الانضمام الطبيعي
الصلة الطبيعية تشبه الصلة...بالاستخدام، الفرق هو أنها تختبر تلقائيًا المساواة بين قيم كل عمود موجود في كلا الجدولين.
الفرق بين INNER JOIN و NATURAL JOIN:
- في عملية الربط الداخلي (INNER JOIN)، يجب تحديد شرط الربط الذي تستخدمه هذه العملية لربط الجدولين. أما في الربط الطبيعي (Natural JOIN)، فلا حاجة لكتابة شرط الربط، بل يكفي كتابة اسمي الجدولين دون أي شرط. عندها، يقوم الربط الطبيعي تلقائيًا باختبار تساوي القيم في كل عمود موجود في كلا الجدولين، ويستنتج شرط الربط تلقائيًا.
- في NATURAL JOIN، سيتم مطابقة كافة الأعمدة من كلا الجدولين بنفس الاسم مع بعضها البعض. على سبيل المثال، إذا كان لدينا جدولين لهما اسمان مشتركان للعمودين (العمودان موجودان بنفس الاسم في الجدولين)، فإن الصلة الطبيعية ستربط بين الجدولين عن طريق مقارنة قيم كلا العمودين وليس من عمود واحد فقط عمود.
مثال
SELECT Students.StudentName, Departments.DepartmentName FROM Students Natural JOIN Departments;
تفسير
- لسنا بحاجة لكتابة شرط الربط مع أسماء الأعمدة (كما فعلنا في INNER JOIN). لم نكن بحاجة حتى لكتابة اسم العمود مرة واحدة (كما فعلنا في JOIN USING).
- سوف تقوم الصلة الطبيعية بفحص كلا الأعمدة من الجدولين. سيكتشف أن الشرط يجب أن يتكون من مقارنة معرف القسم من الجدولين الطلاب والأقسام.
الناتج
ستُعطي عملية الربط الطبيعي نفس الناتج تمامًا كما في مثالَي الربط الداخلي والربط باستخدام، لأن الاستعلامات الثلاثة متكافئة في مثالنا. ولكن في بعض الحالات، سيختلف الناتج بين الربط الداخلي والربط الطبيعي. على سبيل المثال، إذا كان هناك أكثر من جدول بنفس الأسماء، فسيربط الربط الطبيعي جميع الأعمدة ببعضها. أما الربط الداخلي، فسيربط فقط الأعمدة المحددة في شرط الربط.
SQLite ترك صلة خارجية
يُحدد معيار SQL ثلاثة أنواع من عمليات الربط الخارجي: الربط الأيسر، والربط الأيمن، والربط الكامل، ولكن SQLite يدعم فقط الارتباط الخارجي الأيسر الطبيعي.
في عملية الربط الخارجي الأيسر، سيتم تضمين جميع قيم الأعمدة التي تحددها من الجدول الأيسر في نتيجة الاستعلام، لذلك بغض النظر عما إذا كانت القيمة تطابق شرط الربط أم لا، فسيتم تضمينها في النتيجة.
إذا كان الجدول الأيسر يحتوي على 'ن' صفًا، فستحتوي نتائج الاستعلام على 'ن' صفًا أيضًا. مع ذلك، بالنسبة لقيم الأعمدة الواردة من الجدول الأيمن، إذا لم تتطابق أي قيمة مع شرط الربط، فستحتوي على قيمة "فارغة".
لذلك، سوف تحصل على عدد من الصفوف يعادل عدد الصفوف في الصلة اليسرى. بحيث تحصل على الصفوف المتطابقة من كلا الجدولين (مثل نتائج INNER JOIN)، بالإضافة إلى الصفوف غير المتطابقة من الجدول الأيسر.
مثال
في المثال التالي، سنحاول استخدام "LEFT JOIN" لربط الجدولين "الطلاب" و"الأقسام":
SELECT Students.StudentName, Departments.DepartmentName FROM Students -- this is the left table LEFT JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
تفسير
- SQLite بناء جملة LEFT JOIN هو نفس INNER JOIN؛ تكتب الرابط الأيسر بين الجدولين، ثم يأتي شرط الربط بعد جملة ON.
- الجدول الأول بعد جملة from هو الجدول الأيسر. في حين أن الجدول الثاني المحدد بعد LEFT JOIN الطبيعي هو الجدول الأيمن.
- الجملة OUTER اختيارية؛ الصلة الخارجية الطبيعية اليسرى هي نفس الصلة اليسرى.
الناتج
كما تلاحظ، تم تضمين جميع صفوف جدول الطلاب، وعددهم الإجمالي عشرة طلاب. حتى الطالبان الرابع والأخير، جينا وجورج، لديهما معرفات أقسام غير موجودة في جدول الأقسام، فقد تم تضمينهما أيضاً.
وفي هذه الحالات، ستكون قيمة departmentName لكل من جينا وجورج "null" لأن جدول الأقسام لا يحتوي على اسم قسم يطابق قيمة departmentId الخاصة بهما.
دعونا نقدم شرحاً أعمق للاستعلام السابق باستخدام الربط الأيسر باستخدام مخططات فين:
ستُظهر عملية الربط الخارجي الأيسر (LEFT JOIN) جميع أسماء الطلاب من جدول الطلاب، حتى لو كان للطالب رقم قسم غير موجود في جدول الأقسام. لذا، لن يُظهر الاستعلام الصفوف المتطابقة فقط كما في عملية الربط الداخلي (INNER JOIN)، بل سيُظهر الجزء الإضافي الذي يحتوي على الصفوف غير المتطابقة من الجدول الأيسر، وهو جدول الطلاب.
لاحظ أن أي اسم طالب لا يحتوي على قسم مطابق سيكون له قيمة "خالية" لاسم القسم، لأنه لا توجد قيمة مطابقة له، وهذه القيم هي القيم الموجودة في الصفوف غير المطابقة.
SQLite الصليب الانضمام
توفر CROSS JOIN المنتج الديكارتي للأعمدة المحددة في الجدولين المرتبطين، عن طريق مطابقة جميع القيم من الجدول الأول مع جميع القيم من الجدول الثاني.
لذلك، لكل قيمة في الجدول الأول، سوف تحصل على تطابقات 'n' من الجدول الثاني حيث n هو عدد صفوف الجدول الثاني.
على عكس الربط الداخلي والربط الخارجي الأيسر، لا تحتاج في الربط المتقاطع إلى تحديد شرط الربط، لأن SQLite لا يحتاج إليه لعملية الربط المتقاطع.
استخدم SQLite سيؤدي ذلك إلى مجموعة نتائج منطقية من خلال دمج جميع القيم من الجدول الأول مع جميع القيم من الجدول الثاني.
على سبيل المثال، إذا قمت بتحديد عمود من الجدول الأول (colA) وعمود آخر من الجدول الثاني (colB)، فإن colA يحتوي على قيمتين (1، 2) وcolB يحتوي أيضًا على قيمتين (3، 4).
ثم ستكون نتيجة CROSS JOIN أربعة صفوف:
- صفين من خلال دمج القيمة الأولى من colA وهي 1 مع قيمتي colB (3,4) والتي ستكون (1,3)، (1,4).
- وبالمثل، صفين عن طريق الجمع بين القيمة الثانية من colA وهي 2 مع القيمتين من colB (3,4،2,3) وهما (2,4،XNUMX)، (XNUMX،XNUMX).
مثال
في الاستعلام التالي سنحاول استخدام CROSS JOIN بين جدولي Students و Departments:
SELECT Students.StudentName, Departments.DepartmentName FROM Students CROSS JOIN Departments;
تفسير
- في خانة رمز الخصم، أدخل TABBYDAY. SQLite اختر من بين جداول متعددة، لقد اخترنا للتو عمودين "اسم الطالب" من جدول الطلاب و"اسم القسم" من جدول الأقسام.
- بالنسبة لعملية الربط المتقاطع، لم نحدد أي شرط ربط، فقط الجدولين المدمجين باستخدام CROSS JOIN في منتصفهما.
الناتج
كما ترى، النتيجة هي 40 صفًا؛ 10 قيم من جدول الطلاب مطابقة للأقسام الأربعة من جدول الأقسام. على النحو التالي:
- أربع قيم للأقسام الأربعة من جدول الأقسام متطابقة مع الطالب الأول ميشيل.
- أربع قيم للأقسام الأربعة من جدول الأقسام تطابقت مع الطالب الثاني جون.
- أربع قيم للأقسام الأربعة من جدول الأقسام تطابقت مع الطالب الثالث جاك... وهكذا.











