Auch , wie zu tun LEFT JOIN
, RIGHT JOIN
und FULL JOIN
passen?
Auch , wie zu tun LEFT JOIN
, RIGHT JOIN
und FULL JOIN
passen?
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:
A B
- -
1 3
2 4
3 5
4 6
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.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
Linke äußere Verbindung
Eine linke äußere Verknüpfung gibt alle Zeilen in A sowie alle gemeinsamen Zeilen in B an.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
Rechte äußere Verbindung
Eine rechte äußere Verknüpfung gibt alle Zeilen in B sowie alle gemeinsamen Zeilen in A an.
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
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.
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
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.
Quelltabellen
Beginnen Sie zunächst mit einem CROSS JOIN
(AKA Cartesian Product). Dies hat keine ON
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.
WÄHLEN SIE A.Farbe, B.Farbe AUS EINER INNENVERBINDUNG B AUF A.Farbe = B.Farbe
Das Obige ist der klassische Equi Join.
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.
Ä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.
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 übereinstimmt B
. 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 alle NULL
Werte ausgeschlossen werden, damit dieses Muster ordnungsgemäß funktioniert, und zu vermeiden, dass nur Zeilen zurückgebracht werden, die zufällig einen NULL
Wert dafür haben Spalte zusätzlich zu den nicht übereinstimmenden Zeilen.
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.
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.
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.
Mit einer geringfügigen Änderung der vorhergehenden Abfrage könnte man eine UNION ALL
der beiden Tabellen simulieren .
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
Sehen Sie sich diese Beispiele live auf SQLFiddle.com an .
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:
select * from employee inner join location on employee.empID = location.empID
OR
select * from employee, location where employee.empID = location.empID
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:
select * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
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:
select * from employee right outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
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.
Rufen Sie nur die übereinstimmenden Zeilen ab A intersect B
.
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
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.
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
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.
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
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
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.
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
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
gibt nur Bestellungen zurück, die auch etwas in der OrderDetails-Tabelle enthalten.
Wenn Sie es auf OUTER LEFT JOIN ändern
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
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
.
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
zu SELECT 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
1.Take All records from left Table
2.for(each record in right table,) {
if(Records from left & right table matching on primary & foreign key){
use their values as it is as result of join at the right side for 2nd table.
} else {
put value NULL values in that particular record as result of join at the right side for 2nd table.
}
}
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
employees : id , name
phone_numbers_employees : id , phone_num , emp_id
Hier ist die Mitarbeitertabelle die Mastertabelle, phone_numbers_employees die untergeordnete Tabelle (sie enthält emp_id
als Fremdschlüssel , der die untergeordnete Tabelle verbindet employee.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:
SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
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.
SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Äußere Verbindungen :
SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Diagrammatisch sieht es so aus:
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 entweder LEFT
oder sein RIGHT
.
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.
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
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
und LEFT JOIN
sind die gleichen. Es gibt alle übereinstimmenden Datensätze in beiden Tabellen und alle Möglichkeiten der linken Tabelle.
Ähnlich RIGHT OUTER JOIN
und RIGHT JOIN
sind gleich. Es gibt alle übereinstimmenden Datensätze in beiden Tabellen und alle Möglichkeiten der richtigen Tabelle.
FULL JOIN
ist die Kombination von LEFT OUTER JOIN
und RIGHT OUTER JOIN
ohne Vervielfältigung.
Die Antwort liegt in der Bedeutung jedes Einzelnen, also in den Ergebnissen.
Hinweis:
InSQLite
gibt es keinRIGHT OUTER JOIN
oderFULL OUTER JOIN
.
Und auch daMySQL
drin ist neinFULL OUTER JOIN
.
Meine Antwort basiert auf dem obigen Hinweis .
Wenn Sie zwei Tabellen wie diese haben:
--[table1] --[table2]
id | name id | name
---+------- ---+-------
1 | a1 1 | a2
2 | b1 3 | b2
CROSS JOIN / OUTER JOIN:
Sie können alle diese Tabellendaten mit CROSS JOIN
oder einfach ,
so haben:
SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
1 | a1 | 3 | b2
2 | b1 | 1 | a2
2 | b1 | 3 | b2
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önnen INNER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
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.)
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
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
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id
--[Results:]
id | name | id | name
-----+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
Null | Null | 3 | b2
Nun, je nach Bedarf wählen Sie jeden aus, der Ihren Bedarf abdeckt;).
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).
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 wie INNER JOIN
, enthält jedoch auch NULL
Daten zu ResultSet.
LEFT JOIN
= INNER JOIN
+ Nicht übereinstimmende Daten der linken Tabelle mit Null
Übereinstimmung auf der rechten Tabelle.RIGHT JOIN
= INNER JOIN
+ Nicht übereinstimmende Daten der rechten Tabelle mit Null
Übereinstimmung auf der linken Tabelle.FULL JOIN
= INNER JOIN
+ Nicht übereinstimmende Daten in der rechten und linken Tabelle mit Null
Übereinstimmungen.INNER JOIN
und können OUTER JOIN
wir Self-Join-Abfragen schreiben.Zum Beispiel:
SELECT *
FROM tablea a
INNER JOIN tableb b
ON a.primary_key = b.foreign_key
INNER JOIN tablec c
ON b.primary_key = c.foreign_key
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:
INNER JOIN
ist es langsamer als LEFT JOIN
in den meisten Fällen, und die Leute können es verwenden, LEFT JOIN
anstatt ein INNER JOIN
hinzuzufügen, WHERE
um unerwartete NULL
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 dass OUTER JOIN
es sich eher um eine Union als um einen Join handelt:
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, das Null
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.
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
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.
Beispiele
Angenommen, Sie haben zwei Tabellen mit jeweils einer Spalte und Daten wie folgt:
A B
- -
1 3
2 4
3 5
4 6
7
8
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.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
Ergebnis:
a | b
--+--
3 | 3
4 | 4
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
.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
Ergebnis:
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
7 | null
8 | null
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
Ergebnis:
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
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.
select * from a FULL OUTER JOIN b on a.a = b.b;
Ergebnis:
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
7 | null
8 | null
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
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:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
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:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
FULL OUTER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
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
Betrachten Sie unten 2 Tabellen:
EMP
empid name dept_id salary
1 Rob 1 100
2 Mark 1 300
3 John 2 100
4 Mary 2 300
5 Bill 3 700
6 Jose 6 400
Abteilung
deptid name
1 IT
2 Accounts
3 Security
4 HR
5 R&D
Meistens nur als JOIN in SQL-Abfragen geschrieben. Es werden nur die übereinstimmenden Datensätze zwischen den Tabellen zurückgegeben.
Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
Wie Sie oben sehen, Jose
wird in der Ausgabe nicht aus EMP gedruckt, da dept_id 6
in der Abteilungstabelle keine Übereinstimmung findet. In ähnlicher Weise HR
und R&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.
Dies gibt alle Datensätze aus der Tabelle LINKS und nur übereinstimmende Datensätze aus der Tabelle RECHTS zurück.
Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
6 Jose
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
und R&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 .
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
und LEFT OUTER JOIN
.
Diese beiden Tabellen bilden eine Grundlage für die Darstellung der folgenden JOIN
s:
SELECT *
FROM citizen
CROSS JOIN postalcode
Das Ergebnis sind die kartesischen Produkte aller Kombinationen. Keine JOIN
Bedingung erforderlich:
INNER JOIN
ist das gleiche wie einfach: JOIN
SELECT *
FROM citizen c
JOIN postalcode p ON c.postal = p.postal
Das Ergebnis sind Kombinationen, die die erforderliche JOIN
Bedingung erfüllen:
LEFT OUTER JOIN
ist das gleiche wie LEFT JOIN
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON c.postal = p.postal
Das Ergebnis wird alles sein, citizen
auch wenn es keine Übereinstimmungen gibt postalcode
. Wieder ist eine JOIN
Bedingung erforderlich:
Alle Beispiele wurden auf einem Oracle 18c ausgeführt. Sie sind auf dbfiddle.uk erhältlich. Dort stammen auch Screenshots von Tabellen.
CREATE TABLE citizen (id NUMBER,
name VARCHAR2(20),
postal NUMBER, -- <-- could do with a redesign to postalcode.id instead.
leader NUMBER);
CREATE TABLE postalcode (id NUMBER,
postal NUMBER,
city VARCHAR2(20),
area VARCHAR2(20));
INSERT INTO citizen (id, name, postal, leader)
SELECT 1, 'Smith', 2200, null FROM DUAL
UNION SELECT 2, 'Green', 31006, 1 FROM DUAL
UNION SELECT 3, 'Jensen', 623, 1 FROM DUAL;
INSERT INTO postalcode (id, postal, city, area)
SELECT 1, 2200, 'BigCity', 'Geancy' FROM DUAL
UNION SELECT 2, 31006, 'SmallTown', 'Snizkim' FROM DUAL
UNION SELECT 3, 31006, 'Settlement', 'Moon' FROM DUAL -- <-- Uuh-uhh.
UNION SELECT 4, 78567390, 'LookoutTowerX89', 'Space' FROM DUAL;
JOIN
undWHERE
CROSS JOIN
Daraus resultieren Zeilen wie The General Idea / INNER JOIN
:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.postal = p.postal -- < -- The WHERE condition is limiting the resulting rows
Die Verwendung CROSS JOIN
, um das Ergebnis von a zu erhalten, LEFT OUTER JOIN
erfordert Tricks wie das Hinzufügen in einer NULL
Reihe. Es ist weggelassen.
INNER JOIN
wird ein kartesisches Produkt. Es ist das gleiche wie The General Idea / CROSS JOIN
:
SELECT *
FROM citizen c
JOIN postalcode p ON 1 = 1 -- < -- The ON condition makes it a 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 einer LEFT OUTER JOIN
auch Tricks erfordert. Es ist weggelassen.
LEFT JOIN
ergibt in Zeilen als The General Idea / CROSS JOIN
:
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON 1 = 1 -- < -- The ON condition makes it a CROSS JOIN
LEFT JOIN
ergibt in Zeilen als The General Idea / INNER JOIN
:
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON c.postal = p.postal
WHERE p.postal IS NOT NULL -- < -- removed the row where there's no mathcing result from postalcode
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 (die citizen
Tabelle) und das Set B
ist das Set rechts (die postalcode
Tabelle) in der folgenden Diskussion.
Jedes Element in beiden Mengen wird mit jedem Element in der anderen Menge abgeglichen, was bedeutet, dass wir die A
Menge aller B
Elemente und die B
Menge aller A
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 zu UNION
passen.
Die Zeilen sind unterschiedlich. Das UNION
sind insgesamt 7 Zeilen. Sie sind jedoch für eine gemeinsame SQL
Ergebnismenge nicht kompatibel . Und so funktioniert ein CROSS 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 dem INTERSECTION
, 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 . Das INTERSECTION
ist genau wie dieses leer.
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 Bedeutung id=x
gilt nur für eine Zeile. Sobald eine Zeile in der Tabelle A
( citizen
) mehrere Zeilen in der Tabelle übereinstimmt B
( postalcode
) unter der JOIN
Bedingung, hat das Ergebnis die gleichen Probleme wie die CROSS 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 die JOIN
Bedingung die Platzierung eines Elements im Diagramm bestimmt. Betrachten Sie nur die Werte der JOIN
Bedingung mit dem Rest der Reihe gerade für die Fahrt:
Diese Darstellung fällt vollständig auseinander, wenn ein INNER JOIN
mit einer ON 1 = 1
Bedingung verwendet wird, die es zu einem macht CROSS JOIN
.
Bei einem Selbst JOIN
sind die Zeilen tatsächlich identische Elemente in beiden Tabellen, stellen jedoch die Tabellen als beide dar A
und B
sind nicht sehr geeignet. Eine übliche Selbstbedingung JOIN
, die bewirkt , dass ein Element A
mit einem anderen Element in B übereinstimmt, ist beispielsweise ON A.parent = B.child
, dass die Übereinstimmung von A
bis B
zu separaten Elementen erfolgt. Aus den Beispielen, die so SQL
aussehen würden:
SELECT *
FROM citizen c1
JOIN citizen c2 ON c1.id = c2.leader
Das heißt, Smith ist der Anführer von Green und Jensen.
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 Menge C
und einer leeren Menge immer gerecht C
. Der leere Satz fügt nichts hinzu. Die Darstellung LEFT OUTER JOIN
zeigt normalerweise nur alle, um A
zu veranschaulichen, dass Zeilen in A
ausgewählt sind, unabhängig davon, ob eine Übereinstimmung vorliegt oder nicht B
. 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 zu A
:
Finden aller Zeilen von a CROSS JOIN
mit Smith und Postleitzahl auf dem Mond:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
AND p.area = 'Moon';
Jetzt wird das Venn-Diagramm nicht mehr verwendet, um das wiederzugeben JOIN
. Es wird nur für die WHERE
Klausel verwendet:
..und das macht Sinn.
Wie erklärt INNER JOIN
ist ein nicht wirklich ein INTERSECT
. Allerdings INTERSECT
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. Dies SQL
führt zu derselben Zeile wie oben WHERE
, und das Venn-Diagramm ist auch dasselbe:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
INTERSECT
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE p.area = 'Moon';
An OUTER JOIN
ist nicht a UNION
. Doch UNION
unter den gleichen Bedingungen wie arbeiten INTERSECT
, in einer Rückkehr aller Ergebnisse resultierend beide kombiniert SELECT
s:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
UNION
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE p.area = 'Moon';
was äquivalent ist zu:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
OR p.area = 'Moon';
..und gibt das Ergebnis:
Auch hier macht ein Venn-Diagramm Sinn:
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:
SELECT *
FROM citizen
WHERE name = 'Smith'
SELECT *
FROM postalcode
WHERE area = 'Moon';
..versucht, die Ergebnisse mit zu kombinieren, UNION
ergibt a
ORA-01790: expression must have same datatype as corresponding expression
Fü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
.
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 Daten A
:
INNER JOIN
wenn die von B
Ihnen gesuchten zugehörigen Daten pro Datenbankdesign vorhanden sein MÜSSEN.LEFT JOIN
wenn die zugehörigen Daten, nach denen B
Sie suchen, möglicherweise oder möglicherweise NICHT pro Datenbankdesign vorhanden sind.Der Unterschied zwischen inner join
und outer join
ist wie folgt:
Inner join
ist ein Join, der Tabellen basierend auf übereinstimmenden Tupeln kombiniert, während outer 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ährend outer 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ährend outer join
es wie eine Gewerkschaftsoperation ist.Inner join
ist zwei Typen, während outer join
drei Typen sind.outer join
ist schneller als inner join
.