Auch , wie zu tun LEFT JOIN
, RIGHT JOIN
und FULL JOIN
passen?
sql
database
join
inner-join
outer-join
Chris de Vries
quelle
quelle
Antworten:
Angenommen, Sie verbinden Spalten ohne Duplikate. Dies ist ein sehr häufiger Fall:
Eine innere Verbindung von A und B ergibt das Ergebnis von A-Schnittpunkt B, dh dem inneren Teil eines Venn-Diagrammschnittpunkts .
Eine äußere Verbindung von A und B ergibt die Ergebnisse der A-Vereinigung B, dh der äußeren Teile einer Venn-Diagramm-Vereinigung.
Beispiele
Angenommen, Sie haben zwei Tabellen mit jeweils einer Spalte und Daten wie folgt:
Es ist zu beachten, dass (1,2) für A eindeutig sind, (3,4) gemeinsam sind und (5,6) für B eindeutig sind.
Innere Verbindung
Ein innerer Join, der eine der entsprechenden Abfragen verwendet, gibt den Schnittpunkt der beiden Tabellen an, dh der beiden Zeilen, die sie gemeinsam haben.
Linke äußere Verbindung
Eine linke äußere Verknüpfung gibt alle Zeilen in A sowie alle gemeinsamen Zeilen in B an.
Rechte äußere Verbindung
Eine rechte äußere Verknüpfung gibt alle Zeilen in B sowie alle gemeinsamen Zeilen in A an.
Vollständige äußere Verbindung
Eine vollständige äußere Verknüpfung gibt Ihnen die Vereinigung von A und B, dh alle Zeilen in A und alle Zeilen in B. Wenn etwas in A kein entsprechendes Datum in B hat, ist der B-Teil null und umgekehrt umgekehrt.
quelle
Die Venn-Diagramme machen das nicht wirklich für mich.
Sie zeigen beispielsweise keine Unterscheidung zwischen einer Kreuzverknüpfung und einer inneren Verknüpfung oder zeigen im Allgemeinen eine Unterscheidung zwischen verschiedenen Arten von Verknüpfungsprädikaten oder bieten einen Rahmen für Überlegungen zu ihrer Funktionsweise.
Es gibt keinen Ersatz für das Verständnis der logischen Verarbeitung und es ist sowieso relativ einfach zu verstehen.
on
Klausel anhand aller Zeilen aus Schritt 1, wobei diejenigen beibehalten werden, für die das Prädikat eine Bewertung ergibttrue
(Hinweis: In der Praxis findet der Abfrageoptimierer möglicherweise effizientere Möglichkeiten zur Ausführung der Abfrage als die oben beschriebene rein logische Beschreibung, aber das Endergebnis muss dasselbe sein.)
Ich beginne mit einer animierten Version eines vollständigen äußeren Joins . Weitere Erklärungen folgen.
Erläuterung
Quelltabellen
Beginnen Sie zunächst mit einem
CROSS JOIN
(AKA Cartesian Product). Dies hat keineON
Klausel und gibt einfach jede Kombination von Zeilen aus den beiden Tabellen zurück.WÄHLEN SIE A.Farbe, B.Farbe AUS EINEM KREUZVERBINDUNG B.
Innere und äußere Verknüpfungen haben ein Prädikat der "ON" -Klausel.
Einige Beispiele
WÄHLEN SIE A.Farbe, B.Farbe AUS EINER INNENVERBINDUNG B AUF A.Farbe = B.Farbe
Das Obige ist der klassische Equi Join.
Animierte Version
WÄHLEN SIE A.Farbe, B.Farbe AUS EINER INNENVERBINDUNG B AUF A.Farbe NICHT IN ('Grün', 'Blau')
Die innere Verknüpfungsbedingung muss nicht unbedingt eine Gleichheitsbedingung sein und es müssen keine Referenzspalten aus beiden (oder sogar einer) der Tabellen vorhanden sein. Die Auswertung
A.Colour NOT IN ('Green','Blue')
in jeder Zeile der Kreuzverknüpfung wird zurückgegeben.SELECT A.Colour, B.Colour FROM A INNER JOIN B ON 1 = 1
Die Join-Bedingung wird für alle Zeilen im Cross-Join-Ergebnis als true ausgewertet. Dies entspricht also genau einem Cross-Join. Ich werde das Bild der 16 Zeilen nicht noch einmal wiederholen.
WÄHLEN SIE A.Farbe, B.Farbe AUS EINER LINKEN AUSSENVERBINDUNG B AUF A.Farbe = B.Farbe
Äußere Verknüpfungen werden logisch auf die gleiche Weise ausgewertet wie innere Verknüpfungen, außer dass eine Zeile aus der linken Tabelle (für eine linke Verknüpfung) überhaupt nicht mit Zeilen aus der rechten Tabelle verknüpft wird und im Ergebnis mit
NULL
Werten für die Tabelle beibehalten wird rechte Spalte.WÄHLEN SIE A.Farbe, B.Farbe AUS EINER LINKEN AUSSENVERBINDUNG B AUF A.Farbe = B.Farbe WO B.Farbe NULL IST
Dies schränkt das vorherige Ergebnis einfach so ein, dass nur die Zeilen zurückgegeben werden, in denen
B.Colour IS NULL
. In diesem speziellen Fall sind dies die Zeilen, die beibehalten wurden, da sie in der rechten Tabelle nicht übereinstimmten und die Abfrage die einzelne rote Zeile zurückgibt, die in der Tabelle nicht übereinstimmtB
. Dies ist als Anti-Semi-Join bekannt.Es ist wichtig, eine Spalte für den
IS NULL
Test auszuwählen , die entweder nicht nullwertfähig ist oder für die die Verknüpfungsbedingung sicherstellt, dass alleNULL
Werte ausgeschlossen werden, damit dieses Muster ordnungsgemäß funktioniert, und zu vermeiden, dass nur Zeilen zurückgebracht werden, die zufällig einenNULL
Wert dafür haben Spalte zusätzlich zu den nicht übereinstimmenden Zeilen.WÄHLEN SIE A.Farbe, B.Farbe AUS EINER RECHTEN AUSSENVERBINDUNG B AUF A.Farbe = B.Farbe
Rechte äußere Verknüpfungen verhalten sich ähnlich wie linke äußere Verknüpfungen, außer dass nicht übereinstimmende Zeilen aus der rechten Tabelle beibehalten werden und null die linken Spalten erweitern.
WÄHLEN SIE A.Farbe, B.Farbe AUS EINER VOLLSTÄNDIGEN AUSSENVERBINDUNG B AUF A.Farbe = B.Farbe
Vollständige äußere Verknüpfungen kombinieren das Verhalten von linken und rechten Verknüpfungen und behalten die nicht übereinstimmenden Zeilen sowohl aus der linken als auch aus der rechten Tabelle bei.
SELECT A.Colour, B.Colour FROM A FULL OUTER JOIN B ON 1 = 0
Keine Zeilen in der Kreuzverknüpfung stimmen mit dem
1=0
Prädikat überein . Alle Zeilen von beiden Seiten werden unter Verwendung normaler Outer-Join-Regeln mit NULL in den Spalten der Tabelle auf der anderen Seite beibehalten.WÄHLEN SIE COALESCE (A.Colour, B.Colour) ALS Farbe AUS EINER VOLLSTÄNDIGEN AUSSENVERBINDUNG B ON 1 = 0
Mit einer geringfügigen Änderung der vorhergehenden Abfrage könnte man eine
UNION ALL
der beiden Tabellen simulieren .WÄHLEN SIE A.Farbe, B.Farbe AUS EINER LINKEN AUSSENVERBINDUNG B AUF A.Farbe = B.Farbe WO B.Farbe = 'Grün'
Beachten Sie, dass die
WHERE
Klausel (falls vorhanden) nach dem Join logisch ausgeführt wird. Ein häufiger Fehler besteht darin, einen linken äußeren Join auszuführen und dann eine WHERE-Klausel mit einer Bedingung in der rechten Tabelle einzufügen, die letztendlich die nicht übereinstimmenden Zeilen ausschließt. Das Obige führt am Ende die äußere Verbindung aus ...... und dann läuft die "Where" -Klausel.
NULL= 'Green'
wird nicht als wahr ausgewertet, sodass die durch die äußere Verknüpfung erhaltene Zeile verworfen wird (zusammen mit der blauen) und die Verknüpfung effektiv wieder in eine innere konvertiert.Wenn beabsichtigt wäre, nur Zeilen von B einzuschließen, wobei Farbe grün ist, und alle Zeilen von A unabhängig von der korrekten Syntax
WÄHLEN SIE A.Farbe, B.Farbe AUS EINER LINKEN AUSSENVERBINDUNG B AUF A.Farbe = B.Farbe UND B.Farbe = 'Grün'
SQL Fiddle
Sehen Sie sich diese Beispiele live auf SQLFiddle.com an .
quelle
Joins werden verwendet, um die Daten aus zwei Tabellen zu kombinieren. Das Ergebnis ist eine neue temporäre Tabelle. Verknüpfungen werden basierend auf einem sogenannten Prädikat ausgeführt, das die Bedingung angibt, die zum Ausführen einer Verknüpfung verwendet werden soll. Der Unterschied zwischen einem inneren und einem äußeren Join besteht darin, dass ein innerer Join nur die Zeilen zurückgibt, die basierend auf dem Join-Prädikat tatsächlich übereinstimmen. Betrachten wir zum Beispiel die Mitarbeiter- und Standorttabelle:
Innerer Join: - Innerer Join erstellt eine neue Ergebnistabelle, indem Spaltenwerte von zwei Tabellen ( Mitarbeiter und Standort ) basierend auf dem Join-Prädikatkombiniert werden. Die Abfrage vergleicht jede Zeile des Mitarbeiters mit jeder Zeile des Standorts , um alle Zeilenpaare zu finden, die das Join-Prädikat erfüllen. Wenn das Join-Prädikat durch Abgleichen von Nicht-NULL-Werten erfüllt ist, werden die Spaltenwerte für jedes übereinstimmende Zeilenpaar von Mitarbeiter und Standort zu einer Ergebniszeile zusammengefasst. So sieht die SQL für einen inneren Join aus:
Hier ist das Ergebnis der Ausführung von SQL:
Äußere Verknüpfung : - Für eine äußere Verknüpfung muss nicht für jeden Datensatz in den beiden verknüpften Tabellen ein übereinstimmender Datensatz vorhanden sein. Die verknüpfte Tabelle behält jeden Datensatz bei - auch wenn kein anderer übereinstimmender Datensatz vorhanden ist. Äußere Verknüpfungen unterteilen sich weiter in linke äußere Verknüpfungen und rechte äußere Verknüpfungen, je nachdem, welche Tabellenzeilen beibehalten werden (links oder rechts).
Linke äußere Verknüpfung : - Das Ergebnis einer linken äußeren Verknüpfung (oder einfach einer linken Verknüpfung) für Tabellen Mitarbeiter und Standort enthält immer alle Datensätze der "linken" Tabelle ( Mitarbeiter ), auch wenn die Verknüpfungsbedingung keinen passenden Datensatz in findet die "richtige" Tabelle ( Ort ). So würde die SQL für einen linken äußeren Join anhand der obigen Tabellen aussehen:
So würde das Ergebnis der Ausführung dieser SQL aussehen:
Rechte äußere Verbindung: - Eine rechte äußere Verbindung (oder rechte Verbindung) ähnelt stark einer linken äußeren Verbindung, außer dass die Behandlung der Tabellen umgekehrt ist. Jede Zeile aus der "rechten" Tabelle ( Position ) wird mindestens einmal in der verknüpften Tabelle angezeigt. Wenn keine entsprechende Zeile aus der „linken“ Tabelle ( Mitarbeiter ) vorhanden, NULL in Spalten von erscheinen Mitarbeiter für die Datensätzedie keine Übereinstimmung in haben Location . So sieht SQL aus:
Anhand der obigen Tabellen können wir zeigen, wie die Ergebnismenge eines rechten äußeren Joins aussehen würde:
Vollständige äußere Verknüpfungen: - Bei vollständiger äußerer Verknüpfung oder vollständiger Verknüpfung werden die nicht übereinstimmenden Informationen beibehalten, indem nicht übereinstimmende Zeilen in die Ergebnisse einer Verknüpfung aufgenommen werden. Verwenden Sie eine vollständige äußere Verknüpfung. Es enthält alle Zeilen aus beiden Tabellen, unabhängig davon, ob die andere Tabelle einen übereinstimmenden Wert hat oder nicht.
Bildquelle
MySQL 8.0 Referenzhandbuch - Join-Syntax
Oracle Join-Vorgänge
quelle
Inner Join
Rufen Sie nur die übereinstimmenden Zeilen ab
A intersect B
.Linke äußere Verbindung
Wählen Sie alle Datensätze aus der ersten Tabelle und alle Datensätze in der zweiten Tabelle aus, die den verknüpften Schlüsseln entsprechen.
Volle äußere Verbindung
Wählen Sie alle Datensätze aus der zweiten Tabelle und alle Datensätze in der ersten Tabelle aus, die den verknüpften Schlüsseln entsprechen.
Verweise
Innere und äußere Verknüpfungen SQL-Beispiele und der Verknüpfungsblock
SQL: JOINS
quelle
In einfachen Worten:
Ein innerer Join ruft nur die übereinstimmenden Zeilen ab.
Während ein Outer Join die übereinstimmenden Zeilen aus einer Tabelle und allen Zeilen in einer anderen Tabelle abruft, hängt das Ergebnis davon ab, welche Sie verwenden:
Links : Übereinstimmende Zeilen in der rechten Tabelle und alle Zeilen in der linken Tabelle
Rechts : Übereinstimmende Zeilen in der linken Tabelle und alle Zeilen in der rechten Tabelle oder
Voll : Alle Zeilen in allen Tabellen. Es spielt keine Rolle, ob es eine Übereinstimmung gibt oder nicht
quelle
Ein innerer Join zeigt nur Zeilen an, wenn sich auf der anderen (rechten) Seite des Joins ein übereinstimmender Datensatz befindet.
Ein (linker) äußerer Join zeigt Zeilen für jeden Datensatz auf der linken Seite an, auch wenn auf der anderen (rechten) Seite des Joins keine übereinstimmenden Zeilen vorhanden sind. Wenn keine übereinstimmende Zeile vorhanden ist, werden in den Spalten für die andere (rechte) Seite NULL-Werte angezeigt.
quelle
Für innere Verknüpfungen muss ein Datensatz mit einer zugehörigen ID in der verknüpften Tabelle vorhanden sein.
Äußere Verknüpfungen geben Datensätze für die linke Seite zurück, auch wenn für die rechte Seite nichts vorhanden ist.
Sie haben beispielsweise eine Orders- und eine OrderDetails-Tabelle. Sie sind durch eine "OrderID" verbunden.
Aufträge
Bestelldetails
Die Anfrage
gibt nur Bestellungen zurück, die auch etwas in der OrderDetails-Tabelle enthalten.
Wenn Sie es auf OUTER LEFT JOIN ändern
Dann werden Datensätze aus der Orders-Tabelle zurückgegeben, auch wenn sie keine OrderDetails-Datensätze haben.
Sie können dies verwenden, um Bestellungen zu finden, die keine OrderDetails enthalten, die auf eine mögliche verwaiste Bestellung hinweisen, indem Sie eine where-Klausel wie hinzufügen
WHERE OrderDetails.OrderID IS NULL
.quelle
SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c, categories_description cd WHERE c.id = cd.categories_id AND c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
zuSELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c INNER JOIN categories_description cd ON c.id = cd.categories_id WHERE c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
(MySQL) mit Erfolg. Ich war mir nicht sicher über die zusätzlichen Bedingungen, sie mischen sich gut ...In einfachen Worten:
Innerer Join -> NUR allgemeine Datensätze aus übergeordneten und untergeordneten Tabellen übernehmen, wobei der Primärschlüssel der übergeordneten Tabelle mit dem Fremdschlüssel in der untergeordneten Tabelle übereinstimmt.
Links verbinden ->
Pseudocode
Rechter Join : Genau entgegengesetzt zum linken Join. Geben Sie den Namen der Tabelle in LEFT JOIN rechts in Right Join ein. Sie erhalten dieselbe Ausgabe wie LEFT JOIN.
Äußere Verknüpfung : Alle Datensätze in beiden Tabellen anzeigen
No matter what
. Wenn die Datensätze in der linken Tabelle nicht mit der rechten Tabelle basierend auf dem Primärschlüssel, dem Forieign-Schlüssel, übereinstimmen, verwenden Sie den NULL-Wert als Ergebnis der Verknüpfung.Beispiel:
Nehmen wir jetzt für 2 Tabellen an
1.employees , 2.phone_numbers_employees
Hier ist die Mitarbeitertabelle die Mastertabelle, phone_numbers_employees die untergeordnete Tabelle (sie enthält
emp_id
als Fremdschlüssel , der die untergeordnete Tabelle verbindetemployee.id
).Innere Verbindungen
Nehmen Sie die Datensätze von 2 Tabellen NUR, WENN der Primärschlüssel der Mitarbeitertabelle (seine ID) mit dem Fremdschlüssel der untergeordneten Tabelle phone_numbers_employees (emp_id) übereinstimmt. .
Abfrage wäre also:
Nehmen Sie hier nur übereinstimmende Zeilen auf Primärschlüssel = Fremdschlüssel, wie oben erläutert. Hier werden nicht übereinstimmende Zeilen auf Primärschlüssel = Fremdschlüssel als Ergebnis der Verknüpfung übersprungen.
Links verbindet :
Der linke Join behält alle Zeilen der linken Tabelle bei, unabhängig davon, ob eine Zeile in der rechten Tabelle übereinstimmt.
Äußere Verbindungen :
Diagrammatisch sieht es so aus:
quelle
Sie nutzen
INNER JOIN
geben alle Zeilen aus beiden Tabellen zurück, in denen eine Übereinstimmung vorliegt. dh In der resultierenden Tabelle haben alle Zeilen und Spalten Werte.In
OUTER JOIN
der resultierenden Tabelle können leere Spalten enthalten sein. Äußere Verknüpfung kann entwederLEFT
oder seinRIGHT
.LEFT OUTER JOIN
Gibt alle Zeilen aus der ersten Tabelle zurück, auch wenn die zweite Tabelle keine Übereinstimmungen enthält.RIGHT OUTER JOIN
Gibt alle Zeilen aus der zweiten Tabelle zurück, auch wenn die erste Tabelle keine Übereinstimmungen enthält.quelle
Dies ist eine gute schematische Erklärung für alle Arten von Verknüpfungen
Quelle: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
quelle
INNER JOIN
erfordert, dass der Vergleich der beiden Tabellen mindestens übereinstimmt. Zum Beispiel Tabelle A und Tabelle B, die A ٨ B (A Schnittpunkt B) implizieren.LEFT OUTER JOIN
undLEFT JOIN
sind die gleichen. Es gibt alle übereinstimmenden Datensätze in beiden Tabellen und alle Möglichkeiten der linken Tabelle.Ähnlich
RIGHT OUTER JOIN
undRIGHT JOIN
sind gleich. Es gibt alle übereinstimmenden Datensätze in beiden Tabellen und alle Möglichkeiten der richtigen Tabelle.FULL JOIN
ist die Kombination vonLEFT OUTER JOIN
undRIGHT OUTER JOIN
ohne Vervielfältigung.quelle
Die Antwort liegt in der Bedeutung jedes Einzelnen, also in den Ergebnissen.
Meine Antwort basiert auf dem obigen Hinweis .
Wenn Sie zwei Tabellen wie diese haben:
CROSS JOIN / OUTER JOIN:
Sie können alle diese Tabellendaten mit
CROSS JOIN
oder einfach,
so haben:INNER JOIN:
Wenn Sie den obigen Ergebnissen einen Filter hinzufügen möchten, der auf einer Beziehung basiert, wie
table1.id = table2.id
Sie sie verwenden könnenINNER JOIN
:LEFT [OUTER] JOIN:
Wenn Sie alle Zeilen einer Tabelle im obigen Ergebnis mit derselben Beziehung haben möchten, können Sie Folgendes verwenden
LEFT JOIN
:(Für RIGHT JOIN ändern Sie einfach die Position der Tabellen.)
FULL OUTER JOIN:
Wenn Sie auch alle Zeilen der anderen Tabelle in Ihren Ergebnissen haben möchten, können Sie Folgendes verwenden
FULL OUTER JOIN
:Nun, je nach Bedarf wählen Sie jeden aus, der Ihren Bedarf abdeckt;).
quelle
full outer join
in MySQL auch keine gibt.Innere Verbindung.
Ein Join kombiniert die Zeilen aus zwei Tabellen. Ein innerer Join versucht, die beiden Tabellen anhand der in der Abfrage angegebenen Kriterien abzugleichen, und gibt nur die übereinstimmenden Zeilen zurück. Wenn eine Zeile aus der ersten Tabelle im Join mit zwei Zeilen in der zweiten Tabelle übereinstimmt, werden in den Ergebnissen zwei Zeilen zurückgegeben. Wenn die erste Tabelle eine Zeile enthält, die nicht mit der zweiten Zeile übereinstimmt, wird sie nicht zurückgegeben. Wenn die zweite Tabelle eine Zeile enthält, die nicht mit der ersten übereinstimmt, wird sie nicht zurückgegeben.
Äußere Verbindung.
Ein linker Join versucht, eine Übereinstimmung der Zeilen aus der ersten Tabelle mit den Zeilen in der zweiten Tabelle zu finden. Wenn keine Übereinstimmung gefunden werden kann, werden die Spalten aus der ersten Tabelle zurückgegeben und die Spalten aus der zweiten Tabelle leer gelassen (null).
quelle
INNER JOIN
typischster Join für zwei oder mehr Tabellen. Es gibt eine Datenübereinstimmung sowohl für die Tabelle ON als auch für die Fremdschlüsselbeziehung zurück.OUTER JOIN
ist dasselbe wieINNER JOIN
, enthält jedoch auchNULL
Daten zu ResultSet.LEFT JOIN
=INNER JOIN
+ Nicht übereinstimmende Daten der linken Tabelle mitNull
Übereinstimmung auf der rechten Tabelle.RIGHT JOIN
=INNER JOIN
+ Nicht übereinstimmende Daten der rechten Tabelle mitNull
Übereinstimmung auf der linken Tabelle.FULL JOIN
=INNER JOIN
+ Nicht übereinstimmende Daten in der rechten und linken Tabelle mitNull
Übereinstimmungen.INNER JOIN
und könnenOUTER JOIN
wir Self-Join-Abfragen schreiben.Zum Beispiel:
quelle
In den anderen Antworten sehe ich nicht viele Details zu Leistung und Optimierer.
Manchmal ist es gut, das nur zu wissen
INNER JOIN
assoziativ ist, was bedeutet, dass der Optimierer die meisten Optionen hat, um damit zu spielen. Es kann die Verknüpfungsreihenfolge neu anordnen, um sie schneller zu machen und das gleiche Ergebnis zu erzielen. Der Optimierer kann die meisten Verknüpfungsmodi verwenden.Im Allgemeinen ist es eine gute Praxis, zu versuchen,
INNER JOIN
anstelle der verschiedenen Arten von Verknüpfungen zu verwenden. (Natürlich, wenn es möglich ist, die erwartete Ergebnismenge zu berücksichtigen.)Hier gibt es einige gute Beispiele und Erklärungen zu diesem seltsamen assoziativen Verhalten:
quelle
INNER JOIN
ist es langsamer alsLEFT JOIN
in den meisten Fällen, und die Leute können es verwenden,LEFT JOIN
anstatt einINNER JOIN
hinzuzufügen,WHERE
um unerwarteteNULL
Ergebnisse zu entfernen ;).INNER
ist langsamer?Nachdem ich das beliebte rot schattierte Venn-Diagramm kritisiert hatte, fand ich es nur fair, meinen eigenen Versuch zu veröffentlichen.
Obwohl die Antwort von @Martin Smith bei weitem die beste dieser Gruppe ist, zeigt seine nur die Schlüsselspalte aus jeder Tabelle, während ich denke, dass im Idealfall auch Nicht-Schlüsselspalten angezeigt werden sollten.
Das Beste, was ich in der erlaubten halben Stunde tun konnte, ist meiner Meinung nach immer noch nicht ausreichend, um zu zeigen, dass die Nullen vorhanden sind, weil keine Schlüsselwerte vorhanden sind
TableB
oder dassOUTER JOIN
es sich eher um eine Union als um einen Join handelt:quelle
TableA a LEFT OUTER JOIN TableB b
mitTableB B RIGHT OUTER JOIN TableA a
Der genaue Algorithmus
INNER JOIN
,LEFT/RIGHT OUTER JOIN
sind wie folgt:a
(a, b[i])
ON ...
Klausel für jedes Paar:ON( a, b[i] ) = true/false?
true
, geben Sie diese kombinierte Zeile zurück(a, b[i])
.Outer Join
geben Sie ein (virtuelles) Paar zurück, dasNull
für alle Spalten einer anderen Tabelle verwendet wird:(a, Null)
für die linke äußere Verknüpfung oder(Null, b)
für die rechte äußere Verknüpfung. Dies soll sicherstellen, dass alle Zeilen der ersten Tabelle in den Endergebnissen vorhanden sind.Hinweis: Die in
ON
Klausel angegebene Bedingung kann eine beliebige sein. Es ist nicht erforderlich, Primärschlüssel zu verwenden (und Sie müssen nicht immer auf Spalten aus beiden Tabellen verweisen). Zum Beispiel:... ON T1.title = T2.title AND T1.version < T2.version
(=> siehe diesen Beitrag als Beispiel für die Verwendung: Wählen Sie nur Zeilen mit maximalem Wert in einer Spalte aus. )... ON T1.y IS NULL
... ON 1 = 0
(nur als Probe)Hinweis: Left Join = Left Outer Join, Right Join = Right Outer Join.
quelle
Einfachste Definitionen
Inner Join: Gibt übereinstimmende Datensätze zurück aus beiden Tabellen zurück.
Full Outer Join: Rückkehr abgestimmt und unerreichte Datensätze aus beiden Tabellen mit null für nicht angepasste Datensätze aus beiden Tabellen .
Left Outer Join: Gibt übereinstimmende und nicht übereinstimmende Datensätze nur aus der Tabelle auf der linken Seite zurück .
Right Outer Join: Gibt übereinstimmende und nicht übereinstimmende Datensätze nur aus der Tabelle auf der rechten Seite zurück .
Zusamenfassend
Matched + Left Unmatched + Right Unmatched = Full Outer Join
Matched + Left Unmatched = Left Outer Join
Matched + Right Unmatched = Right Outer Join
Matched = Inner Join
quelle
In einfachen Worten,
1. INNER JOIN ODER EQUI JOIN: Gibt die Ergebnismenge zurück, die nur der Bedingung in beiden Tabellen entspricht.
2. OUTER JOIN: Gibt die Ergebnismenge aller Werte aus beiden Tabellen zurück, auch wenn eine Bedingungsübereinstimmung vorliegt oder nicht.
3. LEFT JOIN: Gibt die Ergebnismenge aller Werte aus der linken Tabelle und nur der Zeilen zurück, die der Bedingung in der rechten Tabelle entsprechen.
4. RIGHT JOIN: Gibt die Ergebnismenge aller Werte aus der rechten Tabelle und nur der Zeilen zurück, die der Bedingung in der linken Tabelle entsprechen.
5. FULL JOIN: Full Join und Full Outer Join sind gleich.
quelle
Es gibt hauptsächlich zwei Arten von JOINs in SQL: [INNER und OUTER]
Beispiele
Angenommen, Sie haben zwei Tabellen mit jeweils einer Spalte und Daten wie folgt:
Beachten Sie, dass (1,2,7,8) nur für A gelten, (3,4) häufig sind und (5,6) nur für B gelten.
Das Schlüsselwort INNER JOIN wählt alle Zeilen aus beiden Tabellen aus, solange die Bedingung erfüllt ist. Dieses Schlüsselwort erstellt die Ergebnismenge, indem alle Zeilen aus beiden Tabellen kombiniert werden, in denen die Bedingung erfüllt ist, dh der Wert des gemeinsamen Felds ist der gleiche.
Ergebnis:
Dieser Join gibt alle Zeilen der Tabelle auf der linken Seite des Joins und übereinstimmende Zeilen für die Tabelle auf der rechten Seite des Joins zurück. Die Zeilen, für die es auf der rechten Seite keine übereinstimmende Zeile gibt, enthält die Ergebnismenge null. LEFT JOIN ist auch bekannt als
LEFT OUTER JOIN
.Ergebnis:
Ergebnis:
VOLL (AUSSEN) BEITRETEN :
FULL JOIN erstellt die Ergebnismenge, indem das Ergebnis von LEFT JOIN und RIGHT JOIN kombiniert wird. Die Ergebnismenge enthält alle Zeilen aus beiden Tabellen. Die Zeilen, für die es keine Übereinstimmung gibt, enthält die Ergebnismenge NULL-Werte.
Ergebnis:
quelle
Innerer Join - Ein innerer Join , der eine der entsprechenden Abfragen verwendet, gibt den Schnittpunkt der beiden Tabellen an , dh der beiden Zeilen, die sie gemeinsam haben.
Linke äußere Verknüpfung - Eine linke äußere Verknüpfung gibt alle Zeilen in A sowie alle gemeinsamen Zeilen in B an.
Vollständige äußere Verknüpfung - Eine vollständige äußere Verknüpfung gibt Ihnen die Vereinigung von A und B, dh alle Zeilen in A und alle Zeilen in B. Wenn etwas in A kein entsprechendes Datum in B hat, ist der B-Teil null und umgekehrt
quelle
Join is not an intersection unless the tables have the same columns
Nein. Sie können beliebige Spalten verknüpfen. Wenn der Wert übereinstimmt, werden sie zusammengefügt.1. Inner Join: Wird auch als Join bezeichnet. Es gibt nur dann die Zeilen zurück, die sowohl in der linken als auch in der rechten Tabelle vorhanden sind, wenn eine Übereinstimmung vorliegt . Andernfalls werden keine Datensätze zurückgegeben.
Beispiel:
2. Full Outer Join: Wird auch als Full Join bezeichnet. Es werden alle Zeilen zurückgegeben die sowohl in der linken als auch in der rechten Tabelle vorhanden sind.
Beispiel:
3. Linke äußere Verbindung: Oder einfach als Left Join bezeichnet. Es werden alle in der linken Tabelle vorhandenen Zeilen und übereinstimmende Zeilen aus der rechten Tabelle (falls vorhanden) zurückgegeben.
4. Right Outer Join: Wird auch als Right Join bezeichnet. Es werden übereinstimmende Zeilen aus der linken Tabelle (falls vorhanden) und alle in der rechten Tabelle vorhandenen Zeilen zurückgegeben.
Vorteile von Joins
quelle
Betrachten Sie unten 2 Tabellen:
EMP
Abteilung
Inner Join:
Meistens nur als JOIN in SQL-Abfragen geschrieben. Es werden nur die übereinstimmenden Datensätze zwischen den Tabellen zurückgegeben.
Finden Sie alle Mitarbeiter und ihre Abteilungsnamen heraus:
Wie Sie oben sehen,
Jose
wird in der Ausgabe nicht aus EMP gedruckt, da dept_id6
in der Abteilungstabelle keine Übereinstimmung findet. In ähnlicher WeiseHR
undR&D
Zeilen nicht aus gedruckt Abteilung Tabelle , da sie keine Übereinstimmung in der Emp - Tabelle gefunden.INNER JOIN oder nur JOIN gibt also nur übereinstimmende Zeilen zurück.
LINKS BEITRETEN:
Dies gibt alle Datensätze aus der Tabelle LINKS und nur übereinstimmende Datensätze aus der Tabelle RECHTS zurück.
Wenn Sie also die obige Ausgabe beobachten, werden alle Datensätze aus der LEFT-Tabelle (Emp) mit nur übereinstimmenden Datensätzen aus der RIGHT-Tabelle gedruckt.
HR
undR&D
Zeilen werden nicht aus der Abteilungstabelle gedruckt, da sie in der Emp-Tabelle auf dept_id keine Übereinstimmung gefunden haben.LEFT JOIN gibt also ALLE Zeilen aus der linken Tabelle und nur übereinstimmende Zeilen aus der rechten Tabelle zurück.
Kann auch DEMO überprüfen hier .
quelle
Die allgemeine Idee
Bitte beachten Sie die Antwort von Martin Smith für eine bessere illustations und Erläuterungen zu den verschiedenen beitritt, auch und vor allem Unterschiede zwischen
FULL OUTER JOIN
,RIGHT OUTER JOIN
undLEFT OUTER JOIN
.Diese beiden Tabellen bilden eine Grundlage für die Darstellung der folgenden
JOIN
s:CROSS JOIN
Das Ergebnis sind die kartesischen Produkte aller Kombinationen. Keine
JOIN
Bedingung erforderlich:INNER JOIN
INNER JOIN
ist das gleiche wie einfach:JOIN
Das Ergebnis sind Kombinationen, die die erforderliche
JOIN
Bedingung erfüllen:LINKE ÄUSSERE VERBINDUNG
LEFT OUTER JOIN
ist das gleiche wieLEFT JOIN
Das Ergebnis wird alles sein,
citizen
auch wenn es keine Übereinstimmungen gibtpostalcode
. Wieder ist eineJOIN
Bedingung erforderlich:Daten zum Spielen
Alle Beispiele wurden auf einem Oracle 18c ausgeführt. Sie sind auf dbfiddle.uk erhältlich. Dort stammen auch Screenshots von Tabellen.
Verschwommene Grenzen beim Spielen mit
JOIN
undWHERE
CROSS JOIN
CROSS JOIN
Daraus resultieren Zeilen wie The General Idea /INNER JOIN
:Die Verwendung
CROSS JOIN
, um das Ergebnis von a zu erhalten,LEFT OUTER JOIN
erfordert Tricks wie das Hinzufügen in einerNULL
Reihe. Es ist weggelassen.INNER JOIN
INNER JOIN
wird ein kartesisches Produkt. Es ist das gleiche wie The General Idea /CROSS JOIN
:Hier kann der innere Join wirklich als Cross-Join angesehen werden, dessen Ergebnisse nicht mit der entfernten Bedingung übereinstimmen. Hier wird keine der resultierenden Zeilen entfernt.
Mit
INNER JOIN
dem Ergebnis erhalten einerLEFT OUTER JOIN
auch Tricks erfordert. Es ist weggelassen.LINKE ÄUSSERE VERBINDUNG
LEFT JOIN
ergibt in Zeilen als The General Idea /CROSS JOIN
:LEFT JOIN
ergibt in Zeilen als The General Idea /INNER JOIN
:Die Probleme mit dem Venn-Diagramm
Eine Bild-Internetsuche auf "SQL Join Cross Inner Outer" zeigt eine Vielzahl von Venn-Diagrammen. Früher hatte ich eine gedruckte Ausgabe auf meinem Schreibtisch. Es gibt jedoch Probleme mit der Darstellung.
Venn-Diagramme eignen sich hervorragend für die Mengenlehre, bei der sich ein Element in einer oder beiden Mengen befinden kann. Bei Datenbanken scheint mir ein Element in einer "Menge" eine Zeile in einer Tabelle zu sein und daher auch in keiner anderen Tabelle vorhanden zu sein. In mehreren Tabellen ist keine Zeile vorhanden. Eine Zeile ist für die Tabelle eindeutig.
Self-Joins sind ein Eckfall, in dem jedes Element in beiden Mengen tatsächlich gleich ist. Aber es ist immer noch nicht frei von den folgenden Problemen.
Das Set
A
repräsentiert das Set links (diecitizen
Tabelle) und das SetB
ist das Set rechts (diepostalcode
Tabelle) in der folgenden Diskussion.CROSS JOIN
Jedes Element in beiden Mengen wird mit jedem Element in der anderen Menge abgeglichen, was bedeutet, dass wir die
A
Menge allerB
Elemente und dieB
Menge allerA
Elemente benötigen , um dieses kartesische Produkt richtig darzustellen. Die Mengenlehre ist nicht für mehrere identische Elemente in einer Menge gemacht, daher finde ich Venn-Diagramme, um sie richtig darzustellen, unpraktisch / unmöglich. Es scheint überhaupt nicht zuUNION
passen.Die Zeilen sind unterschiedlich. Das
UNION
sind insgesamt 7 Zeilen. Sie sind jedoch für eine gemeinsameSQL
Ergebnismenge nicht kompatibel . Und so funktioniert einCROSS JOIN
überhaupt nicht:Der Versuch, es so darzustellen:
..aber jetzt sieht es einfach aus wie ein
INTERSECTION
, was es sicher nicht ist . Darüber hinaus gibt es kein Element in demINTERSECTION
, das sich tatsächlich in einer der beiden unterschiedlichen Mengen befindet. Es sieht jedoch den folgenden durchsuchbaren Ergebnissen sehr ähnlich:Als Referenz kann ein durchsuchbares Ergebnis für
CROSS JOIN
s bei Tutorialgateway angezeigt werden . DasINTERSECTION
ist genau wie dieses leer.INNER JOIN
Der Wert eines Elements hängt von der
JOIN
Bedingung ab. Es ist möglich, dies unter der Bedingung darzustellen, dass jede Zeile für diese Bedingung eindeutig wird. Die Bedeutungid=x
gilt nur für eine Zeile. Sobald eine Zeile in der TabelleA
(citizen
) mehrere Zeilen in der Tabelle übereinstimmtB
(postalcode
) unter derJOIN
Bedingung, hat das Ergebnis die gleichen Probleme wie dieCROSS JOIN
: Die Zeile mehrfach dargestellt werden muss, und die Mengenlehre ist für das nicht wirklich gemacht. Unter der Bedingung der Eindeutigkeit könnte das Diagramm zwar funktionieren, bedenken Sie jedoch, dass dieJOIN
Bedingung die Platzierung eines Elements im Diagramm bestimmt. Betrachten Sie nur die Werte derJOIN
Bedingung mit dem Rest der Reihe gerade für die Fahrt:Diese Darstellung fällt vollständig auseinander, wenn ein
INNER JOIN
mit einerON 1 = 1
Bedingung verwendet wird, die es zu einem machtCROSS JOIN
.Bei einem Selbst
JOIN
sind die Zeilen tatsächlich identische Elemente in beiden Tabellen, stellen jedoch die Tabellen als beide darA
undB
sind nicht sehr geeignet. Eine übliche SelbstbedingungJOIN
, die bewirkt , dass ein ElementA
mit einem anderen Element in B übereinstimmt, ist beispielsweiseON A.parent = B.child
, dass die Übereinstimmung vonA
bisB
zu separaten Elementen erfolgt. Aus den Beispielen, die soSQL
aussehen würden:Das heißt, Smith ist der Anführer von Green und Jensen.
OUTER JOIN
Wieder beginnen die Probleme, wenn eine Zeile mehrere Übereinstimmungen mit Zeilen in der anderen Tabelle aufweist. Dies ist weiter kompliziert, da dies
OUTER JOIN
jedoch so sein kann, dass es mit dem leeren Satz übereinstimmt. Aber in der Mengenlehre ist die Vereinigung einer MengeC
und einer leeren Menge immer gerechtC
. Der leere Satz fügt nichts hinzu. Die DarstellungLEFT OUTER JOIN
zeigt normalerweise nur alle, umA
zu veranschaulichen, dass Zeilen inA
ausgewählt sind, unabhängig davon, ob eine Übereinstimmung vorliegt oder nichtB
. Die "passenden Elemente" haben jedoch die gleichen Probleme wie die obige Abbildung. Sie hängen von der Bedingung ab. Und das leere Set scheint hinübergegangen zu sein zuA
:WHERE-Klausel - sinnvoll
Finden aller Zeilen von a
CROSS JOIN
mit Smith und Postleitzahl auf dem Mond:Jetzt wird das Venn-Diagramm nicht mehr verwendet, um das wiederzugeben
JOIN
. Es wird nur für dieWHERE
Klausel verwendet:..und das macht Sinn.
Wenn INTERSECT und UNION Sinn machen
SICH SCHNEIDEN
Wie erklärt
INNER JOIN
ist ein nicht wirklich einINTERSECT
. AllerdingsINTERSECT
kann s auf den Ergebnissen der separaten Abfragen verwendet werden. Hier ist ein Venn-Diagramm sinnvoll, da die Elemente aus den einzelnen Abfragen tatsächlich Zeilen sind, die entweder nur zu einem der Ergebnisse oder zu beiden gehören. Intersect gibt offensichtlich nur Ergebnisse zurück, wenn die Zeile in beiden Abfragen vorhanden ist. DiesSQL
führt zu derselben Zeile wie obenWHERE
, und das Venn-Diagramm ist auch dasselbe:UNION
An
OUTER JOIN
ist nicht aUNION
. DochUNION
unter den gleichen Bedingungen wie arbeitenINTERSECT
, in einer Rückkehr aller Ergebnisse resultierend beide kombiniertSELECT
s:was äquivalent ist zu:
..und gibt das Ergebnis:
Auch hier macht ein Venn-Diagramm Sinn:
Wenn es nicht zutrifft
Ein wichtiger Hinweis ist, dass diese nur funktionieren, wenn die Struktur der Ergebnisse der beiden SELECTs gleich ist, was einen Vergleich oder eine Vereinigung ermöglicht. Die Ergebnisse dieser beiden werden dies nicht ermöglichen:
..versucht, die Ergebnisse mit zu kombinieren,
UNION
ergibt aFür weiteres Interesse lesen Sie NEIN zu Venn-Diagrammen, wenn Sie JOINs und SQL-Joins als Venn-Diagramm erläutern . Beide decken auch ab
EXCEPT
.quelle
Hier gibt es viele gute Antworten mit sehr genauen Beispielen für relationale Algebra . Hier ist eine sehr vereinfachte Antwort, die für Amateur- oder Anfängercodierer mit SQL-Codierungsdilemmata hilfreich sein kann.
Grundsätzlich beschränken sich Abfragen häufig
JOIN
auf zwei Fälle:Für eine
SELECT
Teilmenge von DatenA
:INNER JOIN
wenn die vonB
Ihnen gesuchten zugehörigen Daten pro Datenbankdesign vorhanden sein MÜSSEN.LEFT JOIN
wenn die zugehörigen Daten, nach denenB
Sie suchen, möglicherweise oder möglicherweise NICHT pro Datenbankdesign vorhanden sind.quelle
Der Unterschied zwischen
inner join
undouter join
ist wie folgt:Inner join
ist ein Join, der Tabellen basierend auf übereinstimmenden Tupeln kombiniert, währendouter join
ein Join, der Tabellen kombiniert, die sowohl auf übereinstimmenden als auch auf nicht übereinstimmenden Tupeln basieren.Inner join
führt übereinstimmende Zeilen aus zwei Tabellen zusammen, in denen nicht übereinstimmende Zeilen weggelassen werden, währendouter join
Zeilen aus zwei Tabellen zusammengeführt werden und nicht übereinstimmende Zeilen mit dem Wert Null gefüllt werden.Inner join
ist wie eine Kreuzungsoperation, währendouter join
es wie eine Gewerkschaftsoperation ist.Inner join
ist zwei Typen, währendouter join
drei Typen sind.outer join
ist schneller alsinner join
.quelle