Frage

Auch wie geht das LEFT JOIN, RIGHT JOIN Und FULL JOIN sich einfügen?

War es hilfreich?

Lösung

Angenommen, Sie verknüpfen Spalten ohne Duplikate, was ein sehr häufiger Fall ist:

  • Eine innere Verknüpfung von A und B ergibt das Ergebnis von A überschneidet B, d. h.der innere Teil eines Venn-Diagramm Überschneidung.

  • Ein äußerer Join von A und B liefert die Ergebnisse der A-Vereinigung B, d. h.die äußeren Teile einer Venn-Diagramm-Vereinigung.

Beispiele

Angenommen, Sie haben zwei Tabellen mit jeweils einer einzelnen Spalte und den folgenden Daten:

A    B
-    -
1    3
2    4
3    5
4    6

Beachten Sie, dass (1,2) nur für A gelten, (3,4) gemeinsam sind und (5,6) nur für B gelten.

Innerer Join

Ein innerer Join mit einer der entsprechenden Abfragen ergibt den Schnittpunkt der beiden Tabellen, d. h.die beiden Reihen, 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

Ein linker äußerer Join ergibt alle Zeilen in A sowie alle gemeinsamen Zeilen in B.

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

Rechter äußerer Join

Ein rechter äußerer Join ergibt alle Zeilen in B sowie alle gemeinsamen Zeilen in A.

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ändiger äußerer Join

Ein vollständiger äußerer Join ergibt die Vereinigung von A und B, d. h.alle Zeilen in A und alle Zeilen in B.Wenn etwas in A kein entsprechendes Datum in B hat, dann ist der B-Teil null und 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

Andere Tipps

Die Venn-Diagramme helfen mir nicht wirklich.

Sie zeigen beispielsweise keinen Unterschied zwischen einem Cross-Join und einem Inner-Join, oder allgemeiner gesagt, sie zeigen keinen Unterschied zwischen verschiedenen Arten von Join-Prädikaten oder bieten einen Rahmen für Überlegungen zu ihrer Funktionsweise.

Es gibt keinen Ersatz dafür, die logische Verarbeitung zu verstehen, und sie ist ohnehin relativ einfach zu verstehen.

  1. Stellen Sie sich einen Cross-Join vor.
  2. Bewerten on -Klausel gegen alle Zeilen aus Schritt 1 und behält diejenigen bei, zu denen das Prädikat ausgewertet wird true
  3. (Nur für äußere Verknüpfungen) Fügen Sie alle äußeren Zeilen wieder hinzu, die in Schritt 2 verloren gegangen sind.

(Hinweis:In der Praxis findet der Abfrageoptimierer möglicherweise effizientere Möglichkeiten zur Ausführung der Abfrage als die rein logische Beschreibung oben, aber das Endergebnis muss dasselbe sein.)

Ich beginne mit einer animierten Version von a vollständiger äußerer Join.Weitere Erläuterungen folgen.

enter image description here


Erläuterung

Quelltabellen

enter link description here

Beginnen Sie zunächst mit a CROSS JOIN (auch bekannt als kartesisches Produkt).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 EINER KREUZVERBINDUNG B

enter link description here

Inner- und Outer-Joins verfügen über ein „ON“-Klauselprädikat.

  • Innere Verbindung. Werten Sie die Bedingung in der „ON“-Klausel für alle Zeilen im Cross-Join-Ergebnis aus.Wenn true, wird die verbundene Zeile zurückgegeben.Andernfalls entsorgen Sie es.
  • Linke äußere Verbindung. Dasselbe wie bei der inneren Verknüpfung, dann werden für alle Zeilen in der linken Tabelle, die mit nichts übereinstimmten, diese mit NULL-Werten für die rechten Tabellenspalten ausgegeben.
  • Rechte äußere Verbindung. Dasselbe wie bei der inneren Verknüpfung, dann werden für alle Zeilen in der rechten Tabelle, die mit nichts übereinstimmten, diese mit NULL-Werten für die linken Tabellenspalten ausgegeben.
  • Vollständiger äußerer Join. Identisch mit dem inneren Join, dann bleiben die linken nicht übereinstimmenden Zeilen wie beim linken äußeren Join und die rechten nicht übereinstimmenden Zeilen wie beim rechten äußeren Join erhalten.

