ما الفرق بين "الانضمام الداخلي" و"الانضمام الخارجي"؟

StackOverflow https://stackoverflow.com/questions/38549

سؤال

كذلك كيف 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

نصائح أخرى

مخططات فين لا تفعل ذلك حقًا بالنسبة لي.

فهي لا تظهر أي تمييز بين الصلة المشتركة والصلات الداخلية، على سبيل المثال، أو بشكل عام تظهر أي تمييز بين الأنواع المختلفة لمسندات الصلة أو توفر إطار عمل للتفكير حول كيفية عملها.

لا يوجد بديل لفهم المعالجة المنطقية، ومن السهل نسبيًا فهمها على أي حال.

  1. تخيل الانضمام عبر.
  2. تقييم on جملة مقابل كافة الصفوف من الخطوة 1 مع الاحتفاظ بالصفوف التي يتم تقييم المسند إليها true
  3. (بالنسبة للصلات الخارجية فقط) قم بإضافة أي صفوف خارجية فقدت في الخطوة 2.

(ملاحظة:من الناحية العملية، قد يجد مُحسِّن الاستعلام طرقًا أكثر فعالية لتنفيذ الاستعلام من الوصف المنطقي البحت أعلاه ولكن النتيجة النهائية يجب أن تكون هي نفسها)

سأبدأ بنسخة متحركة من الانضمام الخارجي الكامل.يتبع مزيد من التوضيح.

enter image description here


توضيح

جداول المصدر

enter link description here

ابدأ أولاً بـ أ CROSS JOIN (المعروف أيضًا باسم المنتج الديكارتي).هذا ليس لديه ON جملة وتقوم ببساطة بإرجاع كل مجموعة من الصفوف من الجدولين.

حدد A.اللون، B.اللون من A CROSS JOIN B

enter link description here

تحتوي الصلات الداخلية والخارجية على جملة "ON" المسند.

  • صلة داخلية. قم بتقييم الشرط في جملة "ON" لجميع الصفوف في نتيجة الربط المتقاطع.إذا كان صحيحا، قم بإرجاع الصف المرتبط.وإلا تجاهلها.
  • ترك صلة خارجية. تمامًا مثل الصلة الداخلية ثم بالنسبة لأي صفوف في الجدول الأيسر لا تتطابق مع أي شيء، قم بإخراجها بقيم NULL لأعمدة الجدول الأيمن.
  • الانضمام الخارجي الصحيح. تمامًا مثل الصلة الداخلية ثم بالنسبة لأي صفوف في الجدول الأيمن لا تتطابق مع أي شيء، قم بإخراجها بقيم NULL لأعمدة الجدول الأيسر.
  • الانضمام الخارجي الكامل. تمامًا مثل الصلة الداخلية، ثم احتفظ بالصفوف اليسرى غير المتطابقة كما في الصلة الخارجية اليسرى والصفوف اليمنى غير المتطابقة حسب الصلة الخارجية اليمنى.

بعض الأمثلة

حدد A.Colour، B.Colour من A INNER JOIN B على A.Colour = B.Colour

ما ورد أعلاه هو الانضمام الكلاسيكي.

Inner Join

النسخة المتحركة

enter image description here

حدد A.Colour، B.Colour من A INNER JOIN B على A.Colour ليس في ('Green'، 'Blue')

لا يلزم أن يكون شرط الصلة الداخلية بالضرورة شرط مساواة ولا يحتاج إلى أعمدة مرجعية من كلا الجدولين (أو حتى أحدهما).تقييم A.Colour NOT IN ('Green','Blue') في كل صف من عوائد الانضمام المتقاطع.

inner 2

حدد A.Colour، B.Colour من A INNER JOIN B على 1 =1

يتم تقييم شرط الصلة على أنه صحيح لجميع الصفوف في نتيجة الصلة المتقاطعة، لذا فإن هذا هو نفس الصلة المتقاطعة.لن أكرر صورة الصفوف الستة عشر مرة أخرى.

حدد A.Colour، B.Colour من وصلة خارجية يسار B على A.Colour = B.Colour

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

