الربط (SQL)
تُستخدم عبارة الربط في لغة الاستعلامات البنيوية ( SQL ) لدمج أعمدة من جدول واحد أو أكثر في جدول جديد. تُشابه هذه العملية عملية الربط في الجبر العلائقي . ببساطة، يربط الربط جدولين ويضع في نفس الصف السجلات ذات الحقول المتطابقة. توجد عدة صيغ لعبارة الربط JOIN: INNER`--` LEFT OUTER, `--` RIGHT OUTER, `--` FULL OUTER, `--` CROSS, وغيرها.
جداول الأمثلة
لشرح أنواع الربط، يستخدم الجزء المتبقي من هذه المقالة الجداول التالية:
| اسم العائلة | معرف القسم |
|---|---|
| رافيرتي | 31 |
| جونز | 33 |
| هايزنبرغ | 33 |
| روبنسون | 34 |
| سميث | 34 |
| ويليامز | NULL |
| معرف القسم | اسم القسم |
|---|---|
| 31 | مبيعات |
| 33 | هندسة |
| 34 | الأعمال المكتبية |
| 35 | تسويق |
Department.DepartmentIDهو المفتاح الأساسي للجدول Department، بينما Employee.DepartmentIDهو مفتاح خارجي .
لاحظ أنه في هذا التقرير Employee، لم يتم بعد تعيين "ويليامز" في أي قسم. كما لم يتم تعيين أي موظفين في قسم "التسويق".
هذه هي عبارات SQL لإنشاء الجداول المذكورة أعلاه:
إنشاء جدول القسم (DepartmentID INT PRIMARY KEY NOT NULL ,اسم القسم VARCHAR ( 20 ));إنشاء جدول الموظفين (LastName VARCHAR ( 20 ),DepartmentID INT REFERENCES department ( DepartmentID ));أدخل في جدول القسمالقيم ( 31 ، 'المبيعات' )،( 33 ، "الهندسة" )( 34 ، "كتابي" )،( 35 ، "التسويق" )؛أدخل في جدول الموظفينالقيم ( 'Rafferty' ، 31 )،( جونز ، 33 )،( هايزنبرغ ، 33 )،( روبنسون ، 34 )،( سميث ، 34 )،( 'Williams' , NULL );وصلة متقاطعة
CROSS JOINتُعيد هذه الدالة حاصل الضرب الديكارتي لصفوف الجداول في عملية الربط. بعبارة أخرى، ستنتج صفوفًا تجمع كل صف من الجدول الأول مع كل صف من الجدول الثاني. [ 1 ]
| اسم عائلة الموظف | معرف القسم للموظف | اسم القسم. | Department.DepartmentID |
|---|---|---|---|
| رافيرتي | 31 | مبيعات | 31 |
| جونز | 33 | مبيعات | 31 |
| هايزنبرغ | 33 | مبيعات | 31 |
| سميث | 34 | مبيعات | 31 |
| روبنسون | 34 | مبيعات | 31 |
| ويليامز | NULL | مبيعات | 31 |
| رافيرتي | 31 | هندسة | 33 |
| جونز | 33 | هندسة | 33 |
| هايزنبرغ | 33 | هندسة | 33 |
| سميث | 34 | هندسة | 33 |
| روبنسون | 34 | هندسة | 33 |
| ويليامز | NULL | هندسة | 33 |
| رافيرتي | 31 | الأعمال المكتبية | 34 |
| جونز | 33 | الأعمال المكتبية | 34 |
| هايزنبرغ | 33 | الأعمال المكتبية | 34 |
| سميث | 34 | الأعمال المكتبية | 34 |
| روبنسون | 34 | الأعمال المكتبية | 34 |
| ويليامز | NULL | الأعمال المكتبية | 34 |
| رافيرتي | 31 | تسويق | 35 |
| جونز | 33 | تسويق | 35 |
| هايزنبرغ | 33 | تسويق | 35 |
| سميث | 34 | تسويق | 35 |
| روبنسون | 34 | تسويق | 35 |
| ويليامز | NULL | تسويق | 35 |
مثال على عملية الربط المتقاطع الصريحة:
SELECT * FROM employee CROSS JOIN department ;مثال على الربط المتقاطع الضمني:
SELECT * FROM employee , department ;يمكن استبدال عملية الربط المتقاطع بعملية الربط الداخلي بشرط صحيح دائمًا:
SELECT * FROM employee INNER JOIN department ON 1 = 1 ;CROSS JOINCROSS JOINلا يطبق الاستعلام نفسه أي شرط لتصفية الصفوف من الجدول المدمج. يمكن تصفية نتائج الاستعلام باستخدام WHEREعبارة، والتي قد تُنتج ما يُعادل عملية الربط الداخلي.
في معيار SQL:2011 ، تعتبر عمليات الربط المتقاطع جزءًا من حزمة F401 الاختيارية، "جدول الربط الممتد".
الاستخدامات العادية هي للتحقق من أداء الخادم.
وصلة داخلية
تتطلب عملية الربط الداخلي (أو الربط ) أن تتطابق قيم الأعمدة في كل صف من الجدولين المربوطين، وهي عملية ربط شائعة الاستخدام في التطبيقات، ولكن لا ينبغي اعتبارها الخيار الأمثل في جميع الحالات. تُنشئ عملية الربط الداخلي جدول نتائج جديدًا بدمج قيم الأعمدة في جدولين (أ و ب) بناءً على شرط الربط. يقارن الاستعلام كل صف من الجدول أ مع كل صف من الجدول ب للعثور على جميع أزواج الصفوف التي تُحقق شرط الربط. عندما يتحقق شرط الربط بتطابق القيم غير الفارغة ، تُدمج قيم الأعمدة لكل زوج متطابق من الصفوف في الجدولين أ و ب في صف نتائج واحد.
يمكن تعريف نتيجة عملية الربط بأنها ناتج عملية الضرب الديكارتي (أو الربط المتقاطع ) لجميع صفوف الجداول (بدمج كل صف في الجدول أ مع كل صف في الجدول ب)، ثم إرجاع جميع الصفوف التي تحقق شرط الربط. تستخدم تطبيقات SQL الفعلية عادةً أساليب أخرى، مثل الربط التجزئي أو الربط بالفرز والدمج ، لأن حساب الضرب الديكارتي أبطأ ويتطلب في كثير من الأحيان مساحة تخزين كبيرة جدًا.
تحدد لغة SQL طريقتين مختلفتين للتعبير عن عمليات الربط: "الربط الصريح" و"الربط الضمني". لم يعد "الربط الضمني" يُعتبر من أفضل الممارسات ، على الرغم من أن أنظمة قواعد البيانات لا تزال تدعمه.
تستخدم "صيغة الربط الصريحة" الكلمة JOINالمفتاحية، والتي يمكن أن تسبقها الكلمة INNERالمفتاحية، لتحديد الجدول المراد ربطه، والكلمة ONالمفتاحية لتحديد الشروط اللازمة للربط، كما في المثال التالي:
SELECT employee.LastName , employee.DepartmentID , department.DepartmentName FROM employee INNER JOIN department ON employee.DepartmentID = department.DepartmentID ;| اسم عائلة الموظف | معرف القسم للموظف | اسم القسم. |
|---|---|---|
| روبنسون | 34 | الأعمال المكتبية |
| جونز | 33 | هندسة |
| سميث | 34 | الأعمال المكتبية |
| هايزنبرغ | 33 | هندسة |
| رافيرتي | 31 | مبيعات |
تُدرج صيغة الربط الضمني ببساطة الجداول المراد ربطها، في FROMبند العبارة SELECT، باستخدام الفواصل للفصل بينها. وبالتالي، فهي تُحدد ربطًا متقاطعًا ، WHEREويمكن أن يُطبق البند شروط تصفية إضافية (والتي تعمل بشكل مشابه لشروط الربط في الصيغة الصريحة).
المثال التالي مكافئ للمثال السابق، ولكن هذه المرة باستخدام صيغة الربط الضمني:
حدد اسم عائلة الموظف ، ومعرف القسم الخاص به ، واسم القسم الخاص بالقسم من جدول الموظفين وجدول الأقسام حيث يكون معرف القسم الخاص بالموظف مساوياً لمعرف القسم الخاص بالقسم .ستربط الاستعلامات الموضحة في الأمثلة أعلاه جدولي الموظفين والأقسام باستخدام عمود DepartmentID في كلا الجدولين. عند تطابق قيمة DepartmentID في هذين الجدولين (أي عند تحقق شرط الربط)، سيجمع الاستعلام أعمدة LastName و DepartmentID و DepartmentName من الجدولين في صف واحد. أما في حال عدم تطابق قيمة DepartmentID، فلن يتم إنشاء أي صف.
وبالتالي ستكون نتيجة تنفيذ الاستعلام أعلاه كما يلي:
| اسم عائلة الموظف | معرف القسم للموظف | اسم القسم. |
|---|---|---|
| روبنسون | 34 | الأعمال المكتبية |
| جونز | 33 | هندسة |
| سميث | 34 | الأعمال المكتبية |
| هايزنبرغ | 33 | هندسة |
| رافيرتي | 31 | مبيعات |
لا يظهر الموظف "ويليامز" ولا القسم "التسويق" في نتائج تنفيذ الاستعلام. لا يوجد أي سجل مطابق لأي منهما في الجدول الآخر: "ويليامز" ليس له قسم مرتبط به، ولا يوجد موظف يحمل معرّف القسم 35 ("التسويق"). قد يكون هذا السلوك، بحسب النتائج المرجوة، خطأً برمجيًا دقيقًا، ويمكن تجنبه باستبدال الربط الداخلي بربط خارجي .
الربط الداخلي والقيم الفارغة
ينبغي على المبرمجين توخي الحذر عند ربط الجداول باستخدام أعمدة قد تحتوي على قيم فارغة (NULL )، لأن القيمة الفارغة لن تتطابق مع أي قيمة أخرى (ولا حتى مع القيمة الفارغة نفسها)، إلا إذا استخدم شرط الربط صراحةً دالة مركبة تتحقق أولاً من أن أعمدة الربط فارغة NOT NULLقبل تطبيق باقي الشروط. لا يمكن استخدام الربط الداخلي (Inner Join) بأمان إلا في قواعد البيانات التي تضمن سلامة البيانات المرجعية أو حيث يكون من المضمون ألا تحتوي أعمدة الربط على قيم فارغة. تعتمد العديد من قواعد البيانات العلائقية لمعالجة المعاملات على معايير تحديث البيانات ACID ( الذرية، والاتساق، والعزل، والمتانة ) لضمان سلامة البيانات ، مما يجعل الربط الداخلي خيارًا مناسبًا. مع ذلك، عادةً ما تحتوي قواعد بيانات المعاملات أيضًا على أعمدة ربط مرغوبة يُسمح لها بأن تحتوي على قيم فارغة. تستخدم العديد من قواعد البيانات العلائقية ومستودعات البيانات الخاصة بالتقارير عمليات استخراج البيانات وتحويلها وتحميلها (ETL) بكميات كبيرة، مما يجعل ضمان سلامة البيانات المرجعية صعبًا أو مستحيلاً، وينتج عنه أعمدة ربط قد تحتوي على قيم فارغة لا يستطيع كاتب استعلام SQL تعديلها، مما يتسبب في حذف بيانات من عمليات الربط الداخلي دون أي إشارة إلى وجود خطأ. يعتمد اختيار استخدام الربط الداخلي على تصميم قاعدة البيانات وخصائص البيانات. ويمكن عادةً استبدال الربط الداخلي بالربط الخارجي الأيسر عندما تحتوي أعمدة الربط في أحد الجداول على قيم فارغة (NULL).
لا ينبغي استخدام أي عمود بيانات قد يحتوي على قيمة NULL (فارغة) كرابط في عملية الربط الداخلي، إلا إذا كان الهدف هو حذف الصفوف التي تحتوي على قيمة NULL. إذا كان من المقرر إزالة أعمدة الربط التي تحتوي على قيمة NULL من مجموعة النتائج عمدًا، فقد يكون الربط الداخلي أسرع من الربط الخارجي لأن ربط الجدولين والتصفية يتمان في خطوة واحدة . في المقابل، قد يؤدي الربط الداخلي إلى بطء شديد في الأداء أو حتى تعطل الخادم عند استخدامه في استعلام ذي حجم كبير مع دوال قاعدة البيانات في عبارة SQL Where. [ 2 ] [ 3 ] [ 4 ] قد تؤدي الدالة في عبارة SQL Where إلى تجاهل قاعدة البيانات لفهارس الجداول المدمجة نسبيًا. قد تقرأ قاعدة البيانات الأعمدة المحددة من كلا الجدولين وتجري الربط الداخلي بينهما قبل تقليل عدد الصفوف باستخدام عامل التصفية الذي يعتمد على قيمة محسوبة، مما ينتج عنه قدر هائل من المعالجة غير الفعالة.
عند إنشاء مجموعة نتائج من خلال ربط عدة جداول، بما في ذلك الجداول الرئيسية المستخدمة للبحث عن أوصاف نصية كاملة لرموز المعرفات الرقمية ( جدول البحث )، فإن وجود قيمة فارغة (NULL) في أي من المفاتيح الخارجية قد يؤدي إلى حذف الصف بأكمله من مجموعة النتائج، دون أي إشارة إلى وجود خطأ. وينطبق الأمر نفسه على استعلامات SQL المعقدة التي تتضمن ربطًا داخليًا واحدًا أو أكثر وعدة ربطات خارجية، وذلك في حالة وجود قيم فارغة في أعمدة الربط الداخلي.
إن الالتزام بشفرة SQL التي تحتوي على عمليات الربط الداخلي يفترض عدم إدخال أعمدة الربط NULL من خلال التغييرات المستقبلية، بما في ذلك تحديثات البائع وتغييرات التصميم والمعالجة المجمعة خارج قواعد التحقق من صحة بيانات التطبيق مثل تحويلات البيانات وعمليات الترحيل والاستيراد المجمع وعمليات الدمج.
يمكن تصنيف عمليات الربط الداخلية بشكل أكبر إلى عمليات ربط متساوية وعمليات ربط غير متساوية (theta).
الوصل المتساوي
الربط المتساوي ، المعروف أيضًا باسم "العملية الوحيدة المؤهلة"، هو نوع محدد من الربط القائم على المقارنة، والذي يستخدم مقارنات المساواة فقط في شرط الربط. استخدام عوامل مقارنة أخرى (مثل ` <--`) يُفقد الربط صفة الربط المتساوي. وقد قدم الاستعلام الموضح أعلاه مثالًا على الربط المتساوي.
SELECT * FROM employee JOIN department ON employee.DepartmentID = department.DepartmentID ;يمكننا كتابة عملية الربط المتساوي كما يلي،
SELECT * FROM employee , department WHERE employee.DepartmentID = department.DepartmentID ;إذا كانت الأعمدة في عملية الربط المتساوي لها نفس الاسم، فإن SQL-92 يوفر تدوينًا مختصرًا اختياريًا للتعبير عن عمليات الربط المتساوي، وذلك عن طريق USINGالبنية التالية: [ 5 ]
SELECT * FROM employee INNER JOIN department USING ( DepartmentID );هذا USINGالتركيب ليس مجرد تحسين شكلي ، إذ تختلف مجموعة النتائج عن تلك الخاصة بالنسخة التي تستخدم الشرط الصريح. تحديدًا، USINGستظهر أي أعمدة مذكورة في القائمة مرة واحدة فقط، باسم غير مؤهل، بدلًا من ظهورها مرة واحدة لكل جدول في عملية الربط. في المثال أعلاه، سيكون هناك DepartmentIDعمود واحد فقط ولن يكون employee.DepartmentIDهناك أي شرط department.DepartmentID.
USINGلا يدعم كل من MS SQL Server و Sybase هذا الشرط.
وصلة طبيعية
الربط الطبيعي هو حالة خاصة من الربط المتساوي. الربط الطبيعي (⋈) هو عامل ثنائي يُكتب على النحو التالي: ( R ⋈ S ) حيث R و S علاقتان . [ 6 ] نتيجة الربط الطبيعي هي مجموعة جميع تركيبات الصفوف في R و S المتساوية في أسماء سماتها المشتركة. على سبيل المثال، انظر إلى جدولي الموظفين والأقسام والربط الطبيعي بينهما:
|
|
|
يمكن استخدام هذا أيضًا لتحديد تركيب العلاقات . على سبيل المثال، تركيب العلاقة بين الموظف والقسم هو ربطهما كما هو موضح أعلاه، مع إسقاط جميع السمات باستثناء السمة المشتركة "اسم القسم" . في نظرية الفئات ، يُعد الربط تحديدًا هو حاصل الضرب الليفي .
يُعدّ الربط الطبيعي من أهمّ عوامل الربط، فهو يُقابل الربط المنطقي "و" في العلاقات. لاحظ أنه إذا ظهر المتغير نفسه في كلٍّ من مُسندين مُرتبطين بـ "و"، فإنّ هذا المتغير يُشير إلى الشيء نفسه، ويجب استبدال كلا الظهورين بالقيمة نفسها. يسمح الربط الطبيعي تحديدًا بدمج العلاقات المرتبطة بمفتاح خارجي . على سبيل المثال، في المثال أعلاه، من المُرجّح أن يكون المفتاح الخارجي من "اسم القسم " في جدول الموظفين إلى " اسم القسم" ، وبالتالي يجمع الربط الطبيعي بين جدول الموظفين وجدول الأقسام جميع الموظفين مع أقسامهم. ينجح هذا لأنّ المفتاح الخارجي يربط بين السمات التي تحمل الاسم نفسه. إذا لم يكن الأمر كذلك، كما في حالة المفتاح الخارجي من " مدير القسم" إلى "اسم الموظف" ، فيجب إعادة تسمية هذه الأعمدة قبل إجراء الربط الطبيعي. يُشار إلى هذا النوع من الربط أحيانًا باسم " الربط المتساوي" .
وبشكل أكثر رسمية، يتم تعريف دلالات الربط الطبيعي على النحو التالي:
- ،
حيث يمثل Fun دالة منطقية صحيحة للعلاقة r إذا وفقط إذا كانت r دالة. عادةً ما يُشترط أن يكون للعلاقة R و S سمة مشتركة واحدة على الأقل، ولكن إذا تم حذف هذا الشرط، ولم يكن للعلاقة R و S أي سمات مشتركة، فإن الربط الطبيعي يصبح هو الضرب الديكارتي.
يمكن محاكاة عملية الربط الطبيعي باستخدام عناصر كود الأساسية كما يلي. لنفترض أن c₁ , ... , cₘ هي أسماء السمات المشتركة بين R و S ، و r₁ , ..., rₙ هي أسماء السمات الفريدة في R، و s₁ , ... , sₖ هي السمات الفريدة في S. علاوة على ذلك ، نفترض أن أسماء السمات x₁ , ..., xₘ ليست موجودة في R ولا في S. في الخطوة الأولى، يمكن الآن إعادة تسمية أسماء السمات المشتركة في S.
ثم نأخذ حاصل الضرب الديكارتي ونختار الصفوف التي سيتم ضمها:
الربط الطبيعي هو نوع من الربط المتساوي، حيث ينشأ شرط الربط ضمنيًا بمقارنة جميع الأعمدة في كلا الجدولين التي تحمل نفس أسماء الأعمدة في الجدولين المربوطين. يحتوي الجدول المربوط الناتج على عمود واحد فقط لكل زوج من الأعمدة المتطابقة في الاسم. في حال عدم وجود أعمدة تحمل نفس الأسماء، تكون النتيجة ربطًا متقاطعًا .
يتفق معظم الخبراء على أن عمليات الربط الطبيعي (NATURAL JOIN) خطيرة، ولذلك ينصحون بشدة بعدم استخدامها. [ 7 ] يكمن الخطر في إضافة عمود جديد عن غير قصد، يحمل نفس اسم عمود آخر في جدول آخر. قد يستخدم الربط الطبيعي الحالي هذا العمود الجديد تلقائيًا للمقارنات، مما يؤدي إلى إجراء مقارنات/مطابقات باستخدام معايير مختلفة (من أعمدة مختلفة) عن السابق. وبالتالي، قد ينتج عن استعلام موجود نتائج مختلفة، على الرغم من أن البيانات في الجداول لم تتغير، بل تم توسيعها فقط. لا يُعد استخدام أسماء الأعمدة لتحديد روابط الجداول تلقائيًا خيارًا مناسبًا في قواعد البيانات الكبيرة التي تضم مئات أو آلاف الجداول، حيث سيفرض ذلك قيدًا غير واقعي على اصطلاحات التسمية. غالبًا ما تُصمم قواعد البيانات في العالم الحقيقي ببيانات مفتاح خارجي غير مكتملة بشكل متسق (يُسمح بقيم NULL)، وذلك بسبب قواعد العمل وسياقه. من الممارسات الشائعة تعديل أسماء أعمدة البيانات المتشابهة في جداول مختلفة، وهذا النقص في الاتساق الصارم يجعل الربط الطبيعي مفهومًا نظريًا للنقاش.
يمكن التعبير عن استعلام الربط الداخلي المذكور أعلاه كربط طبيعي بالطريقة التالية:
SELECT * FROM employee NATURAL JOIN department ;كما هو الحال مع الشرط الصريح USING، يظهر عمود واحد فقط باسم DepartmentID في الجدول المدمج، بدون أي مُحدِّد:
| معرف القسم | اسم عائلة الموظف | اسم القسم. |
|---|---|---|
| 34 | سميث | الأعمال المكتبية |
| 33 | جونز | هندسة |
| 34 | روبنسون | الأعمال المكتبية |
| 33 | هايزنبرغ | هندسة |
| 31 | رافيرتي | مبيعات |
تدعم قواعد بيانات PostgreSQL وMySQL وOracle عمليات الربط الطبيعي، بينما لا تدعمها قواعد بيانات Microsoft T-SQL وIBM DB2. تكون الأعمدة المستخدمة في الربط ضمنية، لذا لا يُظهر رمز الربط الأعمدة المتوقعة، وقد يؤدي تغيير أسماء الأعمدة إلى تغيير النتائج. في معيار SQL:2011 ، تُعد عمليات الربط الطبيعي جزءًا من حزمة F401 الاختيارية، "جدول الربط الموسع".
في العديد من بيئات قواعد البيانات، يتم التحكم في أسماء الأعمدة من قِبل مُورّد خارجي، وليس من قِبل مُطوّر الاستعلام. يفترض الربط الطبيعي ثباتًا واتساقًا في أسماء الأعمدة، وهو ما قد يتغير أثناء ترقيات الإصدارات التي يفرضها المُورّد.
وصلة خارجية
يحتفظ الجدول المدمج بكل صف، حتى لو لم يكن هناك صف مطابق آخر. وتنقسم عمليات الربط الخارجي إلى ربط خارجي أيسر، وربط خارجي أيمن، وربط خارجي كامل، وذلك بحسب صفوف الجدول التي يتم الاحتفاظ بها: الأيسر، أو الأيمن، أو كليهما (في هذه الحالة، يشير الأيسر والأيمن إلى جانبي الكلمة المفتاحية). وكما هو الحال مع عمليات الربط الداخلي ، يمكن تصنيف جميع أنواع عمليات الربط الخارجي إلى فئات فرعية مثل الربط المتساوي ، والربط الطبيعي ، و ( ربط θ )، وما إلى ذلك . [ 8 ]JOINON<predicate>
لا يوجد في لغة SQL القياسية أي تدوين ضمني للربط الخارجي.
الوصلة الخارجية اليسرى
نتيجة عملية الربط الخارجي الأيسر (أو ببساطة الربط الأيسر ) للجدولين A وB تحتوي دائمًا على جميع صفوف الجدول "الأيسر" (A)، حتى لو لم يجد شرط الربط أي صف مطابق في الجدول "الأيمن" (B). هذا يعني أنه إذا ONتطابق الشرط مع صفر (0) صفوف في B (لصف معين في A)، فسيظل الربط يُرجع صفًا في النتيجة (لذلك الصف) - ولكن بقيمة NULL في كل عمود من B. يُرجع الربط الخارجي الأيسر جميع القيم من الربط الداخلي بالإضافة إلى جميع القيم في الجدول الأيسر التي لا تتطابق مع الجدول الأيمن، بما في ذلك الصفوف التي تحتوي على قيم NULL (فارغة) في عمود الربط.
على سبيل المثال، يسمح لنا هذا بالعثور على قسم الموظف، ولكنه لا يزال يعرض الموظفين الذين لم يتم تعيينهم في قسم (على عكس مثال الربط الداخلي أعلاه، حيث تم استبعاد الموظفين غير المعينين من النتيجة).
مثال على عملية الربط الخارجي الأيسر ( OUTERالكلمة المفتاحية اختيارية)، مع صف النتيجة الإضافي (مقارنةً بعملية الربط الداخلي) مكتوبًا بخط مائل:
SELECT * FROM employee LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID ;| اسم عائلة الموظف | معرف القسم للموظف | اسم القسم. | Department.DepartmentID |
|---|---|---|---|
| جونز | 33 | هندسة | 33 |
| رافيرتي | 31 | مبيعات | 31 |
| روبنسون | 34 | الأعمال المكتبية | 34 |
| سميث | 34 | الأعمال المكتبية | 34 |
| ويليامز | NULL | NULL | NULL |
| هايزنبرغ | 33 | هندسة | 33 |
صيغ بديلة
يدعم Oracle الصيغة القديمة [ 9 ] :
حدد جميع البيانات من جدول الموظفين وجدول الأقسام حيث يكون معرف القسم في جدول الموظفين مساوياً لمعرف القسم في جدول الأقسام .يدعم Go2bank الصيغة ( أهملت Microsoft SQL Server هذه الصيغة منذ الإصدار 2000):
استعلم عن جميع البيانات من جدول الموظفين وجدول الأقسام حيث يكون معرف القسم في جدول الموظفين مساويًا لمعرف القسم في جدول الأقساميدعم برنامج IBM Informix الصيغة التالية:
استعلم عن جميع البيانات من جدول الموظفين وجدول الأقسام الخارجية حيث يكون معرف القسم في جدول الموظفين مساويًا لمعرف القسم في جدول الأقسام .المفصل الخارجي الأيمن
يُشبه الربط الخارجي الأيمن (أو الربط الأيمن ) الربط الخارجي الأيسر إلى حد كبير، باستثناء عكس ترتيب الجداول. سيظهر كل صف من الجدول "الأيمن" (ب) في الجدول المُدمج مرة واحدة على الأقل. إذا لم يكن هناك صف مطابق من الجدول "الأيسر" (أ)، فستظهر قيمة NULL في أعمدة الجدول أ للصفوف التي لا يوجد لها تطابق في الجدول ب.
تُعيد عملية الربط الخارجي الأيمن جميع القيم من الجدول الأيمن والقيم المطابقة من الجدول الأيسر (قيمة فارغة في حالة عدم وجود شرط ربط مطابق). على سبيل المثال، يُتيح لنا هذا العثور على كل موظف وقسمه، مع إمكانية عرض الأقسام التي لا يوجد بها موظفون.
فيما يلي مثال على عملية الربط الخارجي الأيمن (الكلمة OUTERالمفتاحية اختيارية)، مع وضع صف النتيجة الإضافي بخط مائل:
SELECT * FROM employee RIGHT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID ;| اسم عائلة الموظف | معرف القسم للموظف | اسم القسم. | Department.DepartmentID |
|---|---|---|---|
| سميث | 34 | الأعمال المكتبية | 34 |
| جونز | 33 | هندسة | 33 |
| روبنسون | 34 | الأعمال المكتبية | 34 |
| هايزنبرغ | 33 | هندسة | 33 |
| رافيرتي | 31 | مبيعات | 31 |
NULL | NULL | تسويق | 35 |
تُعتبر عمليات الربط الخارجي الأيمن والأيسر متكافئة وظيفيًا. لا توفر أي منهما وظائف لا توفرها الأخرى، لذا يمكن استبدال عمليات الربط الخارجي الأيمن والأيسر ببعضها البعض طالما تم تبديل ترتيب الجدول.
وصلة خارجية كاملة
من الناحية النظرية، يجمع الربط الخارجي الكامل بين تأثير تطبيق الربط الخارجي الأيسر والأيمن. عندما لا تتطابق الصفوف في الجداول المربوطة خارجيًا بالكامل، ستحتوي مجموعة النتائج على قيم فارغة (NULL) لكل عمود في الجدول الذي لا يوجد له صف مطابق. أما بالنسبة للصفوف المتطابقة، فسيتم إنتاج صف واحد في مجموعة النتائج (يحتوي على أعمدة مُعبأة من كلا الجدولين).
على سبيل المثال، يسمح لنا هذا برؤية كل موظف موجود في قسم ما وكل قسم لديه موظف، ولكن أيضًا برؤية كل موظف ليس جزءًا من قسم ما وكل قسم ليس لديه موظف.
مثال على عملية ربط خارجي كاملة (الكلمة OUTERالمفتاحية اختيارية):
SELECT * FROM employee FULL OUTER JOIN department ON employee.DepartmentID = department.DepartmentID ;| اسم عائلة الموظف | معرف القسم للموظف | اسم القسم. | Department.DepartmentID |
|---|---|---|---|
| سميث | 34 | الأعمال المكتبية | 34 |
| جونز | 33 | هندسة | 33 |
| روبنسون | 34 | الأعمال المكتبية | 34 |
| ويليامز | NULL | NULL | NULL |
| هايزنبرغ | 33 | هندسة | 33 |
| رافيرتي | 31 | مبيعات | 31 |
NULL | NULL | تسويق | 35 |
لا تدعم بعض أنظمة قواعد البيانات وظيفة الربط الخارجي الكاملة بشكل مباشر، ولكنها تستطيع محاكاتها باستخدام الربط الداخلي واستعلامات UNION ALL لصفوف الجدول الواحد من الجدولين الأيسر والأيمن على التوالي. ويمكن أن يظهر المثال نفسه كما يلي:
استعلم عن اسم عائلة الموظف ، ورقم القسم ، واسم القسم ، ورقم القسم من جدول الموظفين ، مع ربطه بجدول الأقسام بناءً على تطابق رقم القسم .الاتحاد للجميعاستعلم عن اسم عائلة الموظف ، ومعرف القسم ، وقيمة NULL كنص ( 20 حرفًا )، وقيمة NULL كعدد صحيح من جدول الموظفين حيث لا يوجد سجل في جدول الأقسام حيث يكون معرف القسم في جدول الموظفين مساويًا لمعرف القسم في جدول الأقسام .الاتحاد للجميعSELECT cast ( NULL as varchar ( 20 )), cast ( NULL as integer ), department . DepartmentName , department . DepartmentID FROM department WHERE NOT EXISTS ( SELECT * FROM employee WHERE employee . DepartmentID = department . DepartmentID )ويمكن اتباع نهج آخر يتمثل في UNION ALL من left outer join و right outer join MINUS inner join.
الوصل الذاتي
الربط الذاتي هو ربط جدول بنفسه. [ 10 ]
مثال
إذا كان هناك جدولان منفصلان للموظفين، واستعلام يطلب الموظفين في الجدول الأول الذين ينتمون إلى نفس بلد الموظفين في الجدول الثاني، فيمكن استخدام عملية ربط عادية للعثور على جدول الإجابة. مع ذلك، فإن جميع معلومات الموظفين موجودة في جدول واحد كبير. [ 11 ]
لنفترض وجود جدول معدل Employeeمثل الجدول التالي:
| رقم الموظف | اسم العائلة | دولة | معرف القسم |
|---|---|---|---|
| 123 | رافيرتي | أستراليا | 31 |
| 124 | جونز | أستراليا | 33 |
| 145 | هايزنبرغ | أستراليا | 33 |
| 201 | روبنسون | الولايات المتحدة | 34 |
| 305 | سميث | ألمانيا | 34 |
| 306 | ويليامز | ألمانيا | NULL |
مثال على استعلام الحل قد يكون كما يلي:
SELECT F.EmployeeID , F.LastName , S.EmployeeID , S.LastName , F.Country FROM Employee F INNER JOIN Employee S ON F.Country = S.Country WHERE F.EmployeeID < S.EmployeeID ORDER BY F.EmployeeID , S.EmployeeID ;مما ينتج عنه إنشاء الجدول التالي.
| رقم الموظف | اسم العائلة | رقم الموظف | اسم العائلة | دولة |
|---|---|---|---|---|
| 123 | رافيرتي | 124 | جونز | أستراليا |
| 123 | رافيرتي | 145 | هايزنبرغ | أستراليا |
| 124 | جونز | 145 | هايزنبرغ | أستراليا |
| 305 | سميث | 306 | ويليامز | ألمانيا |
في هذا المثال:
FوهيSأسماء بديلة للنسختين الأولى والثانية من جدول الموظفين.- يستثني هذا الشرط
F.Country = S.Countryالأزواج من الموظفين في بلدان مختلفة. فقد اقتصر السؤال النموذجي على أزواج الموظفين في البلد نفسه. F.EmployeeID < S.EmployeeIDيستبعد هذا الشرط حالات الاقتران التيEmployeeIDيكون فيها راتب الموظف الأول أكبر من أو يساوي راتبEmployeeIDالموظف الثاني. بعبارة أخرى، يهدف هذا الشرط إلى استبعاد حالات الاقتران المكررة وحالات الاقتران الذاتي. وبدونه، سيتم إنشاء الجدول التالي الأقل فائدة (يعرض الجدول أدناه الجزء الخاص بألمانيا فقط من النتيجة):
| رقم الموظف | اسم العائلة | رقم الموظف | اسم العائلة | دولة |
|---|---|---|---|---|
| 305 | سميث | 305 | سميث | ألمانيا |
| 305 | سميث | 306 | ويليامز | ألمانيا |
| 306 | ويليامز | 305 | سميث | ألمانيا |
| 306 | ويليامز | 306 | ويليامز | ألمانيا |
يكفي زوج واحد فقط من الزوجين الأوسطين لتلبية السؤال الأصلي، أما الزوجان العلوي والسفلي فليس لهما أي أهمية على الإطلاق في هذا المثال.
البدائل
يمكن أيضًا الحصول على تأثير الربط الخارجي باستخدام عبارة UNION ALL بين عبارة INNER JOIN وعبارة SELECT للصفوف في الجدول "الرئيسي" التي لا تستوفي شرط الربط. على سبيل المثال،
SELECT employee.LastName , employee.DepartmentID , department.DepartmentName FROM employee LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID ;ويمكن كتابتها أيضاً على النحو التالي
استعلم عن اسم عائلة الموظف ، ورقم القسم ، واسم القسم من جدول الموظفين ، مع ربطه بجدول الأقسام بناءً على تطابق رقم القسم .الاتحاد للجميعاستعلم عن اسم عائلة الموظف ، ومعرف القسم ، وقيمة NULL كنص ( 20 حرفًا ) من جدول الموظفين حيث لا يوجد سجل في جدول الأقسام حيث يكون معرف القسم مساويًا لمعرف القسم .تطبيق
ركزت العديد من الدراسات في أنظمة قواعد البيانات على تحسين كفاءة عمليات الربط، نظرًا لأن الأنظمة العلائقية تتطلب هذه العمليات بشكل متكرر، إلا أنها تواجه صعوبات في تحسين تنفيذها بكفاءة. تكمن المشكلة في أن عمليات الربط الداخلي تعمل بشكل تبادلي وتجميعي . عمليًا، يعني هذا أن المستخدم يُدخل قائمة الجداول المراد ربطها وشروط الربط، بينما يتولى نظام قاعدة البيانات مهمة تحديد الطريقة الأمثل لتنفيذ العملية. تزداد الخيارات تعقيدًا مع ازدياد عدد الجداول المشاركة في الاستعلام، حيث يتميز كل جدول بخصائص مختلفة من حيث عدد السجلات، ومتوسط طول السجل (مع الأخذ في الاعتبار الحقول الفارغة)، والفهارس المتاحة. كما أن عوامل تصفية عبارة WHERE تؤثر بشكل كبير على حجم الاستعلام وتكلفته.
يُحدد مُحسِّن الاستعلام كيفية تنفيذ الاستعلام الذي يحتوي على عمليات ربط. ويتمتع مُحسِّن الاستعلام بنوعين أساسيين من الحرية:
- ترتيب الربط : نظرًا لأن النظام يربط الدوال بشكل تبادلي وتجميعي، فإن ترتيب ربط الجداول لا يُغير مجموعة النتائج النهائية للاستعلام. مع ذلك، قد يكون لترتيب الربط تأثير كبير على تكلفة عملية الربط، لذا يُصبح اختيار أفضل ترتيب للربط أمرًا بالغ الأهمية.
- طريقة الربط : عند وجود جدولين وشرط ربط، يمكن لعدة خوارزميات إنتاج مجموعة نتائج الربط. يعتمد اختيار الخوارزمية الأكثر كفاءة على أحجام الجداول المدخلة، وعدد الصفوف من كل جدول التي تطابق شرط الربط، والعمليات المطلوبة لبقية الاستعلام.
تتعامل العديد من خوارزميات الربط مع مدخلاتها بطرق مختلفة. يمكن الإشارة إلى مدخلات الربط بمعاملات الربط "الخارجية" و"الداخلية"، أو "اليسرى" و"اليمنى" على التوالي. في حالة الحلقات المتداخلة، على سبيل المثال، يقوم نظام قاعدة البيانات بفحص العلاقة الداخلية بأكملها لكل صف من العلاقة الخارجية.
يمكن تصنيف خطط الاستعلام التي تتضمن عمليات الربط على النحو التالي: [ 12 ]
- يسار عميق
- استخدام جدول أساسي (بدلاً من عملية ربط أخرى) كمعامل داخلي لكل عملية ربط في الخطة
- يمين عميق
- استخدام جدول أساسي كمعامل خارجي لكل عملية ربط في الخطة
- كثيف
- لا هو عميق من اليسار ولا عميق من اليمين؛ قد ينتج كلا المدخلين لعملية الربط عن عمليات ربط أخرى.
تستمد هذه الأسماء من مظهر خطة الاستعلام إذا تم رسمها كشجرة ، مع وجود علاقة الربط الخارجية على اليسار والعلاقة الداخلية على اليمين (كما يقتضي الاصطلاح).
خوارزميات الربط

