Was ist der Unterschied zwischen linken, rechten, äußeren und inneren Verbindungen?


562

Ich frage mich, wie ich all diese verschiedenen Verknüpfungen unterscheiden kann ...



3
Hängt

6
Dies ist ein Duplikat von stackoverflow.com/questions/419375/sql-join-differences und zweifellos anderen ...
Cletus

1
Das hat mir sehr geholfen ... am einfachsten ist es, Testtische zu erstellen und mit ihnen zu spielen. = P
daGrevis

Antworten:


797

Einfaches Beispiel : Nehmen wir an, Sie haben eine StudentsTabelle und eine LockersTabelle. In SQL ist die erste Tabelle, die Sie in einem Join angeben Students, die Tabelle LEFT und die zweite Lockersdie Tabelle RIGHT .

Jeder Schüler kann einem Schließfach zugewiesen werden, sodass LockerNumberdie StudentTabelle eine Spalte enthält . Möglicherweise befindet sich mehr als ein Schüler in einem einzigen Schließfach. Insbesondere zu Beginn des Schuljahres haben Sie jedoch möglicherweise einige ankommende Schüler ohne Schließfächer und einige Schließfächer, denen keine Schüler zugewiesen sind.

Nehmen wir für dieses Beispiel an, Sie haben 100 Schüler , von denen 70 Schließfächer haben. Sie haben insgesamt 50 Schließfächer , von denen 40 mindestens 1 Schüler und 10 Schließfächer keinen Schüler haben.

INNER JOIN ist gleichbedeutend mit " Zeig mir alle Schüler mit Schließfächern ".
Alle Schüler ohne Schließfächer oder Schließfächer ohne Schüler fehlen.
Gibt 70 Zeilen zurück

LEFT OUTER JOIN wäre " zeig mir alle Schüler mit ihrem entsprechenden Schließfach, wenn sie eines haben ".
Dies kann eine allgemeine Schülerliste sein oder zur Identifizierung von Schülern ohne Schließfach verwendet werden.
Gibt 100 Zeilen zurück

RIGHT OUTER JOIN wäre " Zeig mir alle Schließfächer und die ihnen zugewiesenen Schüler, falls es welche gibt ".
Dies kann verwendet werden, um Schließfächer zu identifizieren, denen keine Schüler zugewiesen sind, oder Schließfächer, denen zu viele Schüler zugewiesen sind.
Gibt 80 Zeilen zurück (Liste von 70 Schülern in den 40 Schließfächern plus 10 Schließfächer ohne Schüler)

FULL OUTER JOIN wäre albern und wahrscheinlich nicht sehr nützlich.
Etwas wie " Zeig mir alle Schüler und alle Schließfächer und ordne sie zu, wo du kannst ".
Gibt 110 Zeilen zurück (alle 100 Schüler, einschließlich derer ohne Schließfächer. Plus die 10 Schließfächer ohne Schüler).

CROSS JOIN ist auch in diesem Szenario ziemlich dumm.
Das verknüpfte lockernumberFeld in der Schülertabelle wird nicht verwendet , sodass Sie im Grunde eine große riesige Liste aller möglichen Schüler-Schließfach-Paarungen erhalten, unabhängig davon, ob sie tatsächlich vorhanden sind oder nicht.
Gibt 5000 Zeilen zurück (100 Schüler x 50 Schließfächer). Könnte nützlich sein (mit Filterung) als Ausgangspunkt, um die neuen Schüler mit den leeren Schließfächern abzugleichen.


12
Anhand Ihres Beispiels ist der CROSS-Join als Ausgangspunkt für die Erstellung von Schließfachzuweisungen hilfreich: Beginnen Sie mit allen möglichen Kombinationen und verwenden Sie dann andere Kriterien, um die Ergebnisse aus der Liste zu filtern.
Joel Coehoorn

1
Gute Antwort. Ich glaube, Cross Join wird am häufigsten verwendet, um Testdaten aus wenigen Zeilen zu generieren, wenn Sie eine große Anzahl von Datensätzen benötigen.
Eli

6
FULL OUTER JOINS kann nützlich sein, wenn Sie nach verwaisten Daten suchen oder verschiedene Versionen desselben Datensatzes vergleichen.
Lara Dougan

