MySQL Spickzettel: Join

MySQL Spickzettel: Join

Eingetragen bei: MySQL | 2

In diesem Artikel werde ich JOIN an einigen Beispielen erläutern. Dazu werden die folgenden beiden Tabellen verwendet.

Die Tabelle „customer“ enthält die Kunden einer Autowerkstatt.

idcustomer name address
1 John Doe Rocky Beach
2 Steve Gates Santa Monica
3 Bill Jobs Santa Barbara
4 Tux Kernel

 

Die Tabelle „carrepair“ enthält die Reparaturen. Sie ist mit der Kundentabelle verknüpft. Der Kunde Nr. 4 hat bisher keinen Eintrag in dieser Tabelle.

idcarrepair idcustomer price date
1 1 100 2015-01-05 00:00:00
2 2 150 2015-01-06 00:00:00
3 2 100 2015-02-01 00:00:00
4 3 200 2015-02-01 00:00:00
5 1 50 2015-02-12 00:00:00

 

CROSS JOIN

Der CROSS JOIN liefert das kartesische Produkt beider Tabellen zurück. Das heißt jede Zeile der ersten Tabelle wird mit jeder Zeile der zweiten Tabelle kombiniert.

Dies liefert folgende Ergebnistabelle:

idcarrepair idcustomer price date idcustomer name address
1 1 100 2015-01-05 00:00:00 1 John Doe Rocky Beach
1 1 100 2015-01-05 00:00:00 2 Steve Gates Santa Monica
1 1 100 2015-01-05 00:00:00 3 Bill Jobs Santa Barbara
1 1 100 2015-01-05 00:00:00 4 Tux Kernel
2 2 150 2015-01-06 00:00:00 1 John Doe Rocky Beach
2 2 150 2015-01-06 00:00:00 2 Steve Gates Santa Monica
2 2 150 2015-01-06 00:00:00 3 Bill Jobs Santa Barbara
2 2 150 2015-01-06 00:00:00 4 Tux Kernel
3 2 100 2015-02-01 00:00:00 1 John Doe Rocky Beach
3 2 100 2015-02-01 00:00:00 2 Steve Gates Santa Monica
3 2 100 2015-02-01 00:00:00 3 Bill Jobs Santa Barbara
3 2 100 2015-02-01 00:00:00 4 Tux Kernel
4 3 200 2015-02-01 00:00:00 1 John Doe Rocky Beach
4 3 200 2015-02-01 00:00:00 2 Steve Gates Santa Monica
4 3 200 2015-02-01 00:00:00 3 Bill Jobs Santa Barbara
4 3 200 2015-02-01 00:00:00 4 Tux Kernel
5 1 50 2015-02-12 00:00:00 1 John Doe Rocky Beach
5 1 50 2015-02-12 00:00:00 2 Steve Gates Santa Monica
5 1 50 2015-02-12 00:00:00 3 Bill Jobs Santa Barbara
5 1 50 2015-02-12 00:00:00 4 Tux Kernel

 

INNER JOIN

Ein INNER JOIN ist ein CROSS JOIN bei dem über eine Bedingung (ON …) die Ergebnisse eingeschränkt wurden.

liefert also die folgende Tabelle:

idcarrepair idcustomer price date idcustomer name address
1 1 100 2015-01-05 00:00:00 1 John Doe Rocky Beach
2 2 150 2015-01-06 00:00:00 2 Steve Gates Santa Monica
3 2 100 2015-02-01 00:00:00 2 Steve Gates Santa Monica
4 3 200 2015-02-01 00:00:00 3 Bill Jobs Santa Barbara
5 1 50 2015-02-12 00:00:00 1 John Doe Rocky Beach

Es werden nur noch die Zeilen kombiniert, bei denen die Spalten „idcustomer“ identische Werte aufweisen.

 

NATURAL JOIN

Der NATURAL JOIN prüft ob Spalten in den beiden Tabellen gleich heißen. In unserem Beispiel ist das die Spalte „idcustomer„. Gibt es entsprechende Spalten wird das Ergebnis anhand dieser Spalten zusammengefasst. Dabei wird die doppelte Spalte im Ergebnis weggelassen.

