it-swarm.asia

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

أنا جديد في SQL وأردت أن أعرف ما الفرق بين هذين النوعين JOIN؟

SELECT * 
FROM user u
INNER JOIN telephone t ON t.user_id = u.id

SELECT * 
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id

متى يجب علي استخدام واحد أو آخر؟

35
Julien
  • ستحدد الصلة الداخلية السجلات التي توجد بها المفاتيح المرتبطة في كلاهما الجداول المحددة.
  • ستحدد اليسار الخارجي الأيسر جميع السجلات من الجدول الأول ، وأي سجلات في الجدول الثاني تطابق المفاتيح المرتبطة.
  • ستحدد الصلة الخارجية اليمنى جميع السجلات من الجدول الثاني ، وأي سجلات في الجدول الأول تطابق المفاتيح المرتبطة.

في المثال الأول ، لن تعرض سوى قائمة بأسماء المستخدمين وأرقام الهواتف في حالة وجود سجل هاتف واحد على الأقل للمستخدم.

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

32
LittleBobbyTables - Au Revoir

في كل مرة يطرح فيها أحدهم هذا السؤال ، يكون الجواب: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

آمل أن تساعدك على فهم ،

13
Spredzy

صلة داخلية ترجع الصفوف التي يمكن دمجها بناءً على معايير الصلة.
An صلة خارجية ترجع هذه وجميع الصفوف ...
... من الجدول الأول لـ صلة يسارية
... من الجدول الثاني لـ صلة صحيحة
... من كلا الجدولين للانضمام الكامل

إن اختيار وقت استخدام أحدهما أو الآخر هو مسألة تحديد البيانات التي تحتاجها. على سبيل المثال ، إذا كنت بحاجة فقط إلى السجلات التي تحتوي على user_ids من الهاتف الذي يطابق معرفات المستخدم ، فاستخدم الصلة الداخلية. إذا كنت تريد أيضًا تضمين صفوف من مستخدم ليس لها إدخال هاتف مطابق ، فسيكون الصلة اليسرى مناسبة.

لمزيد من المعلومات انظر هذا السؤال على StackOverflow .

8
Leigh Riffel

إذا كان لديك جدولان مثل أدناه:

Table1 :   A1    B1          Table2  :    B2     C2 
           -     -                        -      -
           1     2                        1      1
           2     4                        2      4
           3     5                        5      2

إذا كنت تستخدم Inner Join ، فستحصل على:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2

إذا كنت تستخدم Full Outer Join ، فستحصل على:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
NULL   NULL    1       1

إذا كنت تستخدم Left Outer Join ، فستحصل على:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
7
Am1rr3zA

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

SELECT SNO , PNO 
FROM   SP 
UNION  
SELECT SNO , 'nil' AS PNO 
FROM   S 
WHERE  SNO NOT IN ( SELECT SNO FROM SP )

بدلاً من ذلك ، يمكن الحصول على نفس النتيجة باستخدام عامل الربط الخارجي لـ SQL بالتزامن مع COALESCE ، كما يلي:

SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO 
FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP

ملاحظة حول الانضمام الخارجي (4.6) في "SQL والنظرية العلائقية: كيفية كتابة كود SQL دقيق" بواسطة C.J. Date

6
onedaywhen

الصلة الداخلية هي صلة حيث تكون النتائج الوحيدة المعروضة هي النتائج حيث توجد المفاتيح في كلا الجدولين. ستعرض صلة خارجية نتائج كافة المفاتيح في جداول واحدة ، صلة يسارية من الأولى صلة صلة من الثانية. فمثلا:

لنفترض أن الجدول 1 يحتوي على المفاتيح الأساسية التالية وأزواج البيانات: (1 ، أ) ، (2 ، ب) ، (3 ، ج)

لنفترض أيضًا أن الجدول 2 يحتوي على المفتاح الأساسي التالي وأزواج البيانات: (1 ، مرح) ، (3 ، يمكن) ، (4 ، يحدث)

لذا ، ستؤدي الصلة الداخلية للجدول 1 إلى الجدول 2 على المفاتيح الأساسية إلى الحصول على ثلاثة توائم ناتجة (مع المفتاح الأساسي المشترك أولاً ، العنصر الثاني للجدول الأول والثاني للجدول الثاني ثالثًا): (1 ، أ ، مرح) ، ( 3 ، ج ، يمكن)

ستؤدي الصلة الخارجية اليسرى من الجدول 1 إلى الجدول 2 على المفاتيح الأساسية إلى الحصول على ثلاثة توائم ناتجة (نفس التنسيق أعلاه): (1 ، أ ، مرح) ، (2 ، ب ، فارغ) ، (3 ، ج ، يمكن)

ستؤدي الصلة الخارجية اليمنى للجدول 1 إلى الجدول 2 على المفاتيح الأساسية إلى الحصول على ثلاثة توائم ناتجة (نفس التنسيق أعلاه): (1 ، أ ، ممتع) ، (3 ، ج ، يمكن) ، (4 ، NULL ، يحدث)

آمل أن يفسر هذا المفهوم بشكل جيد.

5
indyK1ng

نظرًا لأنك سألت عن موعد استخدام ما ، فإليك سيناريو يحتوي على استعلامات - حدد ما تريد استخدامه وفقًا للمتطلبات.

البيانات:

مستخدمي الجدول لديهم 10 سجلات. يحتوي Table Phoneno على 6 سجلات (بعلاقة 1: 1 ، مما يعني أن الإدخال في PhoneNo سيشير إلى إدخال واحد فقط في المستخدمين ، ويمكن إدخال واحد فقط في PhoneNo أن يشير إلى إدخال معين في المستخدمين).

المتطلب 1: عرض جميع المستخدمين بأرقام هواتفهم. تجاهل المستخدمين الذين ليس لديهم رقم هاتف.

الاستعلام:

SELECT u.uid, u.name, p.phonno 
  FROM user u 
INNER JOIN phones p ON p.uid = u.uid

النتيجة: تُظهر 6 مستخدمين لديهم رقم هاتف

المتطلب 2: إظهار جميع المستخدمين برقم هاتفهم. إذا لم يكن لدى المستخدم شاشة هاتف "N/A" (غير متوفر)

الاستعلام:

SELECT u.uid, u.name, ifnull(p.phonno,'N/A') 
  FROM user u 
LEFT OUTER JOIN phones p ON p.uid = u.uid

نتيجة:

يعرض كل السجلات 10

ملاحظة: ifnull هي بنية MySql لتحويل القيمة الفارغة. لقد استخدمت هذه الوظيفة لجعل محرك db يظهر "N/A" عندما يكون phonno فارغًا. ابحث عن الوظيفة المناسبة إذا كنت تستخدم بعض DBMS أخرى. في SQL Server ، يجب عليك استخدام العبارة CASE.

آمل أن يساعد هذا.

4
AmDB

دعني أحاول أن أصفها أكثر سهولة.

يعرض الربط الداخلي المستخدمين الذين لديهم هاتف أو أكثر مع رقم (أرقام) الهاتف الخاص بهم.

يسرد الجزء الخارجي الأيسر بالإضافة إلى ذلك "المستخدمين" الذين ليس لديهم هاتف.

4
bernd_k