:: DEVELOPER ZONE
MySQL unterstützt folgende JOIN-Syntaxen für
SELECT-Statements:
tabellen_verweis, tabellen_verweis
tabellen_verweis [CROSS] JOIN tabellen_verweis
tabellen_verweis INNER JOIN tabellen_verweis join_bedingung
tabellen_verweis STRAIGHT_JOIN tabellen_verweis
tabellen_verweis LEFT [OUTER] JOIN tabellen_verweis join_bedingung
tabellen_verweis LEFT [OUTER] JOIN tabellen_verweis
tabellen_verweis NATURAL [LEFT [OUTER]] JOIN tabellen_verweis
{ oder tabellen_verweis LEFT OUTER JOIN tabellen_verweis ON bedingungs_ausdruck }
tabellen_verweis RIGHT [OUTER] JOIN tabellen_verweis join_bedingung
tabellen_verweis RIGHT [OUTER] JOIN tabellen_verweis
tabellen_verweis NATURAL [RIGHT [OUTER]] JOIN tabellen_verweis
Wobei tabellen_verweis definiert ist als:
tabelle [[AS] alias] [USE INDEX (schluessel_liste)] [IGNORE INDEX (schluessel_liste)]
Und join_bedingung definiert ist als:
ON bedingungs_ausdruck | USING (spalten_liste)
Sie sollten nie irgend welche Bedingungen im ON-Teil haben, die dazu
benutzt werden, um die Zeilen, die im Ergebnissatz auftauchen, zu
beschränken. Wenn Sie so etwas tun wollen, müssen Sie das in der
WHERE-Klausel tun.
Beachten Sie, dass vor Version 3.23.17 INNER JOIN keine
join_bedingung aufnahm!
Die letzte oben dargestellte LEFT OUTER JOIN-Syntax gibt es nur aus
Gründen der Kompatibilität mit ODBC:
Einem Tabellenverweis kann mit tabelle AS alias_name oder
tabelle alias_name ein Alias zugewiesen werden:
mysql> select t1.name, t2.gehalt from angestellte AS t1, info AS t2
where t1.name = t2.name;
Der ON-Bedingungscode ist jeglicher Bedingungscode der Form, wie er
auch in einer WHERE-Klausel benutzt werden kann.
Wenn es für die rechte Tabelle keinen übereinstimmenden Datensatz im
ON- oder USING-Teil eines LEFT JOIN gibt, wird für die
rechte Tabelle eine Zeile benutzt, in der alle Spalten auf NULL
gesetzt sind. Das können Sie benutzen, um Datensätze in einer Tabelle
herauszusuchen, die in einer anderen Tabelle kein Gegenstück haben:
mysql> select tabelle1.* from tabelle1
LEFT JOIN tabelle2 ON tabelle1.id=tabelle2.id
where tabelle2.id is NULL;
Dieses Beispiel findet alle Zeilen in tabelle1 mit einem
id-Wert, der in tabelle2 nicht vorhanden ist (also alle
Zeilen in tabelle1 ohne entsprechende Zeile in tabelle2).
Hierbei wird natürlich angenommen, dass tabelle2.id als NOT NULL deklariert ist. See Abschnitt 6.2.6, „Wie MySQL LEFT JOIN optimiert“.
Die USING-(spalten_liste)-Klausel nennt eine Auflistung von
Spalten, die in beiden Tabellen existieren müssen. Eine
USING-Klausel wie:
A LEFT JOIN B USING (C1,C2,C3,...)
Ist definiert als semantisch identisch mit einem ON-Ausdruck wie
diesem:
A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,...
Der NATURAL [LEFT] JOIN zweier Tabellen ist definiert als semantisch
identisch äquivalent zu einem INNER JOIN oder einem LEFT JOIN
mit einer USING-Klausel, die alle Spalten nennt, die in beiden
Tabellen existieren.
RIGHT JOIN funktioniert analog wie LEFT JOIN. Um Code
zwischen Datenbanken portabel zu halten, wird empfohlen, LEFT JOIN
anstelle von RIGHT JOIN zu benutzen.
STRAIGHT_JOIN ist identisch mit JOIN, ausser dass die linke
Tabelle immer vor der rechten Tabelle gelesen wird. Das kann in den
(wenigen) Fällen benutzt werden, wo der Optimierer die Tabellen in die
falsche Reihenfolge bringt.
Ab MySQL-Version 3.23.12 können Sie Hinweise darüber geben, welchen Index
MySQL benutzen sollte, wenn Informationen aus einer Tabelle abgerufen
werden. Das ist nützlich, wenn EXPLAIN zeigt, dass MySQL den
falschen Index benutzt. Indem Sie USE INDEX (schluessel_liste)
angeben, können Sie MySQL anweisen, nur einen der angegebenen Indexe zu
benutzen, um Zeilen in der Tabelle zu finden. Die alternative Syntax
IGNORE INDEX (schluessel_liste) kann benutzt werden, um MySQL
anzuweisen, einen bestimmten Index nicht zu benutzen.
Einige Beispiele:
mysql> select * from tabelle1,tabelle2 where tabelle1.id=tabelle2.id;
mysql> select * from tabelle1 LEFT JOIN tabelle2 ON tabelle1.id=tabelle2.id;
mysql> select * from tabelle1 LEFT JOIN tabelle2 USING (id);
mysql> select * from tabelle1 LEFT JOIN tabelle2 ON tabelle1.id=tabelle2.id
LEFT JOIN table3 ON tabelle2.id=table3.id;
mysql> select * from tabelle1 USE INDEX (schluessel1,schluessel2) WHERE schluessel1=1 und schluessel2=2 AND
schluessel3=3;
mysql> select * from tabelle1 IGNORE INDEX (schluessel3) WHERE schluessel1=1 und schluessel2=2 AND
schluessel3=3;
© 1995-2005 MySQL AB. All rights reserved.