LOJ

حدد 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 القيمة لهذا العمود بالإضافة إلى الصفوف غير المتطابقة.

loj is null

حدد A.Colour، B.Colour من A RIGHT OUTER JIN B على A.Colour = B.Colour

تعمل الصلات الخارجية اليمنى بشكل مشابه للصلات الخارجية اليسرى باستثناء أنها تحافظ على الصفوف غير المتطابقة من الجدول الأيمن وتمدد الأعمدة اليسرى.

ROJ

حدد A.Colour، B.Colour من وصلة B خارجية كاملة على A.Colour = B.Colour

تجمع الصلات الخارجية الكاملة بين سلوك الصلات اليمنى واليسرى وتحافظ على الصفوف غير المتطابقة من الجدولين الأيمن والأيسر.

FOJ

حدد A.اللون، B.اللون من وصلة خارجية كاملة B على 1 = 0

لا توجد صفوف في الرابط المتقاطع تتطابق مع 1=0 فاعل.يتم الاحتفاظ بجميع الصفوف من كلا الجانبين باستخدام قواعد الربط الخارجية العادية مع NULL في الأعمدة من الجدول الموجود على الجانب الآخر.

FOJ 2

حدد COALESCE(A.Colour, B.Colour) كلون من وصلة خارجية كاملة B على 1 = 0

مع تعديل بسيط للاستعلام السابق يمكن للمرء محاكاة أ UNION ALL من الجدولين.

UNION ALL

حدد A.Colour، B.Colour من A LEFT OUTER JOIN B على A.Colour = B.Colour حيث B.Colour = 'Green'

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

LOJ

...وبعد ذلك يتم تشغيل جملة "أين". NULL= 'Green' لا يتم تقييمه على أنه صحيح، لذلك يتم تجاهل الصف المحفوظ بواسطة الصلة الخارجية (جنبًا إلى جنب مع الصف الأزرق) مما يؤدي بشكل فعال إلى تحويل الصلة مرة أخرى إلى صلة داخلية.

LOJtoInner

إذا كان القصد هو تضمين الصفوف من B فقط حيث يكون اللون أخضر وجميع الصفوف من A بغض النظر عن بناء الجملة الصحيح

حدد A.Colour، B.Colour من A الأيسر الخارجي الذي يربط B على A.Colour = B.Colour وB.Colour = "أخضر"

enter image description here

SQL كمان

انظر هذه الأمثلة تشغيل مباشر في SQLFiddle.com.

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

enter image description here

صلة داخلية:-تقوم الصلة الداخلية بإنشاء جدول نتائج جديد من خلال دمج قيم الأعمدة لجدولين (موظف و موقع) بناء على المسند الانضمام.يقوم الاستعلام بمقارنة كل صف من موظف مع كل صف موقع للعثور على جميع أزواج الصفوف التي تلبي المسند المرتبط.عندما يتم استيفاء المسند المرتبط بمطابقة القيم غير NULL، قيم الأعمدة لكل زوج من الصفوف المتطابقة موظف و موقع يتم دمجها في صف النتيجة.إليك ما سيبدو عليه SQL للصلة الداخلية:

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

الآن، إليك ما ستبدو عليه نتيجة تشغيل SQL:enter image description here enter image description here

الانضمام الخارجي:-لا تتطلب الصلة الخارجية أن يكون لكل سجل في الجدولين المرتبطين سجل مطابق.يحتفظ الجدول المرتبط بكل سجل، حتى في حالة عدم وجود سجل مطابق آخر.تنقسم الصلات الخارجية بشكل أكبر إلى صلات خارجية يسرى وصلات خارجية يمنى، اعتمادًا على صفوف الجدول التي يتم الاحتفاظ بها (يسار أو يمين).

ترك صلة خارجية:-نتيجة الصلة الخارجية اليسرى (أو ببساطة الصلة اليسرى) للجداول موظف و موقع يحتوي دائمًا على كافة سجلات الجدول "الأيسر" (موظف)، حتى لو لم يعثر شرط الانضمام على أي سجل مطابق في الجدول "الصحيح" (موقع).إليك ما ستبدو عليه SQL للصلة الخارجية اليسرى، باستخدام الجداول أعلاه:

