Im ER-Diagramm (mehr dazu hier) einer Datenbank sind verschiedene Entitätstypen und deren Beziehungen untereinander vorzufinden. Wenn man nun aus dem ER-Diagramm ein Relationenmodell erstellt, entstehen daraus mehrere Relationen (Tabellen).
Durch den Join ist man in der Lage, Daten, die bei der Erstellung eines Relationenmodells auf mehrere Relationen verteilt wurden, wieder zusammenzuführen. Man benutzt dabei einen Datensatz, der in beiden Relationen vorzufinden ist.
Man muss bei dem Join darauf achten, dass die beiden Datensätze von ihrer Struktur her gleich sind, also dass die Datentypen der gejointen Attribute gleich sind. Meistens joint man zwei Tabellen über den Fremdschlüssel der einen Tabelle, der auf den Primärschlüssel der anderen verweist.
Das kartesische Produkt ist der Ur-Join. Dieses erstellt man folgendermaßen. Dem FROM-Operator fügt man mindestens zwei mit Kommata voneinander getrennte Relationen zu. Das Ergebnis ist ein kartesisches Produkt, in dem jede Zeile der einen Tabelle mit jeder Zeile aller anderen Tabellen verbunden ist.
So könnte ein kartesisches Produkt als SQL-Abfrage aussehen:
SELECT * FROM a, b;
Jedoch werden wir uns in diesem Tutorial auf den NATURAL JOIN und den INNER JOIN beschränken. Diese Lektion behandelt den NATURAL JOIN.
Beim NATURAL JOIN wird in die FROM-Klausel die erste Tabelle eingetragen. Darauf folgt ein NATURAL JOIN, auf den der Tabellenname der zweiten Tabelle folgen muss.
SELECT * FROM a NATURAL JOIN b;
Jeweils gleichnamige Spalten werden verbunden, was aber auch zu ungewünschten Nebeneffekten führen kann ...
Links siehts Du, wie der NATURAL JOIN funktioniert. Zwei Tabellen werden miteinander verbunden, indem alle gleichnamigen Spalten einer jeden Tabelle auf gleiche Werte durchsucht werden und entsprechend diesen dann zu einer Ergebnistabelle zusammengeführt werden. Zuletzt wird für jede Spalte, deren Namen öfter als ein Mal vorkommt, ein Exemplar behalten, alle Restlichen jedoch gelöscht, sodass im Ergebnis jeder Spaltenname nur einmal vorkommt.
Wie bereits erwähnt, kann die Einfachheit des NATURAL JOIN auch zum Problem werden. Würden in unserem Beispielbild "des2" und "des3" "des2.5" heißen, so würde es kein Ergebnis geben, da es für "table_a.des2.5" und "table_b.des2.5" keine übereinstimmenden (gleichen) Werte gibt.
Wir wollen die customer- und address-Tabelle miteinander verbinden.
SELECT customer.first_name,
customer.last_name, address.address_id, address.address,
address.city_id
FROM customer
NATURAL JOIN address;
Ergebnis (Ausschnitt):
first_name |
last_name |
address_id |
address |
city_id |
---|---|---|---|---|
Mary |
Smith |
5 |
1913 Hanoi Way |
463 |
Patricia |
Johnson |
6 |
1121 Loja Avenue |
449 |
Linda |
Williams |
7 |
692 Joliet Street |
38 |
Barbara |
Jones |
8 |
1566 Inegl Manor |
349 |
Der "Doppel-Join" funktioniert zunächst genau so wie der vorherige Join mit dem einzigen Unterschied, dass dieses Mal anstatt von zweien drei Tabellen verwendet werden.
Zunächst nehmen wir unser schematisches Beispiel und erweitern dieses. Nach Tabelle 2 wird nun ein weiterer NATURAL JOIN hinzugefügt, auf den dann Tabelle 3 folgt:
SELECT * FROM Tabelle_a
NATURAL JOIN Tabelle_b
NATURAL JOIN Tabelle_c;
Du kannst in MySQL bis zu 61 Tabellen in einem einzigen Join-Komplex miteinander verbinden.
Wir erweitern unseren Join aus dem vorherigen Beispiel (Beispiel 1), indem wir noch die city-Tabelle hinzufügen.
SELECT customer.first_name, customer.last_name,
address.address_id, address.address,
city.city_id, city.city, city.country_id
FROM customer
NATURAL JOIN address
NATURAL JOIN city;
Ergebnis (Ausschnitt):
first_name |
last_name |
address_id |
address |
city_id |
city |
country_id |
---|---|---|---|---|---|---|
Mary |
Smith |
5 |
1913 Hanoi Way |
463 |
Sasebo |
50 |
Patricia |
Johnson |
6 |
1121 Loja Avenue |
449 |
San Bernadino |
103 |
Linda |
Williams |
7 |
692 Joliet Street |
38 |
Athenai |
39 |
Barbara |
Jones |
8 |
1566 Inegl Manor |
349 |
Myingyan |
64 |