Einige Beispiele

WÄHLEN Sie A.Farbe, B.Farbe AUS EINEM INNEREN JOIN B AUF A.Farbe = B.Farbe

Das Obige ist der klassische Equi-Join.

Inner Join

Animierte Version

enter image description here

WÄHLEN Sie A.Farbe, B.Farbe AUS EINEM INNER JOIN B AUF A.Farbe NICHT IN („Grün“, „Blau“)

Die innere Join-Bedingung muss nicht unbedingt eine Gleichheitsbedingung sein und sie muss nicht auf Spalten beider (oder sogar einer) Tabellen verweisen.Bewerten A.Colour NOT IN ('Green','Blue') in jeder Zeile der Cross-Join-Rückgabe.

inner 2

WÄHLEN Sie A.Farbe, B.Farbe AUS EINEM INNEREN JOIN B AUF 1 =1

Die Join-Bedingung wird für alle Zeilen im Cross-Join-Ergebnis als wahr ausgewertet, sodass dies genau das Gleiche ist wie ein Cross-Join.Ich werde das Bild der 16 Reihen nicht noch einmal wiederholen.

WÄHLEN Sie A.Farbe, B.Farbe AUS EINER LINKEN ÄUSSEREN VERBINDUNG B AUF A.Farbe = B.Farbe

Äußere Verknüpfungen werden logisch auf die gleiche Weise ausgewertet wie innere Verknüpfungen, mit der Ausnahme, dass eine Zeile aus der linken Tabelle (für eine linke Verknüpfung), die überhaupt nicht mit Zeilen aus der rechten Tabelle verknüpft wird, im Ergebnis erhalten bleibt NULL Werte für die rechten Spalten.

LOJ

WÄHLEN Sie A.Farbe, B.Farbe AUS EINEM LINKEN ÄUSSEREN JOIN B AUF A.Farbe = B.Farbe, WO B.Farbe NULL IST

Dadurch wird das vorherige Ergebnis lediglich darauf beschränkt, nur die Zeilen zurückzugeben, in denen B.Colour IS NULL.In diesem speziellen Fall sind dies die Zeilen, die beibehalten wurden, da sie in der rechten Tabelle keine Übereinstimmung hatten und die Abfrage die einzelne rote Zeile zurückgibt, die in der Tabelle nicht übereinstimmte B.Dies wird als Anti-Semi-Join bezeichnet.

Es ist wichtig, eine Spalte dafür auszuwählen IS NULL Test, der entweder keine NULL-Werte zulässt oder für den die Join-Bedingung sicherstellt, dass überhaupt NULL Werte werden ausgeschlossen, damit dieses Muster korrekt funktioniert und um zu vermeiden, dass nur Zeilen zurückgebracht werden, die zufällig ein haben NULL Wert für diese Spalte zusätzlich zu den nicht übereinstimmenden Zeilen.

loj is null

WÄHLEN Sie A.Farbe, B.Farbe AUS EINER RECHTEN ÄUSSEREN VERBINDUNG B AUF A.Farbe = B.Farbe

Rechte äußere Verknüpfungen verhalten sich ähnlich wie linke äußere Verknüpfungen, mit der Ausnahme, dass sie nicht übereinstimmende Zeilen aus der rechten Tabelle beibehalten und die linken Spalten durch Null erweitern.

ROJ

WÄHLEN Sie A.Farbe, B.Farbe AUS EINER VOLLSTÄNDIGEN ÄUSSEREN VERBINDUNG B AUF A.Farbe = B.Farbe

Vollständige äußere Verknüpfungen kombinieren das Verhalten von linken und rechten Verknüpfungen und bewahren die nicht übereinstimmenden Zeilen sowohl aus der linken als auch aus der rechten Tabelle.