3
Cross Join aka kartesisches Produkt
JavaRocky

3
Ich denke, wie Sie mit Ihrer Abfrage beginnen, wirkt sich auf das Ergebnis des Join-Typs aus. SELECT * FROM students RIGHT OUTER JOIN lockers...Dies würde beispielsweise zu einem anderen Ergebnis führen als SELECT * FROM lockers RIGHT OUTER JOIN students.... Tolle Antwort, aber ich würde gerne sehen, wie es mit vollständigen SQLFragen aktualisiert wird
jbmilgrom

141

Es gibt drei grundlegende Arten von Verknüpfungen:

  • INNERjoin vergleicht zwei Tabellen und gibt nur Ergebnisse zurück, wenn eine Übereinstimmung vorliegt. Datensätze aus der 1. Tabelle werden dupliziert, wenn sie mit mehreren Ergebnissen in der 2. Tabelle übereinstimmen. INNER-Joins neigen dazu, Ergebnismengen kleiner zu machen. Da Datensätze jedoch dupliziert werden können, ist dies nicht garantiert.
  • CROSSjoin vergleicht zwei Tabellen und gibt jede mögliche Kombination von Zeilen aus beiden Tabellen zurück. Mit dieser Art von Verknüpfung können Sie viele Ergebnisse erzielen, die möglicherweise nicht einmal von Bedeutung sind. Verwenden Sie sie daher mit Vorsicht.
  • OUTERjoin vergleicht zwei Tabellen und gibt Daten zurück, wenn eine Übereinstimmung verfügbar ist, oder andernfalls NULL-Werte. Wie beim INNER-Join werden dadurch Zeilen in der einen Tabelle dupliziert, wenn mehrere Datensätze in der anderen Tabelle übereinstimmen. OUTER-Joins neigen dazu, Ergebnismengen zu vergrößern, da sie selbst keine Datensätze aus der Menge entfernen. Sie müssen auch einen OUTER-Join qualifizieren, um zu bestimmen, wann und wo die NULL-Werte hinzugefügt werden sollen:
    • LEFT bedeutet, alle Datensätze aus der 1. Tabelle zu behalten, egal was passiert, und NULL-Werte einzufügen, wenn die 2. Tabelle nicht übereinstimmt.
    • RIGHT bedeutet das Gegenteil: Behalten Sie alle Datensätze aus der 2. Tabelle bei und fügen Sie NULL-Werte ein, wenn die 1. Tabelle nicht übereinstimmt.
    • FULL bedeutet, alle Datensätze aus beiden Tabellen beizubehalten und in jede Tabelle einen NULL-Wert einzufügen, wenn keine Übereinstimmung vorliegt.

Oft sehen Sie, dass das OUTERSchlüsselwort in der Syntax weggelassen wird. Stattdessen ist es nur "LEFT JOIN", "RIGHT JOIN" oder "FULL JOIN". Dies geschieht, weil INNER- und CROSS-Joins keine Bedeutung in Bezug auf LEFT, RIGHT oder FULL haben und diese für sich allein ausreichen, um einen OUTER-Join eindeutig anzuzeigen.

Hier ist ein Beispiel, wann Sie jeden Typ verwenden möchten:

  • INNER: Sie möchten alle Datensätze aus der Tabelle "Rechnung" zusammen mit den entsprechenden "Rechnungszeilen" zurückgeben. Dies setzt voraus, dass jede gültige Rechnung mindestens eine Zeile enthält.
  • OUTER: Sie möchten alle "InvoiceLines" -Datensätze für eine bestimmte Rechnung zusammen mit den entsprechenden "InventoryItem" -Datensätzen zurückgeben. Dies ist ein Unternehmen, das auch Service verkauft, sodass nicht alle InvoiceLines über ein IventoryItem verfügen.
  • CROSS: Sie haben eine Zifferntabelle mit 10 Zeilen, die jeweils die Werte '0' bis '9' enthalten. Sie möchten eine Datumsbereichstabelle erstellen, für die eine Verknüpfung erstellt werden soll, sodass Sie für jeden Tag innerhalb des Bereichs einen Datensatz erhalten. Durch wiederholtes CROSS-Verknüpfen dieser Tabelle mit sich selbst können Sie so viele aufeinanderfolgende Ganzzahlen erstellen, wie Sie benötigen (vorausgesetzt, Sie beginnen bei 10 bis 1. Potenz, addiert jede Verknüpfung 1 zum Exponenten). Verwenden Sie dann die Funktion DATEADD (), um diese Werte zu Ihrem Basisdatum für den Bereich hinzuzufügen.