select  * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional

الآن، إليك ما ستبدو عليه نتيجة تشغيل SQL:enter image description here enter image description here

الانضمام الخارجي الأيمن: -الصلة الخارجية اليمنى (أو الصلة اليمنى) تشبه إلى حد كبير الصلة الخارجية اليسرى، فيما عدا معالجة الجداول بشكل معكوس.كل صف من الجدول "الأيمن" (موقع) سيظهر في الجدول المرتبط مرة واحدة على الأقل.إذا لم يكن هناك صف مطابق من الجدول "الأيسر" (موظف) موجود، سيظهر NULL في الأعمدة من موظف لتلك السجلات التي ليس لها تطابق فيها موقع.هذا ما يبدو عليه SQL:

select * from employee right outer join location  on employee.empID = location.empID;
//Use of outer keyword is optional

باستخدام الجداول أعلاه، يمكننا إظهار الشكل الذي ستبدو عليه مجموعة نتائج الصلة الخارجية اليمنى:

enter image description hereenter image description here

الانضمامات الخارجية الكاملة:-الانضمام الخارجي الكامل أو الانضمام الكامل هو الاحتفاظ بالمعلومات غير المتطابقة عن طريق تضمين صفوف غير متطابقة في نتائج الصلة، واستخدام صلة خارجية كاملة.ويتضمن كافة الصفوف من كلا الجدولين، بغض النظر عما إذا كان الجدول الآخر يحتوي على قيمة مطابقة أم لا.enter image description here

مصدر الصورة

الدليل المرجعي لـ MySQL 8.0 - الانضمام إلى بناء الجملة

أوراكل الانضمام إلى العمليات

صلة داخلية

استرداد الصفوف المتطابقة فقط، أي A intersect B.

Enter image description here

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

ترك صلة خارجية

حدد جميع السجلات من الجدول الأول ، وأي سجلات في الجدول الثاني تتطابق مع المفاتيح المرتبطة.

Enter image description here

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

الانضمام الخارجي الكامل

حدد جميع السجلات من الجدول الثاني ، وأي سجلات في الجدول الأول تتطابق مع المفاتيح المرتبطة.

Enter image description here

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 كنتيجة للصلة.

مثال :

Example

لنفترض الآن وجود جدولين

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;

من الناحية التخطيطية يبدو الأمر كما يلي:

Diagram

انت تستخدم INNER JOIN لإرجاع كافة الصفوف من كلا الجدولين حيث يوجد تطابق.أي.في الجدول الناتج، سيكون لجميع الصفوف والأعمدة قيم.

في OUTER JOIN قد يحتوي الجدول الناتج على أعمدة فارغة.الانضمام الخارجي قد يكون أيضًا LEFT أو RIGHT.

LEFT OUTER JOIN إرجاع كافة الصفوف من الجدول الأول، حتى لو لم يكن هناك أي تطابقات في الجدول الثاني.

RIGHT OUTER JOIN إرجاع كافة الصفوف من الجدول الثاني، حتى لو لم يكن هناك أي تطابقات في الجدول الأول.

This is a good explanation for joins

هذا شرح تخطيطي جيد لجميع أنواع الصلات

مصدر: 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 هي كما يلي:

  1. خذ كل صف من الجدول الأول: a
  2. خذ بعين الاعتبار جميع الصفوف من الجدول الثاني بجانبه: (a, b[i])
  3. تقييم ON ... جملة ضد كل زوج: ON( a, b[i] ) = true/false?
    • عندما يتم تقييم الحالة ل true, ، قم بإرجاع هذا الصف المدمج (a, b[i]).
    • عند الوصول إلى نهاية الجدول الثاني دون أي تطابق، وهذا Outer Join ثم ارجع أ (افتراضي) الزوج باستخدام Null لجميع أعمدة الجدول الآخر: (a, Null) للانضمام الخارجي الأيسر أو (Null, b) للانضمام الخارجي الأيمن.وذلك لضمان وجود كافة صفوف الجدول الأول في النتائج النهائية.

