الربط (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 هذا الشرط.

وصلة طبيعية

The natural join is a special case of equi-join. Natural join (⋈) is a binary operator that is written as (RS) where R and S are relations.[6] The result of the natural join is the set of all combinations of tuples in R and S that are equal on their common attribute names. For an example consider the tables Employee and Dept and their natural join:

Employee
NameEmpIdDeptName
Harry3415Finance
Sally2241Sales
George3401Finance
Harriet2202Sales
Dept
DeptNameManager
FinanceGeorge
SalesHarriet
ProductionCharles
Employee {\displaystyle \bowtie } Dept
NameEmpIdDeptNameManager
Harry3415FinanceGeorge
Sally2241SalesHarriet
George3401FinanceGeorge
Harriet2202SalesHarriet

This can also be used to define composition of relations. For example, the composition of Employee and Dept is their join as shown above, projected on all but the common attribute DeptName. In category theory, the join is precisely the fiber product.

The natural join is arguably one of the most important operators since it is the relational counterpart of logical AND. Note that if the same variable appears in each of two predicates that are connected by AND, then that variable stands for the same thing and both appearances must always be substituted by the same value. In particular, the natural join allows the combination of relations that are associated by a foreign key. For example, in the above example a foreign key probably holds from Employee.DeptName to Dept.DeptName and then the natural join of Employee and Dept combines all employees with their departments. This works because the foreign key holds between attributes with the same name. If this is not the case such as in the foreign key from Dept.manager to Employee.Name then these columns have to be renamed before the natural join is taken. Such a join is sometimes also referred to as an equi-join.

More formally the semantics of the natural join are defined as follows:

RS={tstR  sS  Fun(ts)}{\displaystyle R\bowtie S=\left\{t\cup s\mid t\in R\ \land \ s\in S\ \land \ {\mathit {Fun}}(t\cup s)\right\}},

حيث يمثل Fun دالة منطقية صحيحة للعلاقة r إذا وفقط إذا كانت r دالة. عادةً ما يُشترط أن يكون للعلاقة R و S سمة مشتركة واحدة على الأقل، ولكن إذا تم حذف هذا الشرط، ولم يكن للعلاقة R و S أي سمات مشتركة، فإن الربط الطبيعي يصبح هو الضرب الديكارتي.

يمكن محاكاة عملية الربط الطبيعي باستخدام عناصر كود الأساسية كما يلي. لنفترض أن c₁ , ... , cₘ هي أسماء السمات المشتركة بين R و S ، و r₁ , ..., rₙ هي أسماء السمات الفريدة في و s₁ , ... , sₖ هي السمات الفريدة في S. علاوة على ذلك ، نفترض أن أسماء السمات x₁ , ..., xₘ ليست موجودة في R ولا في S. في الخطوة الأولى، يمكن الآن إعادة تسمية أسماء السمات المشتركة في S.

تي=ρx1/ج1،...،xم/جم(S)=ρx1/ج1(ρx2/ج2(...ρxم/جم(S)...)){\displaystyle T=\rho _{x_{1}/c_{1},\ldots ,x_{m}/c_{m}}(S)=\rho _{x_{1}/c_{1}}(\rho _{x_{2}/c_{2}}(\ldots \rho _{x_{m}/c_{m}}(S)\ldots ))}

ثم نأخذ حاصل الضرب الديكارتي ونختار الصفوف التي سيتم ضمها:

يو=πر1،...،رن،ج1،...،جم،s1،...،sك(P){\displaystyle U=\pi _{r_{1},\ldots ,r_{n},c_{1},\ldots ,c_{m},s_{1},\ldots ,s_{k}}(P)}

الربط الطبيعي هو نوع من الربط المتساوي، حيث ينشأ شرط الربط ضمنيًا بمقارنة جميع الأعمدة في كلا الجدولين التي تحمل نفس أسماء الأعمدة في الجدولين المربوطين. يحتوي الجدول المربوط الناتج على عمود واحد فقط لكل زوج من الأعمدة المتطابقة في الاسم. في حال عدم وجود أعمدة تحمل نفس الأسماء، تكون النتيجة ربطًا متقاطعًا .

يتفق معظم الخبراء على أن عمليات الربط الطبيعي (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
ويليامزNULLNULLNULL
هايزنبرغ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
NULLNULLتسويق35

تُعتبر عمليات الربط الخارجي الأيمن والأيسر متكافئة وظيفيًا. لا توفر أي منهما وظائف لا توفرها الأخرى، لذا يمكن استبدال عمليات الربط الخارجي الأيمن والأيسر ببعضها البعض طالما تم تبديل ترتيب الجدول.

وصلة خارجية كاملة

من الناحية النظرية، يجمع الربط الخارجي الكامل بين تأثير تطبيق الربط الخارجي الأيسر والأيمن. عندما لا تتطابق الصفوف في الجداول المربوطة خارجيًا بالكامل، ستحتوي مجموعة النتائج على قيم فارغة (NULL) لكل عمود في الجدول الذي لا يوجد له صف مطابق. أما بالنسبة للصفوف المتطابقة، فسيتم إنتاج صف واحد في مجموعة النتائج (يحتوي على أعمدة مُعبأة من كلا الجدولين).

على سبيل المثال، يسمح لنا هذا برؤية كل موظف موجود في قسم ما وكل قسم لديه موظف، ولكن أيضًا برؤية كل موظف ليس جزءًا من قسم ما وكل قسم ليس لديه موظف.

مثال على عملية ربط خارجي كاملة (الكلمة OUTERالمفتاحية اختيارية):

SELECT * FROM employee FULL OUTER JOIN department ON employee.DepartmentID = department.DepartmentID ;
اسم عائلة الموظفمعرف القسم للموظفاسم القسم.Department.DepartmentID
سميث34الأعمال المكتبية34
جونز33هندسة33
روبنسون34الأعمال المكتبية34
ويليامزNULLNULLNULL
هايزنبرغ33هندسة33
رافيرتي31مبيعات31
NULLNULLتسويق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

مثال على استعلام الحل قد يكون كما يلي:

SELECTF.EmployeeID,F.LastName,S.EmployeeID,S.LastName,F.CountryFROMEmployeeFINNERJOINEmployeeSONF.Country=S.CountryWHEREF.EmployeeID<S.EmployeeIDORDERBYF.EmployeeID,S.EmployeeID;

Which results in the following table being generated.

Employee Table after Self-join by Country
EmployeeIDLastNameEmployeeIDLastNameCountry
123Rafferty124JonesAustralia
123Rafferty145HeisenbergAustralia
124Jones145HeisenbergAustralia
305Smith306WilliamsGermany

For this example:

  • F and S are aliases for the first and second copies of the employee table.
  • The condition F.Country = S.Country excludes pairings between employees in different countries. The example question only wanted pairs of employees in the same country.
  • The condition F.EmployeeID < S.EmployeeID excludes pairings where the EmployeeID of the first employee is greater than or equal to the EmployeeID of the second employee. In other words, the effect of this condition is to exclude duplicate pairings and self-pairings. Without it, the following less useful table would be generated (the table below displays only the "Germany" portion of the result):
EmployeeIDLastNameEmployeeIDLastNameCountry
305Smith305SmithGermany
305Smith306WilliamsGermany
306Williams305SmithGermany
306Williams306WilliamsGermany

Only one of the two middle pairings is needed to satisfy the original question, and the topmost and bottommost are of no interest at all in this example.

Alternatives

The effect of an outer join can also be obtained using a UNION ALL between an INNER JOIN and a SELECT of the rows in the "main" table that do not fulfill the join condition. For example,

SELECTemployee.LastName,employee.DepartmentID,department.DepartmentNameFROMemployeeLEFTOUTERJOINdepartmentONemployee.DepartmentID=department.DepartmentID;

can also be written as

SELECTemployee.LastName,employee.DepartmentID,department.DepartmentNameFROMemployeeINNERJOINdepartmentONemployee.DepartmentID=department.DepartmentIDالاتحاد للجميعاستعلم عن اسم عائلة الموظف ، ومعرف القسم ، وقيمة NULL كنص ( 20 حرفًا ) من جدول الموظفين حيث لا يوجد سجل في جدول الأقسام حيث يكون معرف القسم مساويًا لمعرف القسم .

تطبيق

خطة استعلام للاستعلام المثلثي R(A, B) ⋈ S(B, C) ⋈ T(A, C) باستخدام الربط الثنائي. تربط هذه الخطة S و T أولاً، ثم تربط النتيجة مع R.
خطة استعلام للاستعلام المثلثي R(A, B) ⋈ S(B, C) ⋈ T(A, C) باستخدام الربط الثنائي. تربط هذه الخطة R و S أولاً، ثم تربط النتيجة مع T.
هناك خطتان محتملتان للاستعلام عن المثلث R(A, B) ⋈ S(B, C) ⋈ T(A, C) ؛ الأولى تربط S و T أولاً ثم تربط النتيجة بـ R ، والثانية تربط R و S أولاً ثم تربط النتيجة بـ T

ركزت العديد من الدراسات في أنظمة قواعد البيانات على تحسين كفاءة عمليات الربط، نظرًا لأن الأنظمة العلائقية تتطلب هذه العمليات بشكل متكرر، إلا أنها تواجه صعوبات في تحسين تنفيذها بكفاءة. تكمن المشكلة في أن عمليات الربط الداخلي تعمل بشكل تبادلي وتجميعي . عمليًا، يعني هذا أن المستخدم يُدخل قائمة الجداول المراد ربطها وشروط الربط، بينما يتولى نظام قاعدة البيانات مهمة تحديد الطريقة الأمثل لتنفيذ العملية. تزداد الخيارات تعقيدًا مع ازدياد عدد الجداول المشاركة في الاستعلام، حيث يتميز كل جدول بخصائص مختلفة من حيث عدد السجلات، ومتوسط ​​طول السجل (مع الأخذ في الاعتبار الحقول الفارغة)، والفهارس المتاحة. كما أن عوامل تصفية عبارة WHERE تؤثر بشكل كبير على حجم الاستعلام وتكلفته.

يُحدد مُحسِّن الاستعلام كيفية تنفيذ الاستعلام الذي يحتوي على عمليات ربط. ويتمتع مُحسِّن الاستعلام بنوعين أساسيين من الحرية:

  1. ترتيب الربط : نظرًا لأن النظام يربط الدوال بشكل تبادلي وتجميعي، فإن ترتيب ربط الجداول لا يُغير مجموعة النتائج النهائية للاستعلام. مع ذلك، قد يكون لترتيب الربط تأثير كبير على تكلفة عملية الربط، لذا يُصبح اختيار أفضل ترتيب للربط أمرًا بالغ الأهمية.
  2. طريقة الربط : عند وجود جدولين وشرط ربط، يمكن لعدة خوارزميات إنتاج مجموعة نتائج الربط. يعتمد اختيار الخوارزمية الأكثر كفاءة على أحجام الجداول المدخلة، وعدد الصفوف من كل جدول التي تطابق شرط الربط، والعمليات المطلوبة لبقية الاستعلام.

Many join-algorithms treat their inputs differently. One can refer to the inputs to a join as the "outer" and "inner" join operands, or "left" and "right", respectively. In the case of nested loops, for example, the database system will scan the entire inner relation for each row of the outer relation.

One can classify query-plans involving joins as follows:[12]

left-deep
using a base table (rather than another join) as the inner operand of each join in the plan
right-deep
using a base table as the outer operand of each join in the plan
bushy
neither left-deep nor right-deep; both inputs to a join may themselves result from joins

These names derive from the appearance of the query plan if drawn as a tree, with the outer join relation on the left and the inner relation on the right (as convention dictates).

Join algorithms

An illustration of properties of join algorithms. When performing a join between more than two relations on more than two attributes, binary join algorithms such as hash join operate over two relations at a time, and join them on all attributes in the join condition; worst-case optimal algorithms such as generic join operate on a single attribute at a time but join all the relations on this attribute.[13]

Three fundamental algorithms for performing a binary join operation exist: nested loop join, sort-merge join and hash join. Worst-case optimal join algorithms are asymptotically faster than binary join algorithms for joins between more than two relations in the worst case.

Join indexes

Join indexes are database indexes that facilitate the processing of join queries in data warehouses: they are currently (2012) available in implementations by Oracle[14] and Teradata.[15]

في تطبيق Teradata، تُحدد الأعمدة المحددة، أو دوال التجميع على الأعمدة، أو مكونات أعمدة التاريخ من جدول واحد أو أكثر، باستخدام صيغة مشابهة لتعريف عرض قاعدة البيانات : يمكن تحديد ما يصل إلى 64 عمودًا/تعبيرًا عموديًا في فهرس ربط واحد. اختياريًا، يمكن أيضًا تحديد عمود يُحدد المفتاح الأساسي للبيانات المركبة: في الأجهزة المتوازية، تُستخدم قيم الأعمدة لتقسيم محتويات الفهرس عبر أقراص متعددة. عند تحديث جداول المصدر تفاعليًا من قِبل المستخدمين، يتم تحديث محتويات فهرس الربط تلقائيًا. أي استعلام تُحدد فيه عبارة WHERE أي مجموعة من الأعمدة أو التعبيرات العمودية التي تُمثل مجموعة فرعية دقيقة من تلك المُحددة في فهرس الربط (ما يُسمى "استعلام التغطية") سيؤدي إلى الرجوع إلى فهرس الربط، بدلًا من الجداول الأصلية وفهارسها، أثناء تنفيذ الاستعلام.

يقتصر تطبيق أوراكل على استخدام فهارس الخرائط النقطية . يُستخدم فهرس الربط بالخرائط النقطية للأعمدة ذات العدد القليل من القيم المميزة (أي الأعمدة التي تحتوي على أقل من 300 قيمة مميزة، وفقًا لوثائق أوراكل): فهو يجمع الأعمدة ذات العدد القليل من القيم المميزة من جداول متعددة ذات صلة. المثال الذي تستخدمه أوراكل هو نظام إدارة مخزون، حيث يُوفر موردون مختلفون أجزاءً مختلفة. يحتوي المخطط على ثلاثة جداول مرتبطة: جدولان رئيسيان، هما الجزء والمورد، وجدول فرعي، هو المخزون. الجدول الأخير هو جدول متعدد إلى متعدد يربط المورد بالجزء، ويحتوي على أكبر عدد من الصفوف. لكل جزء نوع جزء، ولكل مورد مقره في الولايات المتحدة، وله عمود ولاية. لا يوجد أكثر من 60 ولاية وإقليمًا في الولايات المتحدة، ولا يوجد أكثر من 300 نوع جزء. يتم تعريف فهرس الربط بالخرائط النقطية باستخدام ربط قياسي بين ثلاثة جداول، مع تحديد عمودي نوع الجزء وولاية المورد للفهرس. ومع ذلك، يتم تعريفها في جدول المخزون، على الرغم من أن العمودين Part_Type و Supplier_State "مستعاران" من Supplier و Part على التوالي.

أما بالنسبة لـ Teradata، فإن فهرس ربط الخرائط النقطية من Oracle لا يُستخدم إلا للإجابة على استعلام عندما تحدد عبارة WHERE الخاصة بالاستعلام أعمدة تقتصر على تلك الموجودة في فهرس الربط.

وصلة مباشرة

تسمح بعض أنظمة قواعد البيانات للمستخدم بفرض قراءة الجداول في عملية الربط بترتيب معين. يُستخدم هذا الخيار عندما يختار مُحسِّن الربط قراءة الجداول بترتيب غير فعال. على سبيل المثال، في MySQL، يقرأ الأمر STRAIGHT_JOINالجداول بالترتيب المذكور في الاستعلام تمامًا. [ 16 ]

انظر أيضاً

مراجع

الاقتباسات

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

مصادر