Lektion 3.0 | Der NATURAL JOIN

Einführung

Was genau ist ein Join?

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.

Wie bilde ich einen Join?

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.

Der NATURAL JOIN

Beim NATURAL JOIN werden alle gleichnamigen Spalten miteinander verbunden und jeweils eine der beiden entfernt.

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.

Ein Beispiel:

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

Mehr als zwei Tabellen gehen auch!

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.

Ein Beispiel:

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