توجد ثلاث خوارزميات أساسية لإجراء عملية الربط الثنائي: الربط الحلقي المتداخل ، والربط بالفرز والدمج ، والربط التجزئي . وتكون خوارزميات الربط الأمثل في أسوأ الحالات أسرع تقاربياً من خوارزميات الربط الثنائي عند الربط بين أكثر من علاقتين في أسوأ الحالات .
ضم الفهارس
فهارس الربط هي فهارس قواعد البيانات التي تسهل معالجة استعلامات الربط في مستودعات البيانات : وهي متوفرة حاليًا (2012) في تطبيقات Oracle [ 14 ] و Teradata . [ 15 ]
في تطبيق Teradata، تُحدد الأعمدة المحددة، أو دوال التجميع على الأعمدة، أو مكونات أعمدة التاريخ من جدول واحد أو أكثر، باستخدام صيغة مشابهة لتعريف عرض قاعدة البيانات : يمكن تحديد ما يصل إلى 64 عمودًا/تعبيرًا عموديًا في فهرس ربط واحد. اختياريًا، يمكن أيضًا تحديد عمود يُحدد المفتاح الأساسي للبيانات المركبة: في الأجهزة المتوازية، تُستخدم قيم الأعمدة لتقسيم محتويات الفهرس عبر أقراص متعددة. عند تحديث جداول المصدر تفاعليًا من قِبل المستخدمين، يتم تحديث محتويات فهرس الربط تلقائيًا. أي استعلام تُحدد فيه عبارة WHERE أي مجموعة من الأعمدة أو التعبيرات العمودية التي تُمثل مجموعة فرعية دقيقة من تلك المُحددة في فهرس الربط (ما يُسمى "استعلام التغطية") سيؤدي إلى الرجوع إلى فهرس الربط، بدلًا من الجداول الأصلية وفهارسها، أثناء تنفيذ الاستعلام.
يقتصر تطبيق أوراكل على استخدام فهارس الخرائط النقطية . يُستخدم فهرس الربط بالخرائط النقطية للأعمدة ذات العدد القليل من القيم المميزة (أي الأعمدة التي تحتوي على أقل من 300 قيمة مميزة، وفقًا لوثائق أوراكل): فهو يجمع الأعمدة ذات العدد القليل من القيم المميزة من جداول متعددة ذات صلة. المثال الذي تستخدمه أوراكل هو نظام إدارة مخزون، حيث يُوفر موردون مختلفون أجزاءً مختلفة. يحتوي المخطط على ثلاثة جداول مرتبطة: جدولان رئيسيان، هما الجزء والمورد، وجدول فرعي، هو المخزون. الجدول الأخير هو جدول متعدد إلى متعدد يربط المورد بالجزء، ويحتوي على أكبر عدد من الصفوف. لكل جزء نوع جزء، ولكل مورد مقره في الولايات المتحدة، وله عمود ولاية. لا يوجد أكثر من 60 ولاية وإقليمًا في الولايات المتحدة، ولا يوجد أكثر من 300 نوع جزء. يتم تعريف فهرس الربط بالخرائط النقطية باستخدام ربط قياسي بين ثلاثة جداول، مع تحديد عمودي نوع الجزء وولاية المورد للفهرس. ومع ذلك، يتم تعريفها في جدول المخزون، على الرغم من أن العمودين Part_Type و Supplier_State "مستعاران" من Supplier و Part على التوالي.
أما بالنسبة لـ Teradata، فإن فهرس ربط الخرائط النقطية من Oracle لا يُستخدم إلا للإجابة على استعلام عندما تحدد عبارة WHERE الخاصة بالاستعلام أعمدة تقتصر على تلك الموجودة في فهرس الربط.
وصلة مباشرة
تسمح بعض أنظمة قواعد البيانات للمستخدم بفرض قراءة الجداول في عملية الربط بترتيب معين. يُستخدم هذا الخيار عندما يختار مُحسِّن الربط قراءة الجداول بترتيب غير فعال. على سبيل المثال، في MySQL، يقرأ الأمر STRAIGHT_JOINالجداول بالترتيب المذكور في الاستعلام تمامًا. [ 16 ]
انظر أيضاً
مراجع
الاقتباسات
- ↑ SQL CROSS JOIN
- ↑ روبيدو، جريج (2007-05-03). "تجنب استخدام دوال SQL Server في عبارة WHERE لتحسين الأداء" . نصائح MSSQL.
- ↑ وولف، باتريك (30 نوفمبر 2006). "داخل أوراكل أبيكس: تحذير عند استخدام دوال PL/SQL في عبارة SQL" . داخل أوراكل أبيكس. مؤرشف من الأصل بتاريخ 27 ديسمبر 2018.
- ↑ لارسن، غريغوري أ. (29-10-2009). "أفضل ممارسات T-SQL - لا تستخدم دوال القيم العددية في قوائم الأعمدة أو عبارات WHERE" . مجلة قواعد البيانات.
- ↑ تبسيط عمليات الربط باستخدام الكلمة المفتاحية USING
- ↑ في نظام يونيكود ، رمز ربطة العنق هو ⋈ (U+22C8).
- ↑ اسأل توم "دعم أوراكل لعمليات الربط ANSI". العودة إلى الأساسيات: عمليات الربط الداخلية » مدونة إيدي عواد، مؤرشفة بتاريخ 19-11-2010 على موقع Wayback Machine
- ↑ سيلبرشاتز، أبراهام ؛ كورث، هانك ؛ سودارشان، س. (2002). "القسم 4.10.2: أنواع الربط وشروطه". مفاهيم أنظمة قواعد البيانات ( الطبعة الرابعة). ماكجرو هيل. ص 166. ISBN 0072283637.
- ↑ [4133310858797322]
- ↑ شاه 2005 ، ص 165
- ↑ مقتبس من برات 2005 ، الصفحات 115-116
- ^ يو ومنغ 1998 ، ص. 213
- ↑ وانغ، ييسو ريمي؛ ويلسي، ماكس؛ سوتشيو، دان (2023-01-27). "الربط الحر: توحيد الربط الأمثل في أسوأ الحالات والربط التقليدي". arXiv : 2301.10841 [ cs.DB ].
- ↑ فهارس الربط النقطي في أوراكل. "مفاهيم قواعد البيانات - 5 فهارس وجداول منظمة بالفهارس - فهارس الربط النقطي" . تم الاطلاع عليه بتاريخ 23-06-2024 .
- ↑ فهارس الربط في Teradata. "صياغة لغة تعريف البيانات SQL وأمثلة - إنشاء فهرس ربط" . تم الاطلاع عليه بتاريخ 23-06-2024 .
- ↑ "13.2.9.2 صيغة JOIN" . دليل مرجعي لـ MySQL 5.7 . شركة أوراكل . تم الاطلاع عليه بتاريخ 3 ديسمبر 2015 .
مصادر
- برات، فيليب جيه (2005)، دليل إلى لغة SQL، الطبعة السابعة ، تومسون كورس تكنولوجي، رقم ISBN 978-0-619-21674-0
- شاه، نيليش (2005) [2002]، أنظمة قواعد البيانات باستخدام أوراكل - دليل مبسط إلى SQL وPL/SQL، الطبعة الثانية ( الطبعة الدولية)، بيرسون إديوكيشن إنترناشونال، ISBN 0-13-191180-5
- يو، كليمنت ت.؛ مينغ، ويي (1998)، مبادئ معالجة استعلامات قواعد البيانات للتطبيقات المتقدمة ، مورغان كوفمان، ISBN 978-1-55860-434-6تم الاطلاع عليه بتاريخ 2009-03-03
روابط خارجية
- كلمات SQL الرئيسية