FOJ

WÄHLEN Sie A.Farbe, B.Farbe AUS EINEM VOLLSTÄNDIGEN ÄUSSEREN JOIN B AUF 1 = 0

Keine Zeile im Cross-Join stimmt mit überein 1=0 Prädikat.Alle Zeilen auf beiden Seiten werden unter Verwendung normaler Outer-Join-Regeln mit NULL in den Spalten der Tabelle auf der anderen Seite beibehalten.

FOJ 2

WÄHLEN SIE COALESCE(A.Color, B.Color) ALS Farbe AUS EINEM FULL OUTER JOIN B ON 1 = 0

Mit einer geringfügigen Änderung der vorherigen Abfrage könnte man a simulieren UNION ALL der beiden Tische.

UNION ALL

WÄHLEN Sie A.Farbe, B.Farbe AUS EINEM LINKEN ÄUSSEREN JOIN B AUF A.Farbe = B.Farbe WO B.Farbe = 'Grün'

Notiere dass der WHERE Die Klausel (falls vorhanden) wird logischerweise nach dem Join ausgeführt.Ein häufiger Fehler besteht darin, einen Left-Outer-Join durchzuführen und dann eine WHERE-Klausel mit einer Bedingung für die rechte Tabelle einzufügen, die letztendlich die nicht übereinstimmenden Zeilen ausschließt.Das Obige endet mit der Durchführung des äußeren Joins ...

LOJ

...Und dann wird die „Where“-Klausel ausgeführt. NULL= 'Green' wird nicht als wahr ausgewertet, sodass die durch den äußeren Join erhaltene Zeile (zusammen mit der blauen) verworfen wird, wodurch der Join effektiv wieder in einen inneren umgewandelt wird.

LOJtoInner

Wenn die Absicht darin bestünde, nur Zeilen von B einzubeziehen, deren Farbe Grün ist, und alle Zeilen von A, unabhängig davon, wäre die korrekte Syntax

WÄHLEN Sie A.Farbe, B.Farbe AUS EINER LINKEN ÄUSSEREN VERBINDUNG B AUF A.Farbe = B.Farbe UND B.Farbe = „Grün“

enter image description here

SQL-Geige

Sehen Sie sich diese Beispiele an laufen Sie live auf SQLFiddle.com.

Tritt bei werden verwendet, um die Daten zweier Tabellen zusammenzuführen, wobei das Ergebnis eine neue, temporäre Tabelle ist.Verknüpfungen werden auf der Grundlage eines sogenannten Prädikats durchgeführt, das die zum Durchführen einer Verknüpfung zu verwendende Bedingung angibt.Der Unterschied zwischen einem Inner-Join und einem Outer-Join besteht darin, dass ein Inner-Join nur die Zeilen zurückgibt, die basierend auf dem Join-Prädikat tatsächlich übereinstimmen.Betrachten wir die Mitarbeiter- und Standorttabelle:

enter image description here

Innerer Join:-Inner Join erstellt eine neue Ergebnistabelle durch Kombinieren der Spaltenwerte zweier Tabellen (Mitarbeiter Und Standort) basierend auf dem Join-Prädikat.Die Abfrage vergleicht jede Zeile von Mitarbeiter mit jeder Reihe von Standort um alle Zeilenpaare zu finden, die das Join-Prädikat erfüllen.Wenn das Join-Prädikat durch übereinstimmende Nicht-NULL-Werte erfüllt wird, werden die Spaltenwerte für jedes übereinstimmende Zeilenpaar von Mitarbeiter Und Standort werden zu einer Ergebniszeile zusammengefasst.So sieht die SQL für einen Inner Join aus:

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

So würde das Ergebnis der Ausführung dieser SQL aussehen:enter image description here enter image description here

Äußere Verbindung:-Bei einem Outer-Join ist es nicht erforderlich, dass für jeden Datensatz in den beiden verbundenen Tabellen ein übereinstimmender Datensatz vorhanden ist.Die verknüpfte Tabelle behält jeden Datensatz bei – auch wenn kein anderer übereinstimmender Datensatz vorhanden ist.Outer-Joins unterteilen sich weiter in Left-Outer-Joins und Right-Outer-Joins, je nachdem, welche Tabellenzeilen beibehalten werden (links oder rechts).

