LEFT JOIN vs. LEFT OUTER JOIN in SQL Server

1595

Was ist der Unterschied zwischen LEFT JOINund LEFT OUTER JOIN?

KG Sosa
quelle
213
Keiner! Das OUTERSchlüsselwort ist optional.
Jarlh
9
Venn-Diagramme sind für die Beantwortung dieser Frage nicht geeignet. Die Antwort auf diese Frage lautet Keine . Siehe den ersten Kommentar.
Philipxy
3
Venn-Diagramme veranschaulichen den Unterschied in den Ausgabezeilen für Sonderfälle der inneren und äußeren Verbindung . Wenn keine Nullen oder doppelten Zeilen eingegeben werden (wir können also eine Tabelle als eine Reihe von zeilenwertigen Werten betrachten und die normale mathematische Gleichheit verwenden), enthalten linke und rechte Kreise Ausgabetabellen / Sätze von linken und rechten Verknüpfungen . Wenn jedoch Nullen oder doppelte Zeilen eingegeben werden, ist es so schwierig zu erklären, was die Kreise sind und wie sich diese Sätze auf Eingabe- und Ausgabetabellen / -taschen beziehen, dass Venn-Diagramme nicht hilfreich sind. Siehe meine Kommentare hier zu anderen Venn-Diagrammmissbräuchen.
Philipxy

Antworten:

2237

Gemäß Dokumentation: FROM (Transact-SQL) :

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

Das Schlüsselwort OUTERist als optional markiert (in eckigen Klammern eingeschlossen). In diesem speziellen Fall spielt es OUTERkeine Rolle , ob Sie angeben oder nicht. Beachten Sie, dass , während die anderen Elemente der Join - Klausel auch als optional markiert, so dass sie aus wird einen Unterschied machen.

Beispielsweise ist der gesamte Typteil der JOINKlausel optional. In diesem Fall ist die Standardeinstellung, INNERwenn Sie nur angeben JOIN. Mit anderen Worten, das ist legal:

SELECT *
FROM A JOIN B ON A.X = B.Y

Hier ist eine Liste äquivalenter Syntaxen:

A LEFT JOIN B            A LEFT OUTER JOIN B
A RIGHT JOIN B           A RIGHT OUTER JOIN B
A FULL JOIN B            A FULL OUTER JOIN B
A INNER JOIN B           A JOIN B

Schauen Sie sich auch die Antwort an, die ich auf diese andere SO-Frage hinterlassen habe : SQL Left Join gegen mehrere Tabellen in der FROM-Zeile? .

Geben Sie hier die Bildbeschreibung ein

Lasse V. Karlsen
quelle
135
Absolut korrekt. OUTER ist aus Gründen der ANSI-92-Kompatibilität zulässig.
Sean Reilly
11
@ LasseV.Karlsen wäre es nicht besser, INNER JOINrechts und JOINlinks in der Liste der Äquivalente zu haben?
Nawfal
8
@ LasseV.Karlsen Ich meinte nur, dass die linke Seite die prägnante Form und die rechte Seite die erweiterte Form hat. Ich dachte, es würde es kohärent machen, wenn Sie dasselbe auch für JOINs befolgen würden .
Nawfal
30
@Outlier Das ist dein Vorrecht, aber 451 andere Leute fanden die Antwort eindeutig gut. Um ehrlich zu sein, wenn eine Antwort X sagt und eine andere Antwort X sagt und auf die Dokumentation verweist sowie die relevanten Teile der Dokumentation in die Antwort kopiert, geht meine Stimme zur zweiten Antwort und deshalb schreibe ich meine Antworten so Ich mache. Dass jemand X behauptet, ist nicht gut. Wenn Sie X beweisen können, ist das besser (nicht zu leicht die Antwort von sactiw). Aber es ist Ihr Vorrecht, zu denken, was Sie wollen. Ich frage mich, warum Sie es für sinnlos halten. Ist die Antwort in irgendeiner Weise falsch?
Lasse V. Karlsen
7
@Outlier Und um ehrlich zu sein, wenn Sie keine Lust haben, meine "langen" Antworten zu lesen, dann war meine Antwort nichts für Sie. Es ist für alle anderen, die hierher kommen und sich über das Gleiche wundern und Hintergrundinformationen darüber wünschen, warum das so ist und wo sie weitere Informationen usw. finden können. Natürlich sind Sie der Typ, der diese Antwort haben möchte: "Keine", aber leider dies ist hier auf Stack Overflow keine legale Antwort und sollte es auch nicht sein.
Lasse V. Karlsen
700

Um Ihre Frage zu beantworten, gibt es keinen Unterschied zwischen LEFT JOIN und LEFT OUTER JOIN. Sie sind genau die gleichen wie ...

