11 Stimmen

Vor- und Nachteile von MySql JOINS

Wenn ich Daten aus mehreren Tabellen auswähle, habe ich früher häufig JOINS verwendet, und vor kurzem habe ich begonnen, eine andere Methode zu verwenden, aber ich bin mir nicht sicher, wie sich das langfristig auswirken wird.

Beispiele:

SELECT * FROM table_1 LEFT JOIN table_2 ON (table_1.column = table_2.column)

Dies ist also ein einfacher LEFT JOIN über Tabellen, aber sehen Sie sich die folgende Abfrage an.

SELECT * FROM table_1,table_2 WHERE table_1.column = table_2.column

Ich persönlich würde, wenn ich eine Verbindung über sagen wir 7 Tabellen von Daten herstellen würde, dies JOINS vorziehen.

Aber gibt es Vor- und Nachteile der beiden Methoden?

10voto

Mchl Punkte 60035

Die zweite Methode ist eine Abkürzung für INNER JOIN.

 SELECT * FROM table_1 INNER JOIN table_2 ON table_1.column = table_2.column

Wählt nur Datensätze aus, die der Bedingung in beiden Tabellen entsprechen (LEFT JOIN wählt alle Datensätze aus der Tabelle auf der linken Seite und passende Datensätze aus der Tabelle auf der rechten Seite aus)

Zitat von http://dev.mysql.com/doc/refman/5.0/en/join.html

[...] wir betrachten jedes Komma in einer Liste von table_reference-Elementen als gleichwertig mit einer inneren Verknüpfung

Und

INNER JOIN und , (Komma) sind semantisch äquivalent, wenn keine Join-Bedingung vorliegt: Beide erzeugen ein kartesisches Produkt zwischen den angegebenen Tabellen (d. h. jede Zeile der ersten Tabelle wird mit jeder Zeile der zweiten Tabelle verbunden).

Der Vorrang des Kommaoperators ist jedoch geringer als der von INNER JOIN, CROSS JOIN, LEFT JOIN usw. Wenn Sie Komma-Joins mit den anderen Join-Typen mischen, wenn es eine Join-Bedingung gibt, kann ein Fehler der Form Unknown column 'col_name' in 'on clause' auftreten. Informationen zum Umgang mit diesem Problem finden Sie weiter unten in diesem Abschnitt.

Im Allgemeinen werden dort einige Dinge erwähnt, die Sie dazu veranlassen sollten, die Verwendung von Kommas zu überdenken.

3voto

Thomas Punkte 62314

Die erste Methode ist die ANSI/ISO-Version von Join. Die zweite Methode ist das ältere Format (vor 1989), um das Äquivalent eines Inner Join zu erzeugen. Dazu werden alle Tabellen, die Sie auflisten, über Kreuz verbunden und dann das kartesische Produkt in der Where-Klausel eingegrenzt, um das Äquivalent eines Inner Join zu erzeugen.

Von der zweiten Methode würde ich dringend abraten.

  1. Es ist für andere Entwickler schwieriger zu lesen
  2. Es bricht die Regel des geringsten Erstaunens für andere Entwickler, die sich fragen werden, ob Sie es einfach nicht besser wussten oder ob es einen bestimmten Grund gab, nicht das ANSI/ISO-Format zu verwenden.
  3. Es wird Ihnen Kummer bereiten, wenn Sie versuchen, dieses Format mit etwas anderem als Inner Joins zu verwenden.
  4. Das macht es schwieriger, Ihre Absicht zu erkennen, insbesondere bei einer großen Abfrage mit vielen Tabellen. Sollen alle diese Tabellen inner joins sein? Haben Sie etwas in der Where-Klausel übersehen und einen Cross-Join erstellt? Wollten Sie einen Cross-Join erstellen? usw.

Es gibt einfach keinen Grund, das zweite Format zu verwenden, und viele Datenbanksysteme stellen die Unterstützung für dieses Format ein.

2voto

OMG Ponies Punkte 312816

ANSI-Syntax

Beide Abfragen sind JOINs, und beide verwenden die ANSI-Syntax, aber eine ist älter als die andere.

Verbindet mit dem JOIN Schlüsselwort bedeutet, dass die ANSI-92-Syntax verwendet wird. ANSI-89-Syntax bedeutet, dass die Tabellen durch Komma getrennt in der FROM Klausel, und das Kriterium, das sie miteinander verbindet, findet sich in der WHERE Klausel. Beim Vergleich von INNER JOINs gibt es keinen Leistungsunterschied - dies:

SELECT * 
  FROM table_1 t1, table_2 t2
 WHERE t1.column = t2.column

...wird den gleichen Abfrageplan erzeugen wie:

SELECT *
  FROM TABLE_1 t1
  JOIN TABLE_2 t2 ON t2.column = t1.column

Äpfel zu Orangen

Ein weiterer Unterschied ist, dass die beiden Abfragen nicht identisch sind - ein LEFT [OUTER] JOIN erzeugt alle Zeilen aus TABLE_1 und Verweise auf TABLE_2 in der Ausgabe wird NULL sein, wenn es keine Übereinstimmung auf der Grundlage der JOIN-Kriterien gibt (angegeben in der Datei ON Klausel). Das zweite Beispiel ist ein INNER JOIN, der seulement Zeilen erzeugen, die übereinstimmende Datensätze in TABLE_2 . Hier ist ein Link zu einer visuellen Darstellung von JOINs um den Unterschied zu verdeutlichen...

Pro/Kontra

Der Hauptgrund für die Verwendung der ANSI-92-Syntax ist, dass ANSI-89 keine Unterstützung für OUTER JOIN (LEFT, RIGHT, FULL) bietet. Die ANSI-92-Syntax wurde speziell eingeführt, um dieses Manko zu beheben, da die Anbieter ihre eigene, benutzerdefinierte Syntax implementierten. Oracle verwendete (+) SQL Server verwendet ein Sternchen an der Seite des Gleichheitszeichens in den Verknüpfungskriterien (IE: t1.column =* t2.column ).

Der nächste Grund für die Verwendung der ANSI-92-Syntax ist, dass sie expliziter und lesbarer ist und gleichzeitig eine Trennung zwischen der Verknüpfung von Tabellen und der eigentlichen Filterung ermöglicht.

0voto

Hammerite Punkte 20657

Ich persönlich halte die explizite Join-Syntax ( A JOIN B , A LEFT JOIN B ) ist vorzuziehen. Zum einen, weil damit deutlicher wird, was Sie tun, und zum anderen, weil Sie bei Verwendung der impliziten Join-Syntax für innere Joins immer noch die explizite Syntax für äußere Joins verwenden müssen und Ihre SQL-Formatierung daher inkonsistent ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X