Was ist das Standardverhalten von MySQL JOIN, INNER oder OUTER?


91

Also habe ich die letzte Stunde im Internet gesucht, gelesen und nach der endgültigen Antwort auf diese einfache Frage gesucht.

Was ist der Standard-JOIN in MySQL?

SELECT * FROM t1 JOIN t2

Ist das das gleiche wie

SELECT * FROM t1, t2

OR

SELECT * FROM t1 INNER JOIN t2

Auch eine verwandte Frage, wenn Sie "WHERE" -Klauseln verwenden, ist es dasselbe wie JOIN oder INNER JOIN?

Im Moment denke ich, dass ein eigenständiger JOIN mit der Verwendung von Kommas und WHERE-Klauseln identisch ist.

Antworten:


123

In MySQL bedeutet JOINunqualifiziertes Schreiben INNER JOIN. Mit anderen Worten ist das INNERIn INNER JOINoptional. INNERund CROSSsind Synonyme in MySQL. Aus Gründen der Klarheit schreibe ich JOINoder INNER JOINwenn ich eine Join-Bedingung habe undCROSS JOIN wenn ich keine Bedingung habe.

Die zulässige Syntax für Joins ist in der Dokumentation beschrieben .


Im Moment denke ich, dass ein eigenständiger JOIN nichts anderes ist als (identisch mit) die Verwendung von Kommas und WHERE-Klauseln.


Der Effekt ist der gleiche, aber die Geschichte dahinter ist anders. Die Kommasyntax entspricht dem ANSI-89-Standard. Es gibt jedoch eine Reihe von Problemen mit dieser Syntax, sodass im ANSI-92-Standard das Schlüsselwort JOIN eingeführt wurde.

Ich würde dringend empfehlen, immer die JOIN-Syntax anstelle des Kommas zu verwenden.

  • T1 JOIN T2 ON ... ist besser lesbar als T1, T2 WHERE ... .
  • Es ist wartbarer, da die Tabellenbeziehungen und Filter klar definiert und nicht miteinander vermischt sind.
  • Die JOIN-Syntax lässt sich leichter in OUTER JOIN konvertieren als die Kommasyntax.
  • Das Mischen der Komma- und JOIN-Syntax in derselben Anweisung kann aufgrund der Vorrangregeln zu merkwürdigen Fehlern führen.
  • Es ist weniger wahrscheinlich, dass bei Verwendung der JOIN-Syntax aufgrund einer vergessenen Join-Klausel versehentlich ein kartesisches Produkt erstellt wird, da die Join-Klauseln neben den Joins stehen und leicht zu erkennen ist, ob eine fehlt.

Süß, danke, dass du diese einfache Frage für mich geklärt hast :) In der Vergangenheit habe ich immer Kommas + where-Klauseln verwendet ... werde aber gemäß deinem Rat auf die Verwendung von JOINs umstellen. Vielen Dank
Quang Van

Hey Mark, was meinst du mit einer Mischung aus JOIN und Komma? Mischen Sie Abfragen wie diese, SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a = t1.a UND t3.b = t1.b UND t4.c = t1.c)?
Quang Van

2
@Quang: Dies wird zum Beispiel fehlschlagen:SELECT * FROM t1, t2 JOIN t3 ON t1.x=t3.y WHERE t1.a = t2.b
Mark Byers

0

Diese sind alle gleichwertig und auch gleich CROSS JOIN .

Es gibt einige Unterschiede zwischen der Verwendung von Komma und [INNER | CROSS] JOINSyntax, die beim Verknüpfen mehrerer Tabellen wichtig sein können. So ziemlich alles, was Sie wissen müssen, ist hier in der MySQL- JOINDokumentation beschrieben .


1
^ --- Antwort auf die Frage ist JOIN (Standalone) ist im Grunde das gleiche zu INNER und Komma + wo Klauseln
Quang Van
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.