Was ist der Unterschied zwischen einem INNER JOIN und einem OUTER JOIN?

35

Ich bin neu in SQL und wollte wissen, was der Unterschied zwischen diesen beiden JOINTypen ist.

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

Wann sollte ich das eine oder andere verwenden?

Julien
quelle
6
passt das als DBA-Frage? Dies scheint mir eher eine Kodierungsfrage zu sein.
BlackICE
1
@ David Ihre Gedanken zu Meta
Sathyajith Bhat
@ David dann VtC, wenn du denkst, es ist falsch für die Website. Wir können immer wieder öffnen.
Jcolebrand
3
Ich denke, das ist eine großartige Frage und sehr passend für die Seite.
Datum
dieser Bedarf ausgezogen von DBA zu uneless ein noob DBA die DB Leistung zur Feinabstimmung gesleevt up: P
AMDB

Antworten:

32
  • Bei einer inneren Verknüpfung werden nur Datensätze ausgewählt, bei denen sich die verknüpften Schlüssel in beiden angegebenen Tabellen befinden.
  • Eine linke äußere Verknüpfung wählt alle Datensätze aus der ersten Tabelle und alle Datensätze in der zweiten Tabelle aus, die den verbundenen Schlüsseln entsprechen.
  • Eine rechte äußere Verknüpfung wählt alle Datensätze aus der zweiten Tabelle und alle Datensätze in der ersten Tabelle aus, die den verbundenen Schlüsseln entsprechen.

In Ihrem ersten Beispiel geben Sie nur dann eine Liste mit Benutzern und Telefonnummern zurück, wenn mindestens ein Telefondatensatz für den Benutzer vorhanden ist.

In Ihrem zweiten Beispiel geben Sie eine Liste aller Benutzer sowie alle Telefonaufzeichnungen zurück, sofern diese verfügbar sind (falls diese nicht verfügbar sind, erhalten Sie NULLdie Telefonwerte).

LittleBobbyTables
quelle
13

Immer wenn jemand diese Frage stellt, gibt es die Antwort: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

Hoffe, es wird Ihnen helfen zu verstehen,

Spredzy
quelle
3
Ich habe 20 Jahre lang mit Joins gearbeitet und diese Diagramme kamen mir nur verwirrend vor.
Hogan
3
Ich bin mit @ Hogan - Ven-Diagramme sind nicht die beste Erklärung dafür. Ein Raster, das zeigt, welche Kombinationen zurückgegeben werden, wäre wahrscheinlich besser.
Joe
Es zeigt sich nur, dass Sie ein Venn-Diagramm nicht verstehen. Sie beziehen sich zwar perfekt auf die Join-Typen, sie sind jedoch ein Hilfsmittel, um das Verständnis für die neuen Join-Typen zu verbessern. Wenn Sie bereits gelernt haben, sich einem anderen Konzept anzuschließen, ist es für Sie mit Sicherheit ungewohnt. Das ist kein Problem, aber auch kein guter Indikator für die Nützlichkeit der Diagramme.
James Ryan
@ Jamesryan, das ist nicht wahr, sie sind nicht perfekt miteinander verbunden, Verknüpfungen sind mit dem kartesischen Produkt von Mengen verwandt, nicht Schnittmenge und Vereinigung. Das Venn-Diagramm-Analog funktioniert nur, wenn Sie über eindeutige Schlüssel verbinden. Wenn Sie doppelte Schlüssel haben, verlieren Sie der kartesische Produktaspekt.
Wird
1
Ich stimme überhaupt nicht zu, venn Diagramme haben bereits eine sehr genau definierte Interpretation, Schnittmenge und Vereinigung. Joins passen nicht zu dieser Interpretation, wenn Sie sich über nicht eindeutige Schlüssel verbinden. Ich denke du interpretierst venn diagramme zu weit.
Wird
8

Ein innerer Join gibt Zeilen zurück, die basierend auf den Join-Kriterien kombiniert werden können.
Eine äußere Verknüpfung gibt diese und alle Zeilen zurück ...
   ... aus der ersten Tabelle für eine linke Verknüpfung
   ... aus der zweiten Tabelle für eine rechte Verknüpfung
   ... aus beiden Tabellen für eine vollständige Verknüpfung

Bei der Auswahl des Zeitpunkts für die Verwendung der einen oder anderen Option müssen Sie festlegen, welche Daten Sie benötigen. Wenn Sie für Ihr Beispiel nur Datensätze mit user_ids vom Telefon benötigen, die mit den IDs im Benutzer übereinstimmen, verwenden Sie den inneren Join. Wenn Sie auch Zeilen von Benutzern einschließen möchten, für die kein passender Telefoneintrag vorhanden ist, ist der linke Join geeignet.

Weitere Informationen finden Sie in dieser Frage zu StackOverflow .

Leigh Riffel
quelle
7