1
Nett. Ich würde das normalerweise nur hinzufügen, wenn Sie nur 'JOIN' schreiben, bedeutet dies INNER JOIN.
Matpop

47

Es gibt nur 4 Arten:

  1. Inner Join : Der häufigste Typ. Für jedes Paar von Eingabezeilen, die mit den Verknüpfungsbedingungen übereinstimmen, wird eine Ausgabezeile erstellt.
  2. Linke äußere Verknüpfung : Die gleiche wie eine innere Verknüpfung, mit der Ausnahme , dass , wenn es eine Zeile , für die keine passenden Zeile in der Tabelle auf der rechten Seite festgestellt werden kann, ist eine Zeile ausgegeben , um die Werte aus der Tabelle auf der linken Seite, mit enthalten NULLfür jede Wert in der Tabelle rechts. Dies bedeutet, dass jede Zeile aus der Tabelle links mindestens einmal in der Ausgabe angezeigt wird.
  3. Rechter äußerer Join : Entspricht einem linken äußeren Join, außer dass die Rollen der Tabellen vertauscht sind.
  4. Vollständige äußere Verknüpfung : Eine Kombination aus linker und rechter äußerer Verknüpfung. Jede Zeile aus beiden Tabellen wird mindestens einmal in der Ausgabe angezeigt.

Ein "Cross Join" oder "Cartesian Join" ist einfach ein innerer Join, für den keine Join-Bedingungen angegeben wurden, was dazu führt, dass alle Zeilenpaare ausgegeben werden.

Vielen Dank an RusselH für den Hinweis auf FULL Joins, die ich weggelassen hatte.


1
Was ist mit Full Outer Join und Cross Join (kartesisches Produkt)?
SQLMenace

voll ist wirklich das Äquivalent von zwei äußeren
Verknüpfungen

25
VOLL ist das, was Sie erhalten, wenn Sie Ihre innere Verbindung vermasseln und dann hier eine Frage stellen: "Warum bekomme ich N ^ 2 Zeilen anstelle von N"? Dann bekommt jeder CROSS auf dich.
Paul Tomblin

24

SQL JOINS Unterschied:

Sehr einfach zu merken:

INNER JOIN Nur Datensätze anzeigen, die beiden Tabellen gemeinsam sind.

OUTER JOIN Der gesamte Inhalt der beiden Tabellen wird zusammengeführt, entweder wenn sie übereinstimmen oder nicht.

LEFT JOINist dasselbe wie LEFT OUTER JOIN- (Wählen Sie Datensätze aus der ersten Tabelle (ganz links) mit übereinstimmenden Datensätzen der rechten Tabelle aus.)

RIGHT JOINist dasselbe wie RIGHT OUTER JOIN- (Datensätze aus der zweiten Tabelle (ganz rechts) mit übereinstimmenden Datensätzen für die linke Tabelle auswählen.)

Geben Sie hier die Bildbeschreibung ein


Es gibt eine korrekte und relevante Möglichkeit, die Venn-Diagrammkreise zu kennzeichnen, aber das ist es nicht. Die Kreise sind nicht die Eingabetabellen. Auch die Ergebniszeilen sind keine Eingabezeilen, daher ist Ihre Beschreibung dort falsch. Auch das ist einfach nicht klar - Sie erklären nicht "gemeinsam für beide", "übereinstimmend", "zusammengeführt".
Philipxy

9

Schauen Sie sich Join (SQL) auf Wikipedia an

  • Innerer Join - Bei zwei Tabellen gibt ein innerer Join alle Zeilen zurück, die in beiden Tabellen vorhanden sind
  • linker / rechter (äußerer) Join - Bei zwei Tabellen werden alle Zeilen zurückgegeben, die entweder in der linken oder rechten Tabelle Ihres Joins vorhanden sind, und die Zeilen von der anderen Seite werden zurückgegeben, wenn die Join-Klausel übereinstimmt oder für null null zurückgegeben wird diese Spalten

  • Full Outer - Bei zwei Tabellen werden alle Zeilen zurückgegeben und Nullen zurückgegeben, wenn entweder die linke oder die rechte Spalte nicht vorhanden ist

  • Cross Joins - Kartesische Joins und können gefährlich sein, wenn sie nicht sorgfältig verwendet werden