Linke äußere Verbindung:-Das Ergebnis eines Left Outer Join (oder einfach Left Join) für Tabellen Mitarbeiter Und Standort enthält immer alle Datensätze der „linken“ Tabelle (Mitarbeiter), auch wenn die Join-Bedingung keinen passenden Datensatz in der „richtigen“ Tabelle findet (Standort).So würde die SQL-Anweisung für einen Left Outer Join unter Verwendung der obigen Tabellen aussehen:

select  * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional

Nun sieht das Ergebnis der Ausführung dieser SQL wie folgt aus:enter image description here enter image description here

Rechte äußere Verbindung: –Ein rechter äußerer Join (oder rechter Join) ähnelt stark einem linken äußeren Join, außer dass die Behandlung der Tabellen umgekehrt ist.Jede Zeile aus der „richtigen“ Tabelle (Standort) wird mindestens einmal in der verknüpften Tabelle angezeigt.Wenn keine passende Zeile aus der „linken“ Tabelle (Mitarbeiter) vorhanden ist, erscheint NULL in den Spalten von Mitarbeiter für die Datensätze, die keine Übereinstimmung haben Standort.So sieht die 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 Right Outer Joins aussehen würde:

enter image description hereenter image description here

Vollständige äußere Verknüpfungen: –Bei Full Outer Join oder Full Outer Join geht es darum, die nicht übereinstimmenden Informationen beizubehalten, indem nicht übereinstimmende Zeilen in die Ergebnisse eines Joins einbezogen werden. Verwenden Sie dazu einen vollständigen Outer Join.Es umfasst alle Zeilen aus beiden Tabellen, unabhängig davon, ob die andere Tabelle einen übereinstimmenden Wert hat oder nicht.enter image description here

Bildquelle

MySQL 8.0 Referenzhandbuch – Join-Syntax

Oracle Join-Vorgänge

Innere Verbindung

Rufen Sie nur die übereinstimmenden Zeilen ab, d. h. A intersect B.

Enter image description here

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

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 zusammengefügten Schlüssel entsprechen.

Enter image description here

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Vollständiger äußerer Join

Wählen Sie alle Datensätze aus der zweiten Tabelle und alle Datensätze in der ersten Tabelle aus, die den zusammengefügten Schlüssel entsprechen.

Enter image description here

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Verweise

In einfachen Worten:

Ein innerer Join Rufen Sie nur die übereinstimmenden Zeilen ab.

Während ein äußerer Join Rufen Sie die übereinstimmenden Zeilen aus einer Tabelle und alle Zeilen in einer anderen Tabelle ab. Das Ergebnis hängt 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 dann Zeilen an, wenn auf der anderen (rechten) Seite des Joins ein passender Datensatz vorhanden ist.

Ein (linker) äußerer Join zeigt Zeilen für jeden Datensatz auf der linken Seite an, auch wenn es auf der anderen (rechten) Seite des Joins keine passenden Zeilen gibt.Wenn es keine passende Zeile gibt, würden die Spalten für die andere (rechte) Seite NULL-Werte anzeigen.

Inner Joins erfordern, dass in der verknüpften Tabelle ein Datensatz mit einer zugehörigen ID vorhanden ist.

Äußere Verknüpfungen geben Datensätze für die linke Seite zurück, auch wenn für die rechte Seite nichts vorhanden ist.

Beispielsweise verfügen Sie über eine Orders- und eine OrderDetails-Tabelle.Sie sind durch eine „OrderID“ miteinander verbunden.

Aufträge

  • Auftragsnummer
  • Kundenname

Bestelldetails

  • OrderDetailID
  • Auftragsnummer
  • Produktname
  • Menge
  • Preis

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 in 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 enthalten.

