it-swarm.com.de

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

Ich bin neu in SQL und wollte wissen, was der Unterschied zwischen diesen beiden JOIN -Typen 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 den einen oder anderen verwenden?

35
Julien
  • Ein innerer Join wählt nur Datensätze aus, in denen sich die verbundenen Schlüssel in beiden angegebenen Tabellen befinden.
  • Ein linker äußerer Join wählt alle Datensätze aus der ersten Tabelle und alle Datensätze in der zweiten Tabelle aus, die den verbundenen Schlüsseln entsprechen.
  • Ein rechter äußerer Join 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 eine Liste von Benutzern und Telefonnummern nur zurück, wenn mindestens ein Telefoneintrag für den Benutzer vorhanden ist.

In Ihrem zweiten Beispiel geben Sie eine Liste mit allen Benutzern sowie alle Telefonaufzeichnungen zurück, sofern diese verfügbar sind (wenn sie nicht verfügbar sind, erhalten Sie NULL für das Telefon Werte).

Jedes Mal, 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 dir helfen zu verstehen,

13
Spredzy

Ein innerer Join gibt Zeilen zurück, die basierend auf den Join-Kriterien kombiniert werden können.
Ein Outer Join gibt diese und alle Zeilen zurück ...
... aus der ersten Tabelle für einen linken Join
... aus der zweiten Tabelle für einen rechten Join
... aus beiden Tabellen für einen vollständigen Join

Die Wahl, wann das eine oder das andere verwendet werden soll, hängt davon ab, welche Daten Sie benötigen. Wenn Sie in Ihrem Beispiel nur Datensätze mit Benutzer-IDs vom Telefon benötigen, die mit den IDs des Benutzers übereinstimmen, verwenden Sie den inneren Join. Wenn Sie auch Zeilen von Benutzern einschließen möchten, die keinen passenden Telefoneintrag haben, ist der linke Join angemessen.

Weitere Informationen finden Sie unter diese Frage zu StackOverflow .

8
Leigh Riffel

Wenn Sie 2 Tabellen wie unten 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
7
Am1rr3zA

Die äußere Verknüpfung ist ausdrücklich darauf ausgelegt, im Ergebnis Nullen zu erzeugen, und sollte daher im Allgemeinen vermieden werden. Relational gesehen handelt es sich um eine Art Schrotflinten-Ehe: Sie zwingt Tische zu einer Art Vereinigung - ja, ich meine Vereinigung, nicht Beitritt -, selbst wenn die fraglichen Tische nicht den üblichen Anforderungen für eine Vereinigung entsprechen. Dies geschieht in der Tat, indem eine oder beide Tabellen vor dem Zusammenführen mit Nullen aufgefüllt werden, wodurch 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 das gleiche Ergebnis erzielt werden, indem der SQL-Outer-Join-Operator in Verbindung mit COALESCE verwendet wird, 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: Schreiben von genauem SQL-Code" von C.J. Date

6
onedaywhen

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

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

Angenommen, Tabelle2 enthält die folgenden Primärschlüssel- und Datenpaare: (1, Spaß), (3, Dose), (4, passieren)

Eine innere Verknüpfung von Tabelle1 mit Tabelle2 auf den Primärschlüsseln würde also die folgenden resultierenden Tripletts ergeben (wobei der gemeinsame Primärschlüssel zuerst, das zweite Element der ersten Tabelle das zweite und das zweite Element der zweiten Tabelle das dritte Element 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 Tripletts ergeben (dasselbe Format wie oben): (1, a, Spaß), (2, b, NULL), (3, c, kann)

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

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

5
indyK1ng

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. Tabelle Phoneno enthält 6 Datensätze (mit einer 1: 1-Beziehung, was bedeutet, dass ein Eintrag in PhoneNo nur auf einen Eintrag in Users verweist und nur ein Eintrag in PhoneNo auf einen bestimmten Eintrag in Users verweisen kann).

Anforderung 1: Zeigen Sie allen Benutzern ihre Telefonnummern an. Benutzer ohne Telefonnummer ignorieren.

Abfrage:

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

Ergebnis: Zeigt 6 Benutzer mit Telefonnummer an

Anforderung 2: Zeigen Sie allen Benutzern ihre Telefonnummer an. Wenn der Benutzer keine Telefonanzeige 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 verwendet, um die DB-Engine 'N/A' anzeigen zu lassen, wenn Phonno Null ist. Suchen Sie nach einer geeigneten Funktion, wenn Sie ein anderes DBMS verwenden. In SQL Server müssen Sie die Anweisung CASE verwenden.

Ich hoffe das hilft.

4
AmDB

Lassen Sie mich versuchen, es etwas intuitiver zu beschreiben.

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

Der linke äußere Join listet zusätzlich die 'Benutzer' auf, die kein Telefon haben.

4
bernd_k