table_reference [CROSS] JOIN table_referencetable_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 existiertnur aus Kompatibilitätgründen zu ODBC. Eine Tabellen-Referenzkann mit einem Alias versehen werden: tbl_name AS alias_nameoder tbl_name alias_name :
mysql> select t1.name, t2.salary from employee AS t1, infoAS 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 Tabellenaus. Normalerweise sollten Tabellen mit Hilfe der WHEREBedingung verbunden werden. Der Ausdruck ON beschreibt einkondizionales "Wenn es übereinstimmt", und kann mit demAusdruck WHERE verbunden werden. Wenn es keinen passendenEintrag 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ägegefunden werden, die kein entsprechendes Gegenstück in eineranderen 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 !
|
|