Unser Ergebnis:

idcustomer idcarrepair price date name address
1 1 100 2015-01-05 00:00:00 John Doe Rocky Beach
1 5 50 2015-02-12 00:00:00 John Doe Rocky Beach
2 2 150 2015-01-06 00:00:00 Steve Gates Santa Monica
2 3 100 2015-02-01 00:00:00 Steve Gates Santa Monica
3 4 200 2015-02-01 00:00:00 Bill Jobs Santa Barbara

 

LEFT (OUTER) JOIN und RIGHT (OUTER) JOIN

Beim LEFT OUTER JOIN werden auch zwei Tabellen „gekreuzt“. Im Gegensatz zum INNER JOIN werden hier aber nicht nur die Zeilen zurückgeliefert, die über die Bedingung in beiden Tabellen verknüpft werden können. Die Zeilen der linken Tabelle werden in jedem Fall als Ergebnis ausgegeben. Die Datensätze der rechten Tabelle werden dann wenn die ON Bedingung zutrifft ausgegeben, ansonsten steht in der entsprechende Spalte NULL. Anders formuliert: Der Unterschied zwischen einem OUTER JOIN und einem INNER JOIN ist, dass der OUTER JOIN immer eine Ergebniszeile gibt, auch wenn es in der zweiten Tabelle keinen passenden Treffer gibt. Ein NULL im Ergebnis eines LEFT OUTER JOIN bedeutet also, dass es in der rechten Tabelle keinen Wert gibt, der zur linken Tabelle passt.

Also ergibt

das folgende Ergebnis:

idcustomer name address idcarrepair idcustomer price date
1 John Doe Rocky Beach 1 1 100 2015-01-05 00:00:00
1 John Doe Rocky Beach 5 1 50 2015-02-12 00:00:00
2 Steve Gates Santa Monica 2 2 150 2015-01-06 00:00:00
2 Steve Gates Santa Monica 3 2 100 2015-02-01 00:00:00
3 Bill Jobs Santa Barbara 4 3 200 2015-02-01 00:00:00
4 Tux Kernel  NULL NULL NULL NULL

 

Der Unterschied zwischen LEFT JOIN und RIGHT JOIN ist lediglich die Reihenfolge der Tabellen. Der RIGHT OUTER JOIN vergleicht also die rechte Tabelle mit der linken. Bsp:

ist das gleiche wie:

 

SELF JOIN

Um den SELF JOIN zu erläutern müssen wir erst unsere Tabelle „carrepair“ erweitern. Wir fügen eine Spalte „idlastrepair“ hinzu. In dieser Spalte wird die „idcarrepair“ der letzten Reparatur eingetragen. So lässt sich eine fortlaufende Folge von Reparaturen für einen Kunden nachverfolgen. Die Tabelle sieht nun so aus:

idcarrepair idcustomer price date idlastrepair
1 1 100 2015-01-05 00:00:00  NULL
2 2 150 2015-01-06 00:00:00  NULL
3 2 100 2015-02-01 00:00:00 2
4 3 200 2015-02-01 00:00:00  NULL
5 1 50 2015-02-12 00:00:00 1

 

Um nun Abzufragen welche Rechnungen zueinander gehören, können wir mit einem INNER JOIN die Tabelle mit sich selbst verknüpfen (dies nennt man dann SELF JOIN):

Dies liefert uns das folgende Ergebnis:

idcarrepair idcustomer price date idlastcarrepair idcarrepair idcustomer price date idlastcarrepair
1 1 100 2015-01-05 00:00:00 NULL 5 1 50 2015-02-12 00:00:00 1
2 2 150 2015-01-06 00:00:00 NULL 3 2 100 2015-02-01 00:00:00 2

2 Antworten

  1. Hi, ein sehr schönes Beispiel für den SELF JOIN. Super. Mir gefallen die MySQL-Artikel sehr.

Hinterlasse einen Kommentar