ما الفرق بين "الانضمام الداخلي" و"الانضمام الخارجي"؟
-
09-06-2019 - |
سؤال
كذلك كيف LEFT JOIN
, RIGHT JOIN
و FULL JOIN
يناسب؟
المحلول
بافتراض أنك تنضم إلى أعمدة بدون تكرارات، وهي حالة شائعة جدًا:
الصلة الداخلية بين A وB تعطي نتيجة تقاطع A مع B، أيالجزء الداخلي من أ مخطط فين تداخل.
الصلة الخارجية بين A وB تعطي نتائج الاتحاد A، أي.الأجزاء الخارجية من اتحاد مخطط فين.
أمثلة
لنفترض أن لديك جدولين، يحتوي كل منهما على عمود واحد، والبيانات كما يلي:
A B
- -
1 3
2 4
3 5
4 6
لاحظ أن (1،2) فريدة بالنسبة لـ A، و(3،4) شائعة، و(5،6) فريدة بالنسبة لـ B.
صلة داخلية
صلة داخلية باستخدام أي من الاستعلامات المكافئة تعطي تقاطع الجدولين، أي.الصفين المشتركين بينهما.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
ترك صلة خارجية
ستوفر الصلة الخارجية اليسرى جميع الصفوف في A، بالإضافة إلى أي صفوف مشتركة في B.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
الانضمام الخارجي الصحيح
ستوفر الصلة الخارجية اليمنى جميع الصفوف في B، بالإضافة إلى أي صفوف مشتركة في A.
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
الانضمام الخارجي الكامل
ستمنحك الصلة الخارجية الكاملة اتحاد A وB، أي.جميع الصفوف في A وجميع الصفوف في B.إذا كان هناك شيء ما في A لا يحتوي على مسند مناظر في B، فإن الجزء B يكون خاليًا، والعكس صحيح.
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
نصائح أخرى
مخططات فين لا تفعل ذلك حقًا بالنسبة لي.
فهي لا تظهر أي تمييز بين الصلة المشتركة والصلات الداخلية، على سبيل المثال، أو بشكل عام تظهر أي تمييز بين الأنواع المختلفة لمسندات الصلة أو توفر إطار عمل للتفكير حول كيفية عملها.
لا يوجد بديل لفهم المعالجة المنطقية، ومن السهل نسبيًا فهمها على أي حال.
- تخيل الانضمام عبر.
- تقييم
on
جملة مقابل كافة الصفوف من الخطوة 1 مع الاحتفاظ بالصفوف التي يتم تقييم المسند إليهاtrue
- (بالنسبة للصلات الخارجية فقط) قم بإضافة أي صفوف خارجية فقدت في الخطوة 2.
(ملاحظة:من الناحية العملية، قد يجد مُحسِّن الاستعلام طرقًا أكثر فعالية لتنفيذ الاستعلام من الوصف المنطقي البحت أعلاه ولكن النتيجة النهائية يجب أن تكون هي نفسها)
سأبدأ بنسخة متحركة من الانضمام الخارجي الكامل.يتبع مزيد من التوضيح.
توضيح
جداول المصدر
ابدأ أولاً بـ أ CROSS JOIN
(المعروف أيضًا باسم المنتج الديكارتي).هذا ليس لديه ON
جملة وتقوم ببساطة بإرجاع كل مجموعة من الصفوف من الجدولين.
حدد A.اللون، B.اللون من A CROSS JOIN B
تحتوي الصلات الداخلية والخارجية على جملة "ON" المسند.
- صلة داخلية. قم بتقييم الشرط في جملة "ON" لجميع الصفوف في نتيجة الربط المتقاطع.إذا كان صحيحا، قم بإرجاع الصف المرتبط.وإلا تجاهلها.
- ترك صلة خارجية. تمامًا مثل الصلة الداخلية ثم بالنسبة لأي صفوف في الجدول الأيسر لا تتطابق مع أي شيء، قم بإخراجها بقيم NULL لأعمدة الجدول الأيمن.
- الانضمام الخارجي الصحيح. تمامًا مثل الصلة الداخلية ثم بالنسبة لأي صفوف في الجدول الأيمن لا تتطابق مع أي شيء، قم بإخراجها بقيم NULL لأعمدة الجدول الأيسر.
- الانضمام الخارجي الكامل. تمامًا مثل الصلة الداخلية، ثم احتفظ بالصفوف اليسرى غير المتطابقة كما في الصلة الخارجية اليسرى والصفوف اليمنى غير المتطابقة حسب الصلة الخارجية اليمنى.
بعض الأمثلة
حدد A.Colour، B.Colour من A INNER JOIN B على A.Colour = B.Colour
ما ورد أعلاه هو الانضمام الكلاسيكي.
النسخة المتحركة
حدد A.Colour، B.Colour من A INNER JOIN B على A.Colour ليس في ('Green'، 'Blue')
لا يلزم أن يكون شرط الصلة الداخلية بالضرورة شرط مساواة ولا يحتاج إلى أعمدة مرجعية من كلا الجدولين (أو حتى أحدهما).تقييم A.Colour NOT IN ('Green','Blue')
في كل صف من عوائد الانضمام المتقاطع.
حدد A.Colour، B.Colour من A INNER JOIN B على 1 =1
يتم تقييم شرط الصلة على أنه صحيح لجميع الصفوف في نتيجة الصلة المتقاطعة، لذا فإن هذا هو نفس الصلة المتقاطعة.لن أكرر صورة الصفوف الستة عشر مرة أخرى.
حدد A.Colour، B.Colour من وصلة خارجية يسار B على A.Colour = B.Colour
يتم تقييم الصلات الخارجية منطقيًا بنفس طريقة الصلات الداخلية باستثناء أنه إذا لم يرتبط صف من الجدول الأيسر (للصلة اليسرى) بأي صفوف من الجدول الأيمن على الإطلاق، فسيتم الاحتفاظ به في النتيجة مع NULL
قيم الأعمدة اليمنى.
حدد A.Colour، B.Colour من A LEFT OUTER JOIN B على A.Colour = B.Colour حيث يكون B.Colour NULL
يؤدي هذا ببساطة إلى تقييد النتيجة السابقة لإرجاع الصفوف التي يوجد بها فقط B.Colour IS NULL
.في هذه الحالة بالذات، ستكون هذه هي الصفوف التي تم الاحتفاظ بها نظرًا لعدم وجود أي تطابق لها في الجدول الأيمن وسيقوم الاستعلام بإرجاع الصف الأحمر المفرد غير المتطابق في الجدول B
.يُعرف هذا باسم مكافحة شبه الانضمام.
من المهم تحديد عمود لـ IS NULL
اختبار إما غير قابل للإلغاء أو يضمن شرط الانضمام وجوده NULL
سيتم استبعاد القيم حتى يعمل هذا النمط بشكل صحيح وتجنب مجرد إعادة الصفوف التي تحتوي على NULL
القيمة لهذا العمود بالإضافة إلى الصفوف غير المتطابقة.
حدد A.Colour، B.Colour من A RIGHT OUTER JIN B على A.Colour = B.Colour
تعمل الصلات الخارجية اليمنى بشكل مشابه للصلات الخارجية اليسرى باستثناء أنها تحافظ على الصفوف غير المتطابقة من الجدول الأيمن وتمدد الأعمدة اليسرى.
حدد A.Colour، B.Colour من وصلة B خارجية كاملة على A.Colour = B.Colour
تجمع الصلات الخارجية الكاملة بين سلوك الصلات اليمنى واليسرى وتحافظ على الصفوف غير المتطابقة من الجدولين الأيمن والأيسر.
حدد A.اللون، B.اللون من وصلة خارجية كاملة B على 1 = 0
لا توجد صفوف في الرابط المتقاطع تتطابق مع 1=0
فاعل.يتم الاحتفاظ بجميع الصفوف من كلا الجانبين باستخدام قواعد الربط الخارجية العادية مع NULL في الأعمدة من الجدول الموجود على الجانب الآخر.
حدد COALESCE(A.Colour, B.Colour) كلون من وصلة خارجية كاملة B على 1 = 0
مع تعديل بسيط للاستعلام السابق يمكن للمرء محاكاة أ UNION ALL
من الجدولين.
حدد A.Colour، B.Colour من A LEFT OUTER JOIN B على A.Colour = B.Colour حيث B.Colour = 'Green'
نلاحظ أن WHERE
جملة (إن وجدت) تعمل بشكل منطقي بعد الانضمام.أحد الأخطاء الشائعة هو إجراء صلة خارجية يسرى ثم تضمين جملة WHERE مع شرط في الجدول الأيمن يؤدي في النهاية إلى استبعاد الصفوف غير المتطابقة.ما ورد أعلاه ينتهي بتنفيذ الصلة الخارجية ...
...وبعد ذلك يتم تشغيل جملة "أين". NULL= 'Green'
لا يتم تقييمه على أنه صحيح، لذلك يتم تجاهل الصف المحفوظ بواسطة الصلة الخارجية (جنبًا إلى جنب مع الصف الأزرق) مما يؤدي بشكل فعال إلى تحويل الصلة مرة أخرى إلى صلة داخلية.
إذا كان القصد هو تضمين الصفوف من B فقط حيث يكون اللون أخضر وجميع الصفوف من A بغض النظر عن بناء الجملة الصحيح
حدد A.Colour، B.Colour من A الأيسر الخارجي الذي يربط B على A.Colour = B.Colour وB.Colour = "أخضر"
SQL كمان
انظر هذه الأمثلة تشغيل مباشر في SQLFiddle.com.
ينضم يتم استخدامها لدمج البيانات من جدولين، وتكون النتيجة جدولًا مؤقتًا جديدًا.يتم تنفيذ عمليات الانضمام بناءً على شيء يسمى المسند، والذي يحدد الشرط المطلوب استخدامه لإجراء عملية الربط.الفرق بين الصلة الداخلية والصلات الخارجية هو أن الصلة الداخلية ستعيد فقط الصفوف التي تتطابق فعليًا بناءً على مسند الصلة.لنأخذ بعين الاعتبار جدول الموظف والموقع:
صلة داخلية:-تقوم الصلة الداخلية بإنشاء جدول نتائج جديد من خلال دمج قيم الأعمدة لجدولين (موظف و موقع) بناء على المسند الانضمام.يقوم الاستعلام بمقارنة كل صف من موظف مع كل صف موقع للعثور على جميع أزواج الصفوف التي تلبي المسند المرتبط.عندما يتم استيفاء المسند المرتبط بمطابقة القيم غير NULL، قيم الأعمدة لكل زوج من الصفوف المتطابقة موظف و موقع يتم دمجها في صف النتيجة.إليك ما سيبدو عليه SQL للصلة الداخلية:
select * from employee inner join location on employee.empID = location.empID
OR
select * from employee, location where employee.empID = location.empID
الآن، إليك ما ستبدو عليه نتيجة تشغيل SQL:
الانضمام الخارجي:-لا تتطلب الصلة الخارجية أن يكون لكل سجل في الجدولين المرتبطين سجل مطابق.يحتفظ الجدول المرتبط بكل سجل، حتى في حالة عدم وجود سجل مطابق آخر.تنقسم الصلات الخارجية بشكل أكبر إلى صلات خارجية يسرى وصلات خارجية يمنى، اعتمادًا على صفوف الجدول التي يتم الاحتفاظ بها (يسار أو يمين).
ترك صلة خارجية:-نتيجة الصلة الخارجية اليسرى (أو ببساطة الصلة اليسرى) للجداول موظف و موقع يحتوي دائمًا على كافة سجلات الجدول "الأيسر" (موظف)، حتى لو لم يعثر شرط الانضمام على أي سجل مطابق في الجدول "الصحيح" (موقع).إليك ما ستبدو عليه SQL للصلة الخارجية اليسرى، باستخدام الجداول أعلاه:
select * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
الآن، إليك ما ستبدو عليه نتيجة تشغيل SQL:
الانضمام الخارجي الأيمن: -الصلة الخارجية اليمنى (أو الصلة اليمنى) تشبه إلى حد كبير الصلة الخارجية اليسرى، فيما عدا معالجة الجداول بشكل معكوس.كل صف من الجدول "الأيمن" (موقع) سيظهر في الجدول المرتبط مرة واحدة على الأقل.إذا لم يكن هناك صف مطابق من الجدول "الأيسر" (موظف) موجود، سيظهر NULL في الأعمدة من موظف لتلك السجلات التي ليس لها تطابق فيها موقع.هذا ما يبدو عليه SQL:
select * from employee right outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
باستخدام الجداول أعلاه، يمكننا إظهار الشكل الذي ستبدو عليه مجموعة نتائج الصلة الخارجية اليمنى:
الانضمامات الخارجية الكاملة:-الانضمام الخارجي الكامل أو الانضمام الكامل هو الاحتفاظ بالمعلومات غير المتطابقة عن طريق تضمين صفوف غير متطابقة في نتائج الصلة، واستخدام صلة خارجية كاملة.ويتضمن كافة الصفوف من كلا الجدولين، بغض النظر عما إذا كان الجدول الآخر يحتوي على قيمة مطابقة أم لا.
صلة داخلية
استرداد الصفوف المتطابقة فقط، أي A intersect B
.
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
ترك صلة خارجية
حدد جميع السجلات من الجدول الأول ، وأي سجلات في الجدول الثاني تتطابق مع المفاتيح المرتبطة.
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
الانضمام الخارجي الكامل
حدد جميع السجلات من الجدول الثاني ، وأي سجلات في الجدول الأول تتطابق مع المفاتيح المرتبطة.
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
مراجع
بكلمات بسيطة:
ان صلة داخلية استرداد الصفوف المتطابقة فقط.
في حين أن الانضمام الخارجي استرداد الصفوف المتطابقة من جدول واحد وجميع الصفوف الموجودة في جدول آخر .... تعتمد النتيجة على الجدول الذي تستخدمه:
غادر:الصفوف المتطابقة في الجدول الأيمن وجميع الصفوف في الجدول الأيسر
يمين:الصفوف المتطابقة في الجدول الأيسر وجميع الصفوف في الجدول الأيمن أو
ممتلىء:كافة الصفوف في كافة الجداول.لا يهم إذا كان هناك تطابق أم لا
تُظهر الصلة الداخلية الصفوف فقط إذا كان هناك سجل مطابق على الجانب الآخر (الأيمن) من الصلة.
تُظهر الصلة الخارجية (اليسرى) صفوفًا لكل سجل على الجانب الأيسر، حتى إذا لم تكن هناك صفوف متطابقة على الجانب الآخر (الأيمن) من الصلة.إذا لم يكن هناك صف مطابق، فإن أعمدة الجانب الآخر (الأيمن) ستظهر القيم الخالية.
تتطلب الصلات الداخلية وجود سجل بمعرف ذي صلة في الجدول المرتبط.
ستعيد الصلات الخارجية سجلات للجانب الأيسر حتى في حالة عدم وجود أي شيء للجانب الأيمن.
على سبيل المثال، لديك جدول Orders (الطلبات) وجدول OrderDetails (تفاصيل الطلب).وهي مرتبطة بواسطة "معرف الطلب".
طلبات
- رقم التعريف الخاص بالطلب
- اسم الزبون
تفاصيل الطلب
- معرف تفاصيل الطلب
- رقم التعريف الخاص بالطلب
- اسم المنتج
- الكمية
- سعر
الطلب
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
سيُرجع فقط الطلبات التي تحتوي أيضًا على شيء ما في جدول OrderDetails.
إذا قمت بتغييره إلى OUTER LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
فإنه سيتم إرجاع السجلات من جدول الطلبات حتى لو لم يكن لديهم سجلات OrderDetails.
يمكنك استخدام هذا للعثور على الطلبات التي لا تحتوي على أي تفاصيل طلب تشير إلى طلب معزول محتمل عن طريق إضافة عبارة حيث مثل WHERE OrderDetails.OrderID IS NULL
.
بكلمات بسيطة :
صلة داخلية -> خذ السجلات الشائعة فقط من الجداول الأصلية والتابعة حيث يتطابق المفتاح الأساسي للجدول الأصلي مع المفتاح الخارجي في الجدول الفرعي.
الانضمام الأيسر ->
كود مزيف
1.Take All records from left Table
2.for(each record in right table,) {
if(Records from left & right table matching on primary & foreign key){
use their values as it is as result of join at the right side for 2nd table.
} else {
put value NULL values in that particular record as result of join at the right side for 2nd table.
}
}
الانضمام الصحيح :عكس الانضمام الأيسر تمامًا.ضع اسم الجدول في LEFT JOIN على الجانب الأيمن في Right join، وستحصل على نفس الإخراج مثل LEFT JOIN.
الانضمام الخارجي :إظهار كافة السجلات في كلا الجدولين No matter what
.إذا كانت السجلات الموجودة في الجدول الأيسر غير متطابقة مع الجدول الأيمن استنادًا إلى المفتاح الأساسي أو المفتاح الخارجي، فاستخدم القيمة NULL كنتيجة للصلة.
مثال :
لنفترض الآن وجود جدولين
1.employees , 2.phone_numbers_employees
employees : id , name
phone_numbers_employees : id , phone_num , emp_id
هنا، جدول الموظفين هو الجدول الرئيسي، وphone_numbers_employees هو جدول فرعي (يحتوي على emp_id
كمفتاح خارجي الذي يتصل employee.id
لذا فهو جدول فرعي.)
الانضمامات الداخلية
خذ سجلات جدولين فقط إذا كان المفتاح الأساسي لجدول الموظفين (معرفه) يتطابق مع المفتاح الخارجي لجدول الطفل phone_numbers_employees(emp_id).
لذلك سيكون الاستعلام:
SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
هنا تأخذ فقط الصفوف المتطابقة على المفتاح الأساسي = المفتاح الخارجي كما هو موضح أعلاه. هنا يتم تخطي الصفوف غير المتطابقة على المفتاح الأساسي = المفتاح الخارجي نتيجة للانضمام.
ينضم اليسار :
تحتفظ الصلة اليسرى بجميع صفوف الجدول الأيسر، بغض النظر عما إذا كان هناك صف مطابق في الجدول الأيمن.
SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
الانضمامات الخارجية :
SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
من الناحية التخطيطية يبدو الأمر كما يلي:
انت تستخدم INNER JOIN
لإرجاع كافة الصفوف من كلا الجدولين حيث يوجد تطابق.أي.في الجدول الناتج، سيكون لجميع الصفوف والأعمدة قيم.
في OUTER JOIN
قد يحتوي الجدول الناتج على أعمدة فارغة.الانضمام الخارجي قد يكون أيضًا LEFT
أو RIGHT
.
LEFT OUTER JOIN
إرجاع كافة الصفوف من الجدول الأول، حتى لو لم يكن هناك أي تطابقات في الجدول الثاني.
RIGHT OUTER JOIN
إرجاع كافة الصفوف من الجدول الثاني، حتى لو لم يكن هناك أي تطابقات في الجدول الأول.
هذا شرح تخطيطي جيد لجميع أنواع الصلات
مصدر: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
INNER JOIN
يتطلب وجود تطابق على الأقل في مقارنة الجدولين.على سبيل المثال، الجدول A والجدول B الذي يتضمن A ٨ B (تقاطع A B).
LEFT OUTER JOIN
و LEFT JOIN
هي نفسها.فهو يوفر جميع السجلات المطابقة في كلا الجدولين وجميع احتمالات الجدول الأيسر.
بصورة مماثلة، RIGHT OUTER JOIN
و RIGHT JOIN
هي نفسها.فهو يوفر جميع السجلات المطابقة في كلا الجدولين وجميع احتمالات الجدول الصحيح.
FULL JOIN
هو مزيج من LEFT OUTER JOIN
و RIGHT OUTER JOIN
دون الازدواجية.
الجواب في معنى كل واحد، ففي النتائج.
ملحوظة :
فيSQLite
لا يوجدRIGHT OUTER JOIN
أوFULL OUTER JOIN
.
وأيضا فيMySQL
لا يوجدFULL OUTER JOIN
.
إجابتي مبنية على ما سبق ملحوظة.
عندما يكون لديك جدولين مثل هذا:
--[table1] --[table2]
id | name id | name
---+------- ---+-------
1 | a1 1 | a2
2 | b1 3 | b2
الانضمام المتقاطع/الانضمام الخارجي:
يمكنك الحصول على جميع بيانات الجداول تلك CROSS JOIN
أو فقط مع ,
مثله:
SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
1 | a1 | 3 | b2
2 | b1 | 1 | a2
2 | b1 | 3 | b2
صلة داخلية :
عندما تريد إضافة عامل تصفية إلى النتائج أعلاه بناءً على علاقة مثل table1.id = table2.id
يمكنك استخدام INNER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
ترك صلة خارجية :
عندما تريد الحصول على كافة صفوف أحد الجداول في النتيجة أعلاه - بنفس العلاقة - يمكنك استخدامها LEFT JOIN
:
(ل الانضمام الصحيح فقط قم بتغيير مكان الجداول)
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
الانضمام الخارجي الكامل:
عندما تريد أيضًا تضمين كافة صفوف الجدول الآخر في نتائجك، يمكنك استخدامها FULL OUTER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id
--[Results:]
id | name | id | name
-----+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
Null | Null | 3 | b2
حسنًا، حسب حاجتك، تختار كل ما يغطي حاجتك ;).
صلة داخلية.
الصلة هي دمج الصفوف من جدولين.ان صلة داخلية يحاول مطابقة الجدولين بناءً على المعايير التي تحددها في الاستعلام، ويقوم بإرجاع الصفوف المتطابقة فقط.إذا كان صف من الجدول الأول في الصلة يطابق صفين في الجدول الثاني، فسيتم إرجاع صفين في النتائج.إذا كان هناك صف في الجدول الأول لا يطابق صفًا في الجدول الثاني، فلن يتم إرجاعه؛وبالمثل، إذا كان هناك صف في الجدول الثاني لا يتطابق مع صف في الأول، فلن يتم إرجاعه.
الانضمام الخارجي.
أ الانضمام الأيسر يحاول البحث عن مطابقة الصفوف من الجدول الأول إلى الصفوف الموجودة في الجدول الثاني.إذا لم يتمكن من العثور على تطابق، فسيقوم بإرجاع الأعمدة من الجدول الأول ويترك الأعمدة من الجدول الثاني فارغة (خالية).
لا أرى الكثير من التفاصيل حول الأداء والمحسن في الإجابات الأخرى.
في بعض الأحيان يكون من الجيد معرفة ذلك فقط INNER JOIN
هو ترابطي مما يعني أن المُحسِّن لديه أكبر خيار للعب به.يمكنه إعادة ترتيب ترتيب الانضمام لجعله أسرع في الحفاظ على نفس النتيجة.يمكن للمحسن استخدام أوضاع الانضمام الأكثر.
بشكل عام، من الممارسات الجيدة محاولة استخدامها INNER JOIN
بدلاً من النوع المختلف من الصلات.(بالطبع إذا كان ذلك ممكنا بالنظر إلى مجموعة النتائج المتوقعة.)
هناك بضعة أمثلة جيدة وشرح هنا حول هذا السلوك الترابطي الغريب:
الخوارزمية الدقيقة ل INNER JOIN
, LEFT/RIGHT OUTER JOIN
هي كما يلي:
- خذ كل صف من الجدول الأول:
a
- خذ بعين الاعتبار جميع الصفوف من الجدول الثاني بجانبه:
(a, b[i])
- تقييم
ON ...
جملة ضد كل زوج:ON( a, b[i] ) = true/false?
- عندما يتم تقييم الحالة ل
true
, ، قم بإرجاع هذا الصف المدمج(a, b[i])
. - عند الوصول إلى نهاية الجدول الثاني دون أي تطابق، وهذا
Outer Join
ثم ارجع أ (افتراضي) الزوج باستخدامNull
لجميع أعمدة الجدول الآخر:(a, Null)
للانضمام الخارجي الأيسر أو(Null, b)
للانضمام الخارجي الأيمن.وذلك لضمان وجود كافة صفوف الجدول الأول في النتائج النهائية.
- عندما يتم تقييم الحالة ل
ملحوظة: الحالة المحددة في ON
يمكن أن يكون الشرط أي شيء، وليس من الضروري استخدامه المفاتيح الأساسية (ولست بحاجة إلى الرجوع دائمًا إلى الأعمدة من كلا الجدولين)!على سبيل المثال:
... ON T1.title = T2.title AND T1.version < T2.version
( => راجع هذا المنشور كنموذج للاستخدام: حدد فقط الصفوف ذات القيمة القصوى في العمود)... ON T1.y IS NULL
... ON 1 = 0
(تماما كعينة)
ملحوظة: الانضمام الأيسر = الانضمام الخارجي الأيسر، الانضمام الأيمن = الانضمام الخارجي الأيمن.
بعد أن انتقدت مخطط Venn المظلل باللون الأحمر والمحبوب للغاية، اعتقدت أنه من العدل نشر محاولتي الخاصة.
على الرغم من أن إجابة @Martin Smith هي الأفضل في هذه المجموعة إلى حد بعيد، إلا أنها تعرض فقط العمود الرئيسي من كل جدول، في حين أعتقد أنه يجب أيضًا عرض الأعمدة غير الرئيسية بشكل مثالي.
أفضل ما يمكنني فعله خلال نصف الساعة المسموح به، ما زلت لا أعتقد أنه يُظهر بشكل كافٍ أن القيم الخالية موجودة بسبب عدم وجود قيم أساسية في TableB
أو ذلك OUTER JOIN
هو في الواقع اتحاد وليس انضمام:
INNER JOIN
الانضمام الأكثر شيوعًا لجدولين أو أكثر.تقوم بإرجاع تطابق البيانات في كلا الجدولين على علاقة المفتاح الأساسي ومفتاح forignkey.OUTER JOIN
هو نفسهINNER JOIN
, ، ولكنها تشمل أيضًاNULL
البيانات على ResultSet.LEFT JOIN
=INNER JOIN
+ بيانات لا مثيل لها غادر طاولة معNull
المباراة على الطاولة اليمنى.RIGHT JOIN
=INNER JOIN
+ بيانات لا مثيل لها يمين طاولة معNull
المباراة على الطاولة اليسرى.FULL JOIN
=INNER JOIN
+ بيانات لا مثيل لها على كل من اليمين واليسار الجداول معNull
اعواد الكبريت.
- الانضمام الذاتي ليس كلمة أساسية في SQL، عندما يشير الجدول إلى البيانات في حد ذاته يعرف باسم الانضمام الذاتي.استخدام
INNER JOIN
وOUTER JOIN
يمكننا كتابة استعلامات الانضمام الذاتي.
على سبيل المثال:
SELECT *
FROM tablea a
INNER JOIN tableb b
ON a.primary_key = b.foreign_key
INNER JOIN tablec c
ON b.primary_key = c.foreign_key
أبسط التعاريف
صلة داخلية:عائدات السجلات المتطابقة من كلا الجدولين.
الانضمام الخارجي الكامل:عوائد متطابقة و سجلات لا مثيل لها من كلا الجدولين مع قيمة خالية للسجلات غير المتطابقة من كلا الجدولين.
ترك صلة خارجية:إرجاع السجلات المتطابقة وغير المتطابقة فقط من الجدول الموجود الجهه اليسرى.
الانضمام الخارجي الأيمن:إرجاع السجلات المتطابقة وغير المتطابقة فقط من الجدول الموجود الجانب الأيمن.
باختصار
متطابق + يسار غير مطابق + يمين غير مطابق = الانضمام الخارجي الكامل
متطابق + يسار غير متطابق = ترك صلة خارجية
متطابق + صحيح غير متطابق = الانضمام الخارجي الصحيح
متطابق = صلة داخلية
بعبارات بسيطة،
1.الانضمام الداخلي أو الانضمام إلى EQUI: إرجاع مجموعة النتائج التي تطابق الشرط الموجود في كلا الجدولين فقط.
2.الانضمام الخارجي : إرجاع مجموعة النتائج لجميع القيم من كلا الجدولين حتى لو كان هناك شرط مطابق أم لا.
3.الانضمام الأيسر : إرجاع مجموعة النتائج لجميع القيم من الجدول الأيسر والصفوف التي تطابق الشرط في الجدول الأيمن فقط.
4.الانضمام الصحيح : إرجاع مجموعة النتائج لجميع القيم من الجدول الأيمن والصفوف التي تطابق الشرط في الجدول الأيسر فقط.
5.الانضمام الكامل : الانضمام الكامل والانضمام الخارجي الكامل متماثلان.
1.صلة داخلية: ويسمى أيضًا باسم الانضمام.تقوم بإرجاع الصفوف الموجودة في كل من الجدول الأيسر والجدول الأيمن فقط إذا كان هناك مباراة.وبخلاف ذلك، فإنها تقوم بإرجاع سجلات صفرية.
مثال:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
2.الانضمام الخارجي الكامل: ويسمى أيضًا باسم الانضمام الكامل.يعود كل الصفوف موجود في كل من الجدول الأيسر والجدول الأيمن.
مثال:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
FULL OUTER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
3.ترك صلة خارجية: أو يُطلق عليه ببساطة اسم Left Join.تقوم بإرجاع جميع الصفوف الموجودة في الجدول الأيسر والصفوف المطابقة من الجدول الأيمن (إن وجدت).
4.الانضمام الخارجي الأيمن: يُطلق عليه أيضًا اسم "الانضمام الصحيح".تقوم بإرجاع الصفوف المتطابقة من الجدول الأيسر (إن وجدت)، وجميع الصفوف الموجودة في الجدول الأيمن.
مزايا الانضمام
- ينفذ بشكل أسرع.
صلة داخلية - ان صلة داخلية باستخدام أي من الاستعلامات المكافئة يعطي تقاطع الاثنين الجداول, ، أي.الصفين المشتركين بينهما.
ترك صلة خارجية - أ ترك صلة خارجية سيعطي جميع الصفوف في A، بالإضافة إلى أي صفوف مشتركة في B.
الانضمام الخارجي الكامل - أ الانضمام الخارجي الكامل سوف أعطيك اتحاد A و B، أي.جميع الصفوف في A وجميع الصفوف في B.إذا كان هناك شيء ما في A لا يحتوي على مسند مناظر في B، فإن الجزء B يكون خاليًا، والعكس صحيح
left join on
(الملقب ب left outer join on
) عائدات inner join on
صفوف union all
صفوف الجدول اليسرى التي لا مثيل لها ممتدة بالقيم الخالية.
right join (on
الملقب ب right outer join on
) عائدات inner join on
صفوف union all
صفوف الجدول اليمنى التي لا مثيل لها ممتدة بالقيم الخالية.
full join on
(الملقب ب full outer join on
) عائدات inner join on
صفوفunion all
صفوف الجدول اليسرى التي لا مثيل لها ممتدة بالقيم الخالية union all
صفوف الجدول اليمنى التي لا مثيل لها ممتدة بالقيم الخالية.
(SQL Standard 2006 SQL/Foundation 7.7 قواعد بناء الجملة 1، القواعد العامة 1 ب، 3 ج و د، 5 ب.)
لذا لا تفعل ذلك outer join
حتى تعرف ما هو الأساس inner join
متورط.
اكتشف ما الصفوف inner join
عائدات.
اقرأ تعليقاتي هناك العديد من الإجابات المشوشة والضعيفة.
ثم اقرأ تعليقاتي هنا بشأن الإجابات العديدة المشوشة والضعيفة.
الفرق بين الانضمام الداخلي والانضمام الخارجي هو كما يلي:
- الصلة الداخلية هي صلة تجمع الجداول بناءً على صفوف متطابقة، في حين أن الصلة الخارجية هي صلة تجمع جدولًا يعتمد على صفوف متطابقة وغير متطابقة.
- تقوم الصلة الداخلية بدمج الصفوف المتطابقة من جدولين حيث يتم حذف الصف غير المتطابق، بينما تقوم الصلة الخارجية بدمج الصفوف من جدولين وتملأ الصفوف غير المتطابقة بقيمة فارغة.
- تشبه الصلة الداخلية عملية التقاطع، بينما تشبه الصلة الخارجية عملية الاتحاد.
- الصلة الداخلية هي نوعان، في حين أن الصلة الخارجية هي ثلاثة أنواع.
- الصلة الداخلية أبطأ، بينما الصلة الخارجية أسرع من الصلة الداخلية.
النظر في الجدولين أدناه:
النبض الكهرومغناطيسي
empid name dept_id salary
1 Rob 1 100
2 Mark 1 300
3 John 2 100
4 Mary 2 300
5 Bill 3 700
6 Jose 6 400
قسم
deptid name
1 IT
2 Accounts
3 Security
4 HR
5 R&D
صلة داخلية:
مكتوب في الغالب على أنه عادل ينضم في استعلامات SQL.تقوم بإرجاع السجلات المطابقة فقط بين الجداول.
تعرف على جميع الموظفين وأسماء أقسامهم:
Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
كما ترون أعلاه، Jose
لا يطبع من النبض الكهرومغناطيسي في الإخراج كما هو dept_id 6
لم يجد تطابقًا في جدول القسم.بصورة مماثلة، HR
و R&D
لا تتم طباعة الصفوف من قسم الجدول لأنهم لم يجدوا تطابقًا في جدول Emp.
لذلك، INNER JOIN أو JOIN فقط، تقوم بإرجاع الصفوف المتطابقة فقط.
الانضمام الأيسر :
يؤدي هذا إلى إرجاع كافة السجلات من الجدول الأيسر والسجلات المطابقة فقط من الجدول الأيمن.
Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
6 Jose
لذلك، إذا لاحظت الإخراج أعلاه، تتم طباعة كافة السجلات من الجدول الأيسر (Emp) مع السجلات المطابقة فقط من الجدول الأيمن.
HR
و R&D
لا تتم طباعة الصفوف من قسم الجدول لأنهم لم يجدوا تطابقًا في الجدول Emp على dept_id.
لذلك، تقوم LEFT JOIN بإرجاع كافة الصفوف من الجدول الأيسر ومطابقة الصفوف من الجدول الأيمن فقط.
يمكن أيضًا التحقق من العرض التوضيحي هنا.