ملحوظة: الحالة المحددة في ON يمكن أن يكون الشرط أي شيء، وليس من الضروري استخدامه المفاتيح الأساسية (ولست بحاجة إلى الرجوع دائمًا إلى الأعمدة من كلا الجدولين)!على سبيل المثال:

Inner Join vs. Left Outer Join


enter image description here

ملحوظة: الانضمام الأيسر = الانضمام الخارجي الأيسر، الانضمام الأيمن = الانضمام الخارجي الأيمن.

بعد أن انتقدت مخطط Venn المظلل باللون الأحمر والمحبوب للغاية، اعتقدت أنه من العدل نشر محاولتي الخاصة.

على الرغم من أن إجابة @Martin Smith هي الأفضل في هذه المجموعة إلى حد بعيد، إلا أنها تعرض فقط العمود الرئيسي من كل جدول، في حين أعتقد أنه يجب أيضًا عرض الأعمدة غير الرئيسية بشكل مثالي.

أفضل ما يمكنني فعله خلال نصف الساعة المسموح به، ما زلت لا أعتقد أنه يُظهر بشكل كافٍ أن القيم الخالية موجودة بسبب عدم وجود قيم أساسية في TableB أو ذلك OUTER JOIN هو في الواقع اتحاد وليس انضمام:

enter image description here

enter image description here

  • 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

output1

2.الانضمام الخارجي الكامل: ويسمى أيضًا باسم الانضمام الكامل.يعود كل الصفوف موجود في كل من الجدول الأيسر والجدول الأيمن.

مثال:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
FULL OUTER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

output2

3.ترك صلة خارجية: أو يُطلق عليه ببساطة اسم Left Join.تقوم بإرجاع جميع الصفوف الموجودة في الجدول الأيسر والصفوف المطابقة من الجدول الأيمن (إن وجدت).

4.الانضمام الخارجي الأيمن: يُطلق عليه أيضًا اسم "الانضمام الصحيح".تقوم بإرجاع الصفوف المتطابقة من الجدول الأيسر (إن وجدت)، وجميع الصفوف الموجودة في الجدول الأيمن.

joins

مزايا الانضمام

  1. ينفذ بشكل أسرع.
  • صلة داخلية - ان صلة داخلية باستخدام أي من الاستعلامات المكافئة يعطي تقاطع الاثنين الجداول, ، أي.الصفين المشتركين بينهما.

  • ترك صلة خارجية - أ ترك صلة خارجية سيعطي جميع الصفوف في 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 عائدات.

اقرأ تعليقاتي هناك العديد من الإجابات المشوشة والضعيفة.

ثم اقرأ تعليقاتي هنا بشأن الإجابات العديدة المشوشة والضعيفة.

الفرق بين الانضمام الداخلي والانضمام الخارجي هو كما يلي:

  1. الصلة الداخلية هي صلة تجمع الجداول بناءً على صفوف متطابقة، في حين أن الصلة الخارجية هي صلة تجمع جدولًا يعتمد على صفوف متطابقة وغير متطابقة.
  2. تقوم الصلة الداخلية بدمج الصفوف المتطابقة من جدولين حيث يتم حذف الصف غير المتطابق، بينما تقوم الصلة الخارجية بدمج الصفوف من جدولين وتملأ الصفوف غير المتطابقة بقيمة فارغة.
  3. تشبه الصلة الداخلية عملية التقاطع، بينما تشبه الصلة الخارجية عملية الاتحاد.
  4. الصلة الداخلية هي نوعان، في حين أن الصلة الخارجية هي ثلاثة أنواع.
  5. الصلة الداخلية أبطأ، بينما الصلة الخارجية أسرع من الصلة الداخلية.

النظر في الجدولين أدناه:

النبض الكهرومغناطيسي

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 بإرجاع كافة الصفوف من الجدول الأيسر ومطابقة الصفوف من الجدول الأيمن فقط.

يمكن أيضًا التحقق من العرض التوضيحي هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top