Sie können dies verwenden, um Bestellungen zu finden, die keine OrderDetails haben, was auf eine mögliche verwaiste Bestellung hinweist, indem Sie eine where-Klausel wie hinzufügen WHERE OrderDetails.OrderID IS NULL.

In einfachen Worten:

Innerer Join -> Nehmen Sie NUR gemeinsame Datensätze aus übergeordneten und untergeordneten Tabellen, wobei der Primärschlüssel der übergeordneten Tabelle mit dem Fremdschlüssel in der untergeordneten Tabelle übereinstimmt.

Links beitreten ->

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.
    }
  }

Richtig beitreten :Genau das Gegenteil von left joint .Geben Sie den Namen der Tabelle in LEFT JOIN auf der rechten Seite in Right Join ein. Sie erhalten die gleiche Ausgabe wie LEFT JOIN.

Äußerer Join :Alle Datensätze in beiden Tabellen anzeigen No matter what.Wenn Datensätze in der linken Tabelle nicht mit der rechten Tabelle basierend auf dem Primär- oder Fremdschlüssel übereinstimmen, verwenden Sie den NULL-Wert als Ergebnis der Verknüpfung.

Beispiel :

Example

Nehmen wir nun zwei Tische 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 ist die untergeordnete Tabelle (sie enthält emp_id als Fremdschlüssel, der verbindet employee.id es ist also eine untergeordnete Tabelle.)

Innere Verbindungen

Nehmen Sie die Aufzeichnungen 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..

Die 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;

Hier werden nur übereinstimmende Zeilen für Primärschlüssel = Fremdschlüssel verwendet, wie oben erläutert. Hier werden nicht übereinstimmende Zeilen für Primärschlüssel = Fremdschlüssel als Ergebnis der Verknüpfung übersprungen.

Links schließt sich an :

Left Join behält alle Zeilen der linken Tabelle bei, unabhängig davon, ob es eine Zeile gibt, die 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;

Schematisch sieht es so aus:

Diagram

Sie nutzen INNER JOIN um alle Zeilen aus beiden Tabellen zurückzugeben, in denen eine Übereinstimmung besteht.d.h.In der resultierenden Tabelle haben alle Zeilen und Spalten Werte.

In OUTER JOIN Die resultierende Tabelle enthält möglicherweise leere Spalten.Outer Join kann beides sein LEFT oder RIGHT.

LEFT OUTER JOIN gibt alle Zeilen aus der ersten Tabelle zurück, auch wenn es in der zweiten Tabelle keine Übereinstimmungen gibt.

RIGHT OUTER JOIN gibt alle Zeilen aus der zweiten Tabelle zurück, auch wenn es in der ersten Tabelle keine Übereinstimmungen gibt.

This is a good explanation for joins

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 beim Vergleich der beiden Tabellen mindestens eine Übereinstimmung vorliegt.Zum Beispiel Tabelle A und Tabelle B, was A ٨ B impliziert (A-Schnittpunkt B).

LEFT OUTER JOIN Und LEFT JOIN sind gleich.Es werden alle Datensätze angezeigt, die in beiden Tabellen übereinstimmen, sowie alle Möglichkeiten der linken Tabelle.

Ähnlich, RIGHT OUTER JOIN Und RIGHT JOIN sind gleich.Es werden alle Datensätze angezeigt, die in beiden Tabellen übereinstimmen, sowie alle Möglichkeiten der rechten Tabelle.

FULL JOIN ist die Kombination von LEFT OUTER JOIN Und RIGHT OUTER JOIN ohne Duplizierung.

Die Antwort liegt in der Bedeutung jedes einzelnen, also in den Ergebnissen.

Notiz :
In SQLite es gibt kein RIGHT OUTER JOIN oder FULL OUTER JOIN.
Und auch in MySQL es gibt kein FULL OUTER JOIN.

Meine Antwort basiert auf oben Notiz.

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 haben CROSS JOIN oder einfach mit , so was:

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 oben genannten Ergebnissen einen Filter hinzufügen möchten, der auf einer Beziehung wie folgt basiert table1.id = table2.id Sie können verwenden 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

