MySQL implementiert wie
folgt:
A LEFT
JOIN B join_condition
Tabelle B ist so konfiguriert,
dass sie von Tabelle A und allen
Tabellen abhängt, von denen auch Tabelle
A abhängt.
Tabelle A ist ihrerseits so
konfiguriert, dass sie von allen Tabellen (mit Ausnahme von
B) abhängt, die in der
LEFT JOIN-Bedingung verwendet werden.
Anhand der LEFT JOIN-Bedingung wird
entschieden, wie Datensätze aus der Tabelle
B abgerufen werden. (Das
bedeutet, dass keine Bedingung in der
WHERE-Klausel verwendet wird.)
Alle Standardoptimierungen für Joins werden durchgeführt; einzige Ausnahme ist, dass jede Tabelle stets erst gelesen wird, nachdem alle Tabellen gelesen wurden, von denen sie abhängt. Gibt es eine Zirkelabhängigkeit, dann gibt MySQL einen Fehler aus.
Alle Standardoptimierungen für WHERE
werden durchgeführt.
Wenn ein Datensatz in A vorhanden
ist, der der WHERE-Klausel entspricht,
aber kein Datensatz in B, der der
ON-Bedingung entspricht, dann wird ein
zusätzlicher Datensatz in B
erzeugt, bei dem alle Spalten auf NULL
gesetzt sind.
Wenn Sie mit LEFT JOIN Datensätze
suchen, die in keiner der Tabellen vorhanden sind, und die
Überprüfung im col_name
IS NULLWHERE-Teil vorhanden
ist (wobei col_name eine als
NOT NULL deklarierte Spalte ist), dann
beendet MySQL die Suche nach weiteren Datensätzen (für
eine bestimmte Schlüsselkombination), wenn es genau einen
Datensatz gefunden hat, der der LEFT
JOIN-Bedingung entspricht.
Die Implementierung von RIGHT JOIN erfolgt
analog zu der von LEFT JOIN, wobei lediglich
die Rollen der Tabellen umgekehrt werden.
Der Join-Optimierer berechnet die Reihenfolge, in der die
Tabellen verknüpft werden sollten. Die durch LEFT
JOIN oder STRAIGHT_JOIN erzwungene
Lesereihenfolge für die Tabellen unterstützt den
Join-Optimierer bei seiner Arbeit wesentlich effizienter, weil
erheblich weniger Tabellenumstellungen zu überprüfen sind.
Beachten Sie, dass dies bedeutet, dass, wenn Sie eine Abfrage
folgenden Typs ausführen, MySQL einen vollständigen Scan in
b durchführt, weil diese Tabelle aufgrund
von LEFT JOIN vor d
gelesen wird:
SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key) WHERE b.key=d.key;
Die Lösung besteht in diesem Fall darin, die Reihenfolge
umzukehren, in der a und b
in der FROM-Klausel aufgelistet werden:
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key) WHERE b.key=d.key;
Wenn bei einem LEFT JOIN die
WHERE-Bedingung für den erzeugten
NULL-Datensatz immer falsch ist, dann wird
der LEFT JOIN in einen normalen Join
umgesetzt. So wäre beispielsweise die
WHERE-Klausel in der folgenden Abfrage
falsch, wenn t2.column1
NULL wäre:
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
Aus diesem Grund kann die Abfrage problemlos in einen normalen Join konvertiert werden:
SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
Dies kann schneller erfolgen, weil MySQL die Tabelle
t2 vor t1 verwenden kann,
sofern dies einen besseren Abfrageplan zum Ergebnis hätte. Mit
STRAIGHT_JOIN können Sie eine bestimmte
Tabellenreihenfolge erzwingen.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.
