MySQL unterstützt die folgenden JOIN Ausdrücke in SELECT Statements:
table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional_expr
table_reference LEFT [OUTER] JOIN table_reference USING (column_list)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
{ oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr }
Die zuletzt angegebene LEFT OUTER JOIN Syntax existiert nur aus Kompatibilitätgründen zu ODBC. Eine Tabellen-Referenz kann mit einem Alias versehen werden: tbl_name AS alias_name oder tbl_name alias_name :
mysql> select t1.name, t2.salary from employee AS t1, info AS t2 where t1.name = t2.name;
JOIN und , (Komma) sind von der Syntax her völlig äquivalent. Beide führen einen vollen JOIN Befehl zwischen zwei Tabellen aus. Normalerweise sollten Tabellen mit Hilfe der WHERE Bedingung verbunden werden. Der Ausdruck ON beschreibt ein kondizionales "Wenn es übereinstimmt", und kann mit dem Ausdruck WHERE verbunden werden. Wenn es keinen passenden Eintrag für die richtige Tabelle in einem LEFT JOIN gibt, wird eine Reihe, wo alle Spalten auf NULL gesetzt sind, für die rechte Tabelle verwendet. Es können somit Einträge gefunden werden, die kein entsprechendes Gegenstück in einer anderen Tabelle besitzten:
mysql> select table1.* from table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id is NULL;
Der einfachste JOIN ist der sogenannte "EQUI-JOIN". Ein Beispiel :
SELECT A.EineSpalte, B.EineAndereSpalte FROM Tabelle1 AS A, Tabelle2 AS B WHERE A.EinWert = B.EinAndererWert;
Man kann ihn aber auch ganz anders schreiben, und die Ergebnismenge wird die gleiche sein, nämlich so :
SELECT A.EineSpalte, B.EineAndereSpalte FROM Tabelle1 AS A JOIN Tabelle2 AS B ON A.EinWert = B.EinAndererWert;
Wenn die Ergebnismenge die gleiche ist, wo liegt dann der Unterschied zwischen diesen beiden Formen ? Gibt es überhaupt einen Unterschied ?
Der Unterschied liegt in der Laufzeit. Im ersten Beispiel wird zuerst das kartesische Produkt aus beiden Tabellen gebildet (jede Zeile aus Tabelle1 wird mit jeder Zeile aus Tabelle2 verknüpft), und wenn beide Tabellen nur jeweils 100 Zeilen enthalten, sind das schon 10.000 Zeilen in der temporären Zwischentabelle. Erst dann werden die Zeilen gelöscht, die nicht die WHERE-Bedingung erfüllen.
Im zweiten Fall wird zuerst die Bedingung im ON-Teil geprüft und nur solche Zeilen in die Zwischentabelle übernommen, bei denen die Bedingung erfüllt ist. In dem Beispiel mit den je 100 Zeilen pro Tabelle sind das wahrscheinlich nicht mehr als 100 Zeilen. Das ist ein Faktor von 10 !
|