Wenn Sie 2 Tabellen wie folgt haben:

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

Wenn Sie Inner Join verwenden, erhalten Sie:

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

Wenn Sie Full Outer Join verwenden, erhalten Sie:

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

Wenn Sie Left Outer Join verwenden, erhalten Sie:

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

Outer Join ist ausdrücklich dazu gedacht, in seinem Ergebnis Nullen zu erzeugen und sollte daher generell vermieden werden. Relativ gesehen ist es eine Art Flintenheirat: Sie zwingt Tische zu einer Art Vereinigung - ja, ich meine Vereinigung, nicht beizutreten -, auch wenn die fraglichen Tische nicht den üblichen Vereinigungsanforderungen entsprechen. Dies geschieht in der Tat, indem eine oder beide Tabellen vor der Vereinigung mit Nullen aufgefüllt werden, damit sie schließlich den üblichen Anforderungen entsprechen. Es gibt jedoch keinen Grund, warum das Auffüllen nicht mit richtigen Werten anstelle von Nullen erfolgen sollte, wie in diesem Beispiel:

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

Alternativ könnte dasselbe Ergebnis erzielt werden, wenn der SQL-Outer-Join-Operator in Verbindung mit verwendet wird COALESCE, wie hier:

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

Eine Bemerkung zu Outer Join (4.6) in "SQL und relationale Theorie: Wie man genauen SQL-Code schreibt" von CJ Date

eines Tages, wenn
quelle
5

Ein innerer Join ist ein Join, bei dem nur Ergebnisse angezeigt werden, bei denen sich die Schlüssel in beiden Tabellen befinden. Eine äußere Verknüpfung zeigt die Ergebnisse für alle Schlüssel in einer Tabelle an, eine linke Verknüpfung von der ersten und eine rechte Verknüpfung von der zweiten. Beispielsweise:

Angenommen, table1 hat die folgenden Primärschlüssel- und Datenpaare: (1, a), (2, b), (3, c)

Angenommen, table2 hat die folgenden Primärschlüssel- und Datenpaare: (1, fun), (3, can), (4, happen)

Ein innerer Join von table1 mit table2 auf den Primärschlüsseln würde also die folgenden resultierenden Triplets ergeben (wobei der gemeinsame Primärschlüssel zuerst das zweite Element der ersten Tabelle und das zweite Element der zweiten Tabelle das dritte ist): (1, a, fun), ( 3, c, can)

Eine linke äußere Verknüpfung von Tabelle1 mit Tabelle2 auf den Primärschlüsseln würde die folgenden resultierenden Triplets ergeben (dasselbe Format wie oben): (1, a, fun), (2, b, NULL), (3, c, can)

Eine rechte äußere Verknüpfung von Tabelle1 mit Tabelle2 auf den Primärschlüsseln würde die folgenden resultierenden Triplets ergeben (dasselbe Format wie oben): (1, a, fun), (3, c, can), (4, NULL, happen)

Ich hoffe das erklärt das Konzept anständig gut.

indyK1ng
quelle
4

Lassen Sie mich versuchen, es etwas intuitiver zu beschreiben.

Die innere Verknüpfung zeigt die Benutzer, die ein oder mehrere Telefonnummern zusammen mit ihren Telefonnummern haben.

Die linke äußere Verknüpfung listet zusätzlich die 'Benutzer' auf, die kein Telefon haben.

bernd_k
quelle
4

Da Sie gefragt haben, wann was verwendet werden soll, finden Sie hier ein Szenario mit Abfragen. Wählen Sie je nach Anforderung aus, welches verwendet werden soll.

Daten:

Tabellenbenutzer hat 10 Datensätze. Die Tabelle Phoneno enthält 6 Datensätze (mit einer 1: 1-Beziehung, dh, ein Eintrag in PhoneNo verweist nur auf einen Eintrag in Users, und nur ein Eintrag in PhoneNo kann auf einen bestimmten Eintrag in Users verweisen).

Anforderung 1: Alle Benutzer mit ihren Telefonnummern anzeigen. Ignorieren Sie Benutzer ohne Telefonnummer.

Abfrage:

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

Ergebnis: Zeigt 6 Benutzer an, die eine Telefonnummer haben

Anforderung 2: Alle Benutzer mit ihrer Telefonnummer anzeigen. Wenn der Benutzer kein Telefondisplay hat 'N / A' (nicht verfügbar)

Abfrage:

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

Ergebnis:

Zeigt alle 10 Datensätze an

Hinweis: ifnull ist eine MySql-Syntax zum Transformieren des Nullwerts. Ich habe diese Funktion benutzt, um die DB Engine auf 'N / A' zu setzen, wenn phonno null ist. Suchen Sie nach einer geeigneten Funktion, wenn Sie ein anderes DBMS verwenden. In SQL Server müssen Sie die CASEAnweisung verwenden.

Ich hoffe das hilft.

AmDB
quelle