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 das eine oder andere verwenden?
Antworten:
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
NULL
die Telefonwerte).quelle
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,
quelle
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 .
quelle
Wenn Sie 2 Tabellen wie folgt haben:
Wenn Sie Inner Join verwenden, erhalten Sie:
Wenn Sie Full Outer Join verwenden, erhalten Sie:
Wenn Sie Left Outer Join verwenden, erhalten Sie:
quelle
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:
Alternativ könnte dasselbe Ergebnis erzielt werden, wenn der SQL-Outer-Join-Operator in Verbindung mit verwendet wird
COALESCE
, wie hier:Eine Bemerkung zu Outer Join (4.6) in "SQL und relationale Theorie: Wie man genauen SQL-Code schreibt" von CJ Date
quelle
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.
quelle
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.
quelle
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:
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:
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
CASE
Anweisung verwenden.Ich hoffe das hilft.
quelle