Join - Verknüpfen von Tabellen
Folgende JOINS werden von MySQL unterstützt:
table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference INNER JOIN table_reference join_condition
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference join_condition
table_reference LEFT [OUTER] JOIN table_reference
table_reference NATURAL [LEFT [OUTER]] JOIN table_reference
{ oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr }
table_reference RIGHT [OUTER] JOIN table_reference join_condition
table_reference RIGHT [OUTER] JOIN table_reference
table_reference NATURAL [RIGHT [OUTER]] JOIN table_reference
Tabellen-Referenz könne 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;
oder einfacher ohne as: cdsammlung c, cdinterpret i
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.
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;
SELECT titel, interpret, name
FROM cdsammlung c, ausgeliehen a WHERE c.id = a.cd_id
SELECT titel, interpret, name
FROM cdsammlung c JOIN ausgeliehen a WHERE c.id = a.cd_id
Die Kosten eines JOINS sollte man sich immer durch EXPLAIN anzeign lassen!
z.B.: EXPLAIN SELECT titel, interpret, name FROM cdsammlung c JOIN ausgeliehen
a WHERE c.id = a.cd_id
Ein LEFT JOIN nimmt jeden Treffer der linken Tabelle und gibt wenn vorhanden
die entsprechenden Ergebnisse der rechten Tabelle aus.
z.B.: Alle CDs aus der Sammlung auflisten und wenn verliehen die dazugehörigen
Ausleiher:
SELECT titel, interpret, name FROM cdsammlung c LEFT JOIN ausgeliehen a
ON c.id = a.cd_id LIMIT 0, 30 |
titel |
interpret |
name |
master of the rings |
4 |
Thomas |
stone temple pilots |
7 |
Thomas |
Westernhagen |
3 |
Hans |
Matrix2 |
6 |
Hans |
indiana |
5 |
NULL |
indiana2 |
5 |
NULL |
Jar of Flies2 |
1 |
NULL |
Yes2 |
8 |
NULL |
Besonderheit:
NULL Werte
NULL ist ein nicht vorhandener Wert! Der benötigt wird wenn ich nach
etwas such das irgendwo nicht vorhanden ist
MySQL> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
Die Felder in SQL Datenbanken können drei Werte enthalten: 0 (NULL), einen
String oder eine Zahl, ein Datum oder auch NULL. Man spricht hier von
Dreiwertigkeit.
Alle CDs anzeigen die ausgliehen sind |
SELECT titel, interpret, name FROM cdsammlung c LEFT
JOIN ausgeliehen a ON c.id = a.cd_id WHERE a.cd_id IS NOT NULL LIMIT 0,
30 |
titel |
interpret |
name |
master of the rings |
4 |
Thomas |
stone temple pilots |
7 |
Thomas |
Westernhagen |
3 |
Hans |
Matrix2 |
6 |
Hans |
(Gibt es dafür noch eine weitere Lösung?)
Man muß aber nicht zwei verschiedene Tabellen nutzen, um einen JOIN auszuführen.
Manchmal kann es auch sinnvoll sein, Einträge in einer Tabelle mit anderen Einträgen
in derselben Tabelle miteinander zu vergleichen.
Das Schlüsselwort JOIN muß in diesem Beispiel auch nicht explizit angegeben
werden.
SQL-Befehl :
SELECT * FROM cdsammlung c1, cdsammlung c2 WHERE c1.titel != c2.titel and
c1.preis= c2.preis |
titel |
interpret |
spiellaenge |
erscheinungsjahr |
kaufdatum |
preis |
Ort |
Inhalt |
titel |
interpret |
spiellaenge |
erscheinungsjahr |
kaufdatum |
preis |
Ort |
Inhalt |
indiana |
5 |
55:02 |
127 |
0000-00-00 |
22.50 |
Auto |
Booklet |
indiana |
5 |
55:02 |
127 |
0000-00-00 |
22.50 |
Auto |
Booklet |
indiana2 |
5 |
55:02 |
127 |
1995-05-22 |
22.50 |
Auto |
Booklet |
indiana2 |
5 |
55:02 |
127 |
1995-05-22 |
22.50 |
Auto |
Booklet |
Pulp Fiction |
6 |
NULL |
NULL |
NULL |
34.45 |
Auto |
Booklet |
Pulp Fiction |
6 |
NULL |
NULL |
NULL |
34.45 |
Auto |
Booklet |
Vom Winde verweht |
6 |
NULL |
NULL |
NULL |
34.45 |
Auto |
Booklet |
Vom Winde verweht |
6 |
NULL |
NULL |
NULL |
34.45 |
Auto |
Booklet |
In dieser Abfrage werden zwei Aliase für den Tabellennamen angegeben, um es
überhaupt zu ermöglichen, daß man sich mehrfach auf eine spezielle Spalte ein und
derselben Tabelle beziehen kann. (Aliase: c1, c2)
|