6

Es könnte hilfreich sein, es sichtbarer zu machen. Ein Beispiel:

Tabelle 1:

ID_STUDENT STUDENT_NAME

1               Raony
2               Diogo
3               Eduardo
4               Luiz

Tabelle 2:

ID_STUDENT LOCKER

3               l1
4               l2
5               l3

Was ich bekomme, wenn ich es tue:

-Inner join of Table 1 and Table 2: 

    - Inner join returns both tables merged only when the key 
      (ID_STUDENT) exists in both tables

    ID_STUDENT       STUDENT_NAME      LOCKER   

        3               Eduardo          l1
        4               Luiz             l2

-Left join of Table 1 and Table 2:

    - Left join merges both tables with all records form table 1, in 
      other words, there might be non-populated fields from table 2

    ID_ESTUDANTE    NOME_ESTUDANTE     LOCKER   

        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2

-Right join of table 1 and table 2:

    - Right join merges both tables with all records from table 2, in 
      other words, there might be non-populated fields from table 1

    ID_STUDENT        STUDENT_NAME     LOCKER   

        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

-Outter join of table 1 and table 2:

    - Returns all records from both tables, in other words, there
      might be non-populated fields either from table 1 or 2.

    ID_STUDENT        STUDENT_NAME     LOCKER   
        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

4

LEFT JOINund RIGHT JOINsind Arten von OUTER JOINs.

INNER JOIN ist die Standardeinstellung - Zeilen aus beiden Tabellen müssen mit der Verknüpfungsbedingung übereinstimmen.


5
Ich kann nicht glauben, dass diese Antwort viele positive Stimmen hat und gleichzeitig so unvollständig ist.
nbro

Ich denke, es war eine bessere Antwort auf die ursprüngliche Frage.
RussellH

3

Innerer Join : Zeigt nur Zeilen an, wenn Daten aus beiden Tabellen vorhanden sind.

Outer - Joins : (links / rechts) : Zeigt alle ergeben sich aus der linken / rechten Tabelle mit den paarigen Zeile ( n ), wenn es vorhanden ist oder nicht.


2

Zuerst muss man verstehen, was Join macht. Wir verbinden mehrere Tabellen und erhalten ein bestimmtes Ergebnis aus den verknüpften Tabellen. Der einfachste Weg, dies zu tun, ist Cross Join .

Nehmen wir an, Tabelle A hat zwei Spalten A und B. Und Tabelle B hat drei Spalten C und D. Wenn wir Cross Join anwenden, wird eine Menge bedeutungsloser Zeilen erzeugt. Dann müssen wir mit dem Primärschlüssel übereinstimmen, um die tatsächlichen Daten zu erhalten.

Links: Es werden alle Datensätze aus der linken Tabelle und übereinstimmende Datensätze aus der rechten Tabelle zurückgegeben.

Rechts: Es wird entgegengesetzt zu Left Join zurückkehren. Es werden alle Datensätze aus der rechten Tabelle und übereinstimmende Datensätze aus der linken Tabelle zurückgegeben.

Inner: Das ist wie eine Kreuzung. Es werden nur übereinstimmende Datensätze aus beiden Tabellen zurückgegeben.

Außen: Und das ist wie eine Vereinigung. Es werden alle verfügbaren Datensätze aus beiden Tabellen zurückgegeben.

Manchmal benötigen wir nicht alle Daten, und wir sollten auch nur gemeinsame Daten oder Datensätze benötigen. Mit diesen Join-Methoden können wir es leicht bekommen. Denken Sie daran, dass linker und rechter Join auch äußerer Join sind.

Sie können alle Datensätze nur mit Cross Join abrufen. Aber es könnte teuer sein, wenn es um Millionen von Datensätzen geht. Machen Sie es sich einfach, indem Sie die linke, rechte, innere oder äußere Verbindung verwenden.

Vielen Dank

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.