Auf der obersten Ebene gibt es hauptsächlich drei Arten von Verknüpfungen:

  1. INNERE
  2. ÄUSSERE
  3. KREUZ

  1. INNER JOIN - ruft Daten ab, wenn sie in beiden Tabellen vorhanden sind.

  2. Es gibt drei Arten von OUTER JOIN :

    1. LEFT OUTER JOIN - ruft Daten ab, falls in der linken Tabelle vorhanden.
    2. RIGHT OUTER JOIN - ruft Daten ab, falls in der rechten Tabelle vorhanden.
    3. FULL OUTER JOIN - ruft Daten ab, wenn sie in einer der beiden Tabellen vorhanden sind.
  3. CROSS JOIN verbindet , wie der Name schon sagt [n X m], alles mit allem.
    Ähnlich wie in einem Szenario, in dem wir die zu verbindenden Tabellen einfach auflisten (in der FROMKlausel der SELECTAnweisung) und sie durch Kommas trennen.


Zu beachtende Punkte:

  • Wenn Sie nur erwähnen, JOINdann ist es standardmäßig ein INNER JOIN.
  • Ein OUTERJoin muss LEFT| sein RIGHT| FULLdas kann man nicht einfach sagen OUTER JOIN.
  • Sie können das OUTERSchlüsselwort löschen und einfach LEFT JOINoder RIGHT JOINoder sagen FULL JOIN.

Für diejenigen, die diese besser visualisieren möchten, gehen Sie bitte zu diesem Link: Eine visuelle Erklärung der SQL-Joins

sactiw
quelle
17
Sehr gute Antwort. Es wird klarer, wenn Sie sagen "LEFT OUTER JOIN - ruft alle Daten aus der linken Tabelle mit übereinstimmenden Daten von rechts ab, falls voreingestellt." für 2.1 (und ähnliche Änderung für 2.2)
ssh
1
Sie können Cross Cross auch durchführen, indem Sie einfach 'aus Tabelle A, Tabelle B auswählen'
om471987
3
Tut mir leid, wenn ich necrobumping bin, aber ist CROSS JOINdas das gleiche wie FULL JOIN?
TechnicalTophat
9
@RhysO nein, CROSS JOIN ist ein kartesisches Produkt, dh CROSS JOIN einer Tabelle mit n Zeilen, wobei eine Tabelle mit m Zeilen immer (n * m) Zeilen ergibt, während FULL OUTER JOIN einer Tabelle mit n Zeilen, mit einer Tabelle, die m Zeilen hat, wird bei max (n + m) Zeilen geben
sactiw
1
@sactiw erwägen, Ihrer wertvollen Antwort einen besonderen Hinweis über den Unterschied zwischen Cross Joinund Full Outer Join... hinzuzufügen, der in gewisser Weise ähnlich erscheint.
Manuel Jordan
356

Was ist der Unterschied zwischen linker Verknüpfung und linker äußerer Verknüpfung?

Nichts . LEFT JOINund LEFT OUTER JOINsind gleichwertig.

Mitch Wheat
quelle
13
ähm hallo! Wer hat das abgelehnt? LEFT JOIN ist dasselbe wie LEFT OUTER JOIN.
Mitch Wheat
7
Dies ist in Microsoft SQL Server und allen anderen SQL-kompatiblen RDBMS der Fall.
Bill Karwin
7
Es wäre schön, wenn Sie eine Referenz oder Erklärung hinzufügen würden, warum das OUTERoptional ist.
Zero3
7
Die prägnanteste und genaueste Antwort hier.
Manachi
4
Vielen Dank. Die akzeptierte Antwort enthielt viel zu viele Informationen, die mich verwirrter machten. Genau das musste ich wissen und beantwortete die ursprüngliche Frage direkt auf den Punkt.
Bacon Brad
66

Ich bin ein PostgreSQL-DBA, soweit ich den Unterschied zwischen äußeren und nicht äußeren Verknüpfungen verstehen kann, ist der Unterschied ein Thema, über das im Internet viel diskutiert wird. Bis heute habe ich nie einen Unterschied zwischen diesen beiden gesehen; Also ging ich weiter und versuche den Unterschied zwischen diesen zu finden. Am Ende habe ich die gesamte Dokumentation darüber gelesen und die Antwort darauf gefunden:

Wenn Sie sich also die Dokumentation ansehen (zumindest in PostgreSQL), finden Sie diesen Satz:

„Die Worte INNERund OUTERsind in allen Formen optional. INNERIst die Standardeinstellung; LEFT, RIGHTund FULLimplizieren eine äußere Verknüpfung.“

In anderen Worten,

LEFT JOINund sind die LEFT OUTER JOINgleichen

