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.