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?

driis
quelle
2
Siehe diese Frage: < stackoverflow.com/questions/448023?sort=newest >
Joel Coehoorn
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.

Palehorse
quelle
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 .

Quassnoi
quelle
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.)

net_prog
quelle
59

Unterscheidet es sich zwischen verschiedenen SQL-Implementierungen?

Ja, Microsoft Access erlaubt nicht nur join. Es erfordert inner join.

Michał Powaga
quelle
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
Kristen
quelle
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

Martin Smith
quelle