Unterschied zwischen JOIN und INNER JOIN


999

Beide Verknüpfungen führen zu denselben Ergebnissen:

SELECT * FROM table JOIN otherTable ON table.ID = otherTable.FK

vs.

SELECT * FROM table INNER JOIN otherTable ON table.ID = otherTable.FK

Gibt es einen Unterschied zwischen den Aussagen in Bezug auf die Leistung oder auf andere Weise?

Unterscheidet es sich zwischen verschiedenen SQL- Implementierungen?



6
Als Randnotiz: CROSS JOIN ist ein gut bekannter Join-Typ (er unterscheidet sich von INNER JOIN).
Serge

Antworten:


1093

Sie sind funktional gleichwertig, INNER JOINkönnen jedoch etwas klarer zu lesen sein, insbesondere wenn in der Abfrage andere Verknüpfungstypen (dh LEFToder RIGHToder CROSS) enthalten sind.


11
Gilt dies für alle Datenbanken (z. B. SQL, Postgres?). Kennt jemand einen Link zu der Dokumentation, die dies erklärt?
Chogg


14
Die Abfrage ist klar genug, wenn Sie JOIN schreiben. INNER ist nur Rauschen.
Ivanzinho

22
Vielleicht bin ich Purist, aber ich denke, es ist besser, beim Schreiben von SQL explizit als implizit zu sein. INNER JOIN ist insbesondere bei komplexen Abfragen besser lesbar.
Bruceskyaus

3
@Ivanzinho: Tastaturanschläge sind kein Maß für die Abfrage- oder Programmkomplexität. Die Komplexität des realen Lebens ergibt sich aus der Wartbarkeit, bei der die Lesbarkeit eine wichtige Rolle spielt. Die Tatsache, dass Sie, wenn INNER JOIN steht, sicher sein können, was es tut, und dass es genau das sein soll, während ein einfacher JOIN Sie oder jemand anderen dazu bringt, sich zu fragen, was der Standard über die Implementierung gesagt hat und was INNER war / AUSSEN / LINKS versehentlich oder absichtlich weggelassen.
Tuukka Haapaniemi

243

Nein, es gibt keinen Unterschied, reiner syntaktischer Zucker .


22
Ich würde diesen syntaktischen Zucker nicht nennen. Join-Typ "Standard", "Kurzschrift" oder "Alias".
mk12

62
In der Informatik ist syntaktischer Zucker eine Syntax innerhalb einer Programmiersprache, die das Lesen oder Ausdrücken erleichtern soll . Ich glaube, dass die Fähigkeit zum Auslassen INNERunter diese Definition fällt.
Quassnoi

14
Wenn Sie die Definition sehr wörtlich anwenden, ja, aber ich habe immer gesehen, dass sie interessanteren Syntaxarten vorbehalten ist, nicht nur alternativen Namen für Dinge.
mk12

10
@Quassnoi die bloße Tatsache , dass diese Frage gestellt wird, zeigt die Abwesenheit von INNERnicht nicht macht die Abfrage leichter zu lesen. Soweit ich weiß, JOINkönnte das durchaus bedeuten, LEFT JOINwenn die Antworten hier nicht aufklären würden.
Martennis

2
@Quassnoi Die zitierte einleitende Wiki-Aussage Ihres Kommentars gilt für syntaktischen Zucker, ist aber als Definition unzureichend. Beim syntaktischen Zuckern geht es um eine einfachere Syntax für spezielle Fälle komplexer Syntax. Es ist angemessener zu sagen, dass INNER ein "Rauschwort" ist.
Philipxy

143

INNER JOIN = JOIN

INNER JOIN ist die Standardeinstellung, wenn Sie den Typ nicht angeben, wenn Sie das Wort JOIN verwenden.

Sie können auch LEFT OUTER JOIN oder RIGHT OUTER JOIN verwenden. In diesem Fall ist das Wort OUTER optional, oder Sie können CROSS JOIN angeben.

ODER

Für einen inneren Join lautet die Syntax:

SELECT ...
FROM TableA
[INNER] JOIN TableB

(Mit anderen Worten, das Schlüsselwort "INNER" ist optional - die Ergebnisse sind mit oder ohne identisch.)



54

Ähnlich OUTER JOINsist das Wort "OUTER"mit optional. Es ist das Schlüsselwort LEFToder RIGHT, das das JOINan macht "OUTER" JOIN.

Aus irgendeinem Grund benutze ich jedoch immer "OUTER"wie in LEFT OUTER JOINund nie LEFT JOIN, aber ich benutze nie , sondern ich benutze INNER JOINnur "JOIN":

SELECT ColA, ColB, ...
FROM MyTable AS T1
     JOIN MyOtherTable AS T2
         ON T2.ID = T1.ID
     LEFT OUTER JOIN MyOptionalTable AS T3
         ON T3.ID = T1.ID

23
Ich bin das Gegenteil von dir: Ich sage immer "INNER JOIN", aber ich benutze nie OUTER; also "LEFT JOIN" und "RIGHT JOIN". Ich schätze, ich halte nur meine Charakterzahlen konstant!
Stephen Holt

10
@ Jonathan. Es gibt kein Konzept der Richtung auf einer inneren Verbindung. Äußere Verknüpfungen können zu nicht übereinstimmenden Ergebnismengen führen, die je nach Richtung variieren können. Innen müssen angepasst werden, damit die Richtung keine Rolle spielt.
Karl Kieninger

32

Wie in den anderen Antworten bereits angegeben, gibt es in Ihrem Beispiel keinen Unterschied.

Die relevante Grammatik ist hier dokumentiert

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

Zeigen, dass alle optional sind. Die Seite verdeutlicht dies weiter

INNERGibt an, dass alle übereinstimmenden Zeilenpaare zurückgegeben werden. Verwirft nicht übereinstimmende Zeilen aus beiden Tabellen. Wenn kein Join-Typ angegeben ist, ist dies die Standardeinstellung .

Die Grammatik funktioniert zeigt auch , dass es eine Zeit ist , wo das INNER ist allerdings erforderlich. Bei Angabe eines Join-Hinweises.

Siehe das folgende Beispiel

CREATE TABLE T1(X INT);
CREATE TABLE T2(Y INT);

SELECT *
FROM   T1
       LOOP JOIN T2
         ON X = Y;

SELECT *
FROM   T1
       INNER LOOP JOIN T2
         ON X = Y;

Geben Sie hier die Bildbeschreibung ein

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.