it-swarm.com.de

Was ist der Unterschied zwischen durch Kommas getrennten Joins und Join-on-Syntax in MySQL?

Wenn ich zum Beispiel eine Tabelle "Person" mit einer Spalte "id" hätte, die auf eine Spalte "id" in der Tabelle "Worker" verweist

Was wäre der Unterschied zwischen diesen beiden Abfragen? Sie liefern die gleichen Ergebnisse.

SELECT * 
FROM Person 
JOIN Worker 
  ON Person.id = Worker.id;

und

SELECT * 
FROM Person, 
     Worker 
WHERE Person.id = Worker.id;

Vielen Dank

83
Big Money

Es gibt überhaupt keinen Unterschied.

Durch die zweite Darstellung wird die Lesbarkeit der Abfrage verbessert und es wird deutlich, welcher Join welcher Bedingung entspricht.

48
sateesh

Die Abfragen sind logisch äquivalent. Der Komma-Operator entspricht einem [INNER] JOIN Operator.

Das Komma ist der Join-Operator älteren Stils. Das Schlüsselwort JOIN wurde später hinzugefügt und wird bevorzugt, da es auch OUTER-Join-Operationen ermöglicht.

Außerdem können die Join-Prädikate (Bedingungen) von der WHERE -Klausel in eine ON -Klausel getrennt werden. Das verbessert die (menschliche) Lesbarkeit.


[~ # ~] Follow-up [~ # ~]

Diese Antwort besagt, dass die beiden Fragen in der Frage gleichwertig sind. Wir sollten die Kommasyntax der alten Schule für Verknüpfungsoperationen nicht mit der neueren JOIN Schlüsselwortsyntax in derselben Abfrage mischen. Wenn wir sie mischen, müssen wir uns eines Unterschieds in der Rangfolge bewusst sein.

auszug aus dem MySQL-Referenzhandbuch

https://dev.mysql.com/doc/refman/5.6/en/join.html

INNER JOIN und , (Komma) sind in Abwesenheit einer Verknüpfungsbedingung semantisch äquivalent: Beide erzeugen ein kartesisches Produkt zwischen den angegebenen Tabellen (dh, jede Zeile in der ersten Tabelle wird mit jeder Zeile in der zweiten Tabelle verknüpft).

Die Priorität des Komma-Operators ist jedoch geringer als die von INNER JOIN, CROSS JOIN, LEFT JOIN, und so weiter. Wenn Sie bei einer Join-Bedingung Komma-Joins mit den anderen Join-Typen mischen, wird ein Fehler der Form Unknown column 'col_name' in 'on clause' kann auftreten. Informationen zur Behebung dieses Problems finden Sie weiter unten in diesem Abschnitt.

31
spencer7593

Neben der besseren Lesbarkeit gibt es einen weiteren Fall, in dem explizit verknüpfte Tabellen besser sind als durch Kommas getrennte Tabellen.

sehen wir uns ein Beispiel an:

Create Table table1
(
    ID int NOT NULL Identity(1, 1) PRIMARY KEY ,
    Name varchar(50)
)

Create Table table2
(
    ID int NOT NULL Identity(1, 1) PRIMARY KEY ,
    ID_Table1 INT NOT NULL
)

Die folgende Abfrage gibt mir alle Spalten und Zeilen aus beiden Tabellen

SELECT
    *
FROM table1, table2

Die folgende Abfrage gibt mir Spalten aus der ersten Tabelle mit dem Tabellenalias 'table2'.

SELECT
    *
FROM table1 table2

Wenn Sie beim durch Kommas getrennten Join fälschlicherweise das Komma vergessen, wird die zweite Tabelle automatisch in den Tabellenalias für die erste Tabelle konvertiert. Nicht in allen Fällen, aber es gibt Chancen für so etwas

12
veljasije

Die Verwendung von JOINS erleichtert das Lesen des Codes, da dieser selbsterklärend ist.

In der Geschwindigkeit gibt es keinen Unterschied (ich habe es getestet) und der Ausführungsplan ist der gleiche

Wenn das Abfrageoptimierungsprogramm seine Arbeit ordnungsgemäß ausführt, sollte zwischen diesen Abfragen kein Unterschied bestehen. Dies sind nur zwei Möglichkeiten, um dasselbe gewünschte Ergebnis anzugeben.

3
vhadalgi

The SELECT * FROM table1, table2, etc. eignet sich für einige Tabellen, wird jedoch mit zunehmender Anzahl von Tabellen exponentiell schwieriger.

Die JOIN -Syntax macht deutlich, welche Kriterien sich auf welche Tabellen auswirken (unter Angabe einer Bedingung). Auch der zweite Weg ist der ältere Standard.

Obwohl für die Datenbank am Ende sind sie gleich

2