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?
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,
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 .
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
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
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.
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.
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.