RIGHT JOINund sind die RIGHT OUTER JOINgleichen

Ich hoffe, es kann ein Beitrag für diejenigen sein, die immer noch versuchen, die Antwort zu finden.

andrefsp
quelle
60

Left Joinund Left Outer Joinsind ein und dasselbe . Ersteres ist die Abkürzung für Letzteres. Gleiches gilt für die Right Joinund Right Outer JoinBeziehung. Die Demonstration wird die Gleichheit veranschaulichen. Arbeitsbeispiele für jede Abfrage wurden über SQL Fiddle bereitgestellt . Dieses Tool ermöglicht die praktische Bearbeitung der Abfrage.

Gegeben

Geben Sie hier die Bildbeschreibung ein

Left Join und Left Outer Join

Geben Sie hier die Bildbeschreibung ein

Ergebnisse

Geben Sie hier die Bildbeschreibung ein


Right Join und Right Outer Join

Geben Sie hier die Bildbeschreibung ein

Ergebnisse

Geben Sie hier die Bildbeschreibung ein

Arbeite klüger
quelle
43

Ich finde es einfacher, an Joins in der folgenden Reihenfolge zu denken:

  • CROSS JOIN - ein kartesisches Produkt beider Tabellen. ALLE Joins beginnen hier
  • INNER JOIN - ein CROSS JOIN mit einem hinzugefügten Filter.
  • OUTER JOIN - ein INNER JOIN mit fehlenden Elementen (entweder aus der Tabelle LINKS oder RECHTS), die anschließend hinzugefügt werden.

Bis ich dieses (relativ) einfache Modell herausgefunden habe, waren JOINS immer eher eine schwarze Kunst. Jetzt machen sie vollkommen Sinn.

Hoffe das hilft mehr als es verwirrt.

Frozenjim
quelle
Dies beantwortet die Frage nicht.
philipxy
33

Warum sind LINKS / RECHTS und LINKS AUSSEN / RECHTS AUSSEN gleich? Lassen Sie uns erklären, warum dieses Vokabular. Verstehen Sie, dass Verknüpfungen LINKS und RECHTS spezielle Fälle der Verknüpfung OUTER sind und daher nichts anderes als OUTER LEFT / OUTER RIGHT sein können. Der OUTER-Join wird auch als FULL OUTER bezeichnet, im Gegensatz zu LEFT- und RIGHT-Joins, die TEILWEISE des OUTER-Joins sind. Tatsächlich:

Table A | Table B     Table A | Table B      Table A | Table B      Table A | Table B
   1    |   5            1    |   1             1    |   1             1    |   1
   2    |   1            2    |   2             2    |   2             2    |   2
   3    |   6            3    |  null           3    |  null           -    |   -
   4    |   2            4    |  null           4    |  null           -    |   -
                        null  |   5             -    |   -            null  |   5
                        null  |   6             -    |   -            null  |   6

                      OUTER JOIN (FULL)     LEFT OUTER (partial)   RIGHT OUTER (partial)

Es ist jetzt klar, warum diese Operationen Aliase haben, und es ist klar, dass nur drei Fälle existieren: INNER, OUTER, CROSS. Mit zwei Unterfällen für den OUTER. Das Vokabular, die Art und Weise, wie Lehrer dies erklären, sowie einige der obigen Antworten lassen es oft so aussehen, als gäbe es viele verschiedene Arten von Verbindungen. Aber es ist eigentlich sehr einfach.

Yugo Amaryl
quelle
1
"Es ist klar, dass nur 3 Fälle existieren": interessant, aber fehlerhaft. Bedenken Sie, dass ein innerer Join ein spezialisierter Cross-Join ist (dh Prädikate zum Verschieben des Joins zur where-Klausel). Beachten Sie außerdem, dass der äußere Join überhaupt kein Join ist, sondern eine Vereinigung, bei der Nullen anstelle von 'fehlenden' Spalten verwendet werden. Daher könnte argumentiert werden, dass cross der einzige erforderliche Join ist. Beachten Sie, dass in der relationalen Theorie derzeit davon ausgegangen wird, dass die natürliche Verknüpfung alle Verknüpfungsanforderungen erfüllt. Nebenbei: Können Sie erklären, ob / wie das Vokabular " JOINimpliziert INNER JOIN" zu Ihrer Argumentation für das äußere Join- Vokabular passt?
Tag, wenn
27

Zur Beantwortung Ihrer Frage

In SQL Server-Joins ist die Syntax OUTER optional

Es wird im msdn-Artikel erwähnt: https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

Die folgende Liste zeigt also gleichwertige Join-Syntaxen mit und ohne OUTER

LEFT OUTER JOIN => LEFT JOIN
RIGHT OUTER JOIN => RIGHT JOIN
FULL OUTER JOIN => FULL JOIN

Andere äquivalente Syntaxen

INNER JOIN => JOIN
CROSS JOIN => ,

Dotnet Mob Artice wird dringend empfohlen: Tritt SQL Server bei Geben Sie hier die Bildbeschreibung ein

Masse
quelle
2
Zum Missbrauch von Venn-Diagrammen hier siehe meinen Kommentar zur Frage.
philipxy
20

Es gibt nur 3 Joins:

  • A) Cross Join = kartesisch (zB: Tabelle A, Tabelle B)
  • B) Inner Join = JOIN (zB: Tabelle A Join / Inner Join Tabelle B)
  • C) Äußere Verbindung:

       There are three type of outer join
       1)  Left Outer Join     = Left Join
       2)  Right Outer Join    = Right Join
       3)  Full Outer Join     = Full Join    

Hoffe es würde helfen.

Delickate
quelle
1
Also 5 schließt sich insgesamt an.
Zeek2
19

Es gibt hauptsächlich drei Arten von JOIN

  1. Inner: Ruft Daten ab, die in beiden Tabellen vorhanden sind
    • Nur JOIN bedeutet INNER JOIN
  2. Außen: Es gibt drei Arten

    • LEFT OUTER - - ruft Daten ab, die nur in der linken Tabelle und im Übereinstimmungszustand vorhanden sind
    • RECHTS AUSSEN - - Ruft Daten ab, die nur in der richtigen Tabelle und im passenden Zustand vorhanden sind
    • FULL OUTER - - Ruft Daten ab, die eine oder beide Tabellen enthalten
    • (LINKS oder RECHTS oder VOLL) OUTER JOIN kann geschrieben werden, ohne "OUTER" zu schreiben.
  3. Cross Join: Verbindet alles mit allem

Hart
quelle
16

Syntaktischer Zucker macht dem Gelegenheitsleser klarer, dass der Join kein innerer ist.

Ungeschnitten
quelle
2
Also ... was ist dann ein FULL OUTER JOIN?
Amy B
5
tableA FULL OUTER JOIN tableB gibt Ihnen drei Arten von Datensätzen: alle Datensätze in Tabelle A ohne übereinstimmenden Datensatz in Tabelle B, alle Datensätze in Tabelle B ohne übereinstimmenden Datensatz in Tabelle A und alle Datensätze in Tabelle A mit einem übereinstimmenden Datensatz in Tabelle B.
Dave DuPlantis
4

Nur im Zusammenhang mit dieser Frage möchte ich auch die 2 'APPLY'-Operatoren posten:

JOINS :

  1. INNER JOIN = JOIN

  2. OUTER JOIN

    • LEFT OUTER JOIN = LEFT JOIN

    • RIGHT OUTER JOIN = RIGHT JOIN

    • FULL OUTER JOIN = FULL JOIN

  3. CROSS JOIN

SELF-JOIN : Dies ist nicht gerade eine separate Art von Join. Dies bedeutet im Grunde, eine Tabelle mit einer der oben genannten Verknüpfungen mit sich selbst zu verbinden. Ich war jedoch der Meinung, dass es im Zusammenhang mit JOIN-Diskussionen erwähnenswert ist, da Sie diesen Begriff von vielen Mitgliedern der SQL Developer-Community hören werden.

BEWERBEN :

  1. CROSS APPLY - Ähnlich wie INNER JOIN (hat jedoch den Vorteil hinzugefügt, dass für jede Zeile der linken Tabelle etwas in der rechten Tabelle berechnet werden kann und nur die übereinstimmenden Zeilen zurückgegeben werden).
  2. OUTER APPLY - Ähnlich wie LEFT OUTER JOIN (hat jedoch den Vorteil, dass für jede Zeile der linken Tabelle etwas in der rechten Tabelle berechnet werden kann und alle Zeilen aus der linken Tabelle zurückgegeben werden, unabhängig von einer Übereinstimmung in der rechten Tabelle).

https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

https://sqlhints.com/2016/10/23/outer-apply-in-sql-server/

Beispiel aus der Praxis, wann OUTER / CROSS APPLY in SQL verwendet werden soll

Ich finde den APPLY-Operator sehr vorteilhaft, da er eine bessere Leistung bietet als die gleiche Berechnung in einer Unterabfrage. Sie ersetzen auch viele analytische Funktionen in älteren Versionen von SQL Server. Aus diesem Grund glaube ich, dass ein SQL-Entwickler, nachdem er sich mit JOINS vertraut gemacht hat, versuchen sollte, als nächstes die APPLY-Operatoren zu lernen.

san
quelle