LINKE ÄUSSERE VERBINDUNG :
Wenn Sie alle Zeilen einer der Tabellen im obigen Ergebnis mit derselben Beziehung haben möchten, können Sie verwenden LEFT JOIN:
(Für RICHTIG BEITRETEN einfach den Platz der Tische wechseln)

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

VOLLSTÄNDIGER ÄUSSERER JOIN:
Wenn Sie auch alle Zeilen der anderen Tabelle in Ihren Ergebnissen haben möchten, können Sie diese 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 ;).

Innerer Join.

Bei einem Join werden die Zeilen zweier Tabellen kombiniert.Ein innerer Join versucht, die beiden Tabellen anhand der von Ihnen 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 in der ersten Tabelle eine Zeile vorhanden ist, die nicht mit einer Zeile in der zweiten übereinstimmt, wird sie nicht zurückgegeben.Wenn es in der zweiten Tabelle eine Zeile gibt, die nicht mit einer Zeile in der ersten übereinstimmt, wird sie ebenfalls nicht zurückgegeben.

Äußerer Join.

A links beitreten versucht, eine Übereinstimmung zwischen den Zeilen der ersten Tabelle und den Zeilen 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 (null) gelassen.

Ich sehe in den anderen Antworten nicht viele Details zu Leistung und Optimierer.

Manchmal ist es gut, nur das zu wissen INNER JOIN ist assoziativ, was bedeutet, dass der Optimierer die meisten Möglichkeiten hat, damit zu spielen.Es kann die Verknüpfungsreihenfolge neu anordnen, um es schneller zu machen und das gleiche Ergebnis zu erzielen.Der Optimierer kann die meisten Join-Modi verwenden.

Im Allgemeinen ist es eine gute Praxis, es auszuprobieren INNER JOIN anstelle der verschiedenen Arten von Verknüpfungen.(Natürlich, wenn es angesichts der erwarteten Ergebnismenge möglich ist.)

Hier finden Sie einige gute Beispiele und Erklärungen zu diesem seltsamen assoziativen Verhalten:

Der genaue Algorithmus für INNER JOIN, LEFT/RIGHT OUTER JOIN sind wie folgt:

  1. Nehmen Sie jede Zeile aus der ersten Tabelle: a
  2. Betrachten Sie alle Zeilen aus der zweiten Tabelle daneben: (a, b[i])
  3. Bewerten ON ... Klausel gegen jedes Paar: ON( a, b[i] ) = true/false?
    • Wenn die Bedingung zu ausgewertet wird true, geben Sie diese kombinierte Zeile zurück (a, b[i]).
    • Wenn das Ende der zweiten Tabelle ohne Übereinstimmung erreicht wird, ist dies ein Outer Join dann gib a zurück (virtuell) Paar mit Null für alle Spalten der anderen Tabelle: (a, Null) für LINKEN äußeren Join oder (Null, b) für RECHTEN äußeren Join.Dadurch soll sichergestellt werden, dass alle Zeilen der ersten Tabelle in den Endergebnissen vorhanden sind.

Notiz: die in angegebene Bedingung ON Die Klausel kann alles Mögliche sein, ihre Verwendung ist nicht erforderlich Primärschlüssel (und Sie müssen nicht immer auf Spalten aus beiden Tabellen verweisen)!Zum Beispiel:

Inner Join vs. Left Outer Join


enter image description here

Notiz: Linker Join = Linker äußerer Join, rechter Join = rechter äußerer Join.

Nachdem ich das beliebte rot schattierte Venn-Diagramm kritisiert hatte, hielt ich es für nur fair, meinen eigenen Versuch zu veröffentlichen.

Obwohl die Antwort von @Martin Smith bei weitem die beste dieser Art ist, zeigt sie nur die Schlüsselspalte jeder Tabelle an, wohingegen 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, dass es ausreichend zeigt, dass die Nullen vorhanden sind, weil darin keine Schlüsselwerte vorhanden sind TableB oder das OUTER JOIN ist eigentlich eher eine Union als ein Join:

enter image description here

enter image description here

  • INNER JOIN Der typischste Join für zwei oder mehr Tabellen.Es gibt eine Datenübereinstimmung sowohl für die Tabelle ON-Primärschlüssel als auch für die Forignkey-Beziehung zurück.
  • OUTER JOIN ist dasselbe wie INNER JOIN, aber es beinhaltet auch NULL Daten auf ResultSet.
    • LEFT JOIN = INNER JOIN + Unübertroffene Daten von links Tisch mit Null Spiel auf dem rechten Tisch.
    • RIGHT JOIN = INNER JOIN + Unübertroffene Daten von Rechts Tisch mit Null Spiel am linken Tisch.
    • FULL JOIN = INNER JOIN + Unübertroffene Daten zu sowohl rechts als auch links Tische mit Null Streichhölzer.
  • Self-Join ist kein Schlüsselwort in SQL. Wenn eine Tabelle auf Daten in sich selbst verweist, wird dies als Self-Join bezeichnet.Benutzen INNER JOIN Und OUTER JOIN Wir können 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 

Einfachste Definitionen

Innerer Join:Kehrt zurück übereinstimmende Datensätze aus beiden Tabellen.

Vollständiger äußerer Join:Rückgaben übereinstimmend und unübertroffene Datensätze aus beiden Tabellen mit Null für nicht übereinstimmende Datensätze aus Beide Tische.

Linke äußere Verbindung:Gibt übereinstimmende und nicht übereinstimmende Datensätze nur ab der Tabelle zurück Linke Seite.

Rechter äußerer Join:Gibt übereinstimmende und nicht übereinstimmende Datensätze nur ab der Tabelle zurück Rechte Seite.

Zusamenfassend

Übereinstimmend + Links nicht übereinstimmend + Rechts nicht übereinstimmend = Vollständiger äußerer Join

Übereinstimmend + Nicht übereinstimmend gelassen = Linke äußere Verbindung

Übereinstimmend + Rechts nicht übereinstimmend = Rechte äußere Verbindung

Übereinstimmend = Innere Verbindung

In einfachen Worten,

1.INNER JOIN ODER EQUI JOIN: Gibt die Ergebnismenge zurück, die nur der Bedingung in beiden Tabellen entspricht.

2.ÄUSSERER JOIN: Gibt die Ergebnismenge aller Werte aus beiden Tabellen zurück, auch wenn eine Bedingungsübereinstimmung vorliegt oder nicht.

3.LINKS BEITRETEN: Gibt die Ergebnismenge aller Werte aus der linken Tabelle und nur der Zeilen zurück, die der Bedingung in der rechten Tabelle entsprechen.

4.RECHTS BEITRETEN: Gibt die Ergebnismenge aller Werte aus der rechten Tabelle und nur der Zeilen zurück, die der Bedingung in der linken Tabelle entsprechen.

5.Vollständiger Beitritt: Vollständiger Join und vollständiger äußerer Join sind identisch.

1.Innerer Join: Wird auch als Join bezeichnet.Es werden nur die Zeilen zurückgegeben, die sowohl in der linken als auch in der rechten Tabelle vorhanden sind wenn es eine Übereinstimmung gibt.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

output1

2.Vollständiger äußerer Join: Wird auch als Full Join bezeichnet.Es kehrt zurück alle Reihen sowohl in der linken als auch in der rechten Tabelle vorhanden.

Beispiel:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
FULL OUTER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

output2

3.Linke äußere Verbindung: Oder einfach als Left Join bezeichnet.Es gibt alle in der linken Tabelle vorhandenen Zeilen und übereinstimmende Zeilen aus der rechten Tabelle (falls vorhanden) zurück.

4.Rechter äußerer Join: Wird auch als Right Join bezeichnet.Es gibt übereinstimmende Zeilen aus der linken Tabelle (falls vorhanden) und alle in der rechten Tabelle vorhandenen Zeilen zurück.

joins

Vorteile von Joins

  1. Wird schneller ausgeführt.
  • Innerer Join - Ein innerer Join Wenn Sie eine der entsprechenden Abfragen verwenden, erhalten Sie den Schnittpunkt der beiden Tische, d.h.die beiden Reihen, die sie gemeinsam haben.

  • Linke äußere Verbindung - A Linke äußere Verbindung gibt alle Zeilen in A sowie alle gemeinsamen Zeilen in B an.

  • Vollständiger äußerer Join - A vollständiger äußerer Join gibt Ihnen die Vereinigung von A und B, d. h.Alle Zeilen in A und alle Zeilen in B.Wenn etwas in A kein entsprechendes Datum in B hat, dann ist der B-Teil null und umgekehrt

left join on (auch bekannt als left outer join on) kehrt zurück inner join on Reihen union all nicht übereinstimmende linke Tabellenzeilen, erweitert um Nullen.

right join (on aka right outer join on) kehrt zurück inner join on Reihen union all nicht übereinstimmende rechte Tabellenzeilen, erweitert um Nullen.

full join on (auch bekannt als full outer join on) kehrt zurück inner join on Reihenunion all nicht übereinstimmende linke Tabellenzeilen, erweitert um Nullen union all nicht übereinstimmende rechte Tabellenzeilen, erweitert um Nullen.

(SQL Standard 2006 SQL/Foundation 7.7 Syntaxregeln 1, Allgemeine Regeln 1 b, 3 c & d, 5 b.)

Also nicht outer join bis man weiß, was zugrunde liegt inner join ist involviert.


Finde es heraus welche Reihen inner join kehrt zurück.

Lesen Sie meine Kommentare, dort gibt es viele verwirrte und schlechte Antworten.

Dann lesen Sie hier meine Kommentare zu den vielen verwirrten und schlechten Antworten.

Der Unterschied zwischen Inner Join und Outer Join ist wie folgt:

  1. Inner Join ist ein Join, der Tabellen basierend auf übereinstimmenden Tupeln kombiniert, während Outer Join ein Join ist, der Tabellen basierend auf übereinstimmenden und nicht übereinstimmenden Tupeln kombiniert.
  2. Inner Join führt übereinstimmende Zeilen aus zwei Tabellen zusammen, wobei nicht übereinstimmende Zeilen weggelassen werden, während Outer Join Zeilen aus zwei Tabellen zusammenführt und nicht übereinstimmende Zeilen mit Nullwerten auffüllt.
  3. Inner Join ähnelt einer Schnittoperation, während Outer Join einer Vereinigungsoperation ähnelt.
  4. Es gibt zwei Arten von Inner-Joins, während es bei Outer-Joins drei Typen gibt.
  5. Inner Join ist langsamer, während Outer Join schneller ist als Inner Join.

Betrachten Sie die folgenden 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

Innerer Join:

Meistens als gerecht geschrieben VERBINDEN in SQL-Abfragen.Es werden nur die übereinstimmenden Datensätze zwischen den Tabellen zurückgegeben.

Finden Sie alle Mitarbeiter und deren Abteilungsnamen heraus:

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 nicht gedruckt EMP in der Ausgabe als dept_id 6 findet keine Übereinstimmung in der Abteilungstabelle.Ähnlich, HR Und R&D Zeilen werden nicht gedruckt Abteilung Tabelle, da sie keine Übereinstimmung in der Emp-Tabelle gefunden haben.

INNER JOIN oder einfach JOIN gibt also nur übereinstimmende Zeilen zurück.

LINKS BEITRETEN:

Dadurch werden alle Datensätze aus der LINKEN Tabelle und nur passende Datensätze aus der RECHTEN Tabelle zurückgegeben.

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 LINKEN Tabelle (Emp) mit nur passenden Datensätzen aus der RECHTEN Tabelle gedruckt.

HR Und R&D Zeilen werden nicht gedruckt Abteilung Tabelle, da in der Emp-Tabelle auf dept_id keine Übereinstimmung gefunden wurde.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top