Arten von JOINs – was heißt LEFT, CROSS JOIN etc?

JOINs sind das grundlegende Handwerkszeug eines jeden Datenbank-Benutzers. Ohne sie kann man Daten immer nur aus einer Tabelle abfragen – und das will man ja spätestens nach 5 Minuten nicht mehr.

Also was tun? Fangen wir einmal mit 2 Tabellen an:

Kunden
Kundennummer Name
1 Max Musterman
2 Martin Mustermann
3 Maria Musterfrau
Konten
Kontonummer Kundennummer
18 1
26 2
42 4

Wie man sieht, gibt es in beiden Tabellen Datensätze, die in der anderen Tabelle nicht vorkommen. Und genau dann zeigen sich die Unterschiede der JOINs.

(INNER) JOIN
Bei einem „normalen“ JOIN, auch INNER JOIN genannt, werden nur die Datensätze ausgegeben, die in beiden verknüpften Tabellen vorhanden sind.

select konten.kontonummer, kunden.name from konten join kunden on kunden.kundennummer=konten.kundennummer
liefert also folgendes Ergebnis:

Kontonummer Name
18 Max Musterman
26 Martin Mustermann
LEFT (OUTER) JOIN
Bei einem LEFT JOIN, auch LEFT OUTER JOIN genannt, werden alle Datensätze ausgegeben, die in der zuerst genannten Tabelle vorhanden sind. Bei den Datensätzen, die in der zweiten Tabelle nicht enthalten sind, werden die entsprechenden Spalten mit NULL-Werten ausgegeben. Dies kann man auch nutzen, um diese Datensätze performant auszufiltern.

select konten.kontonummer, kunden.name from konten left join kunden on kunden.kundennummer=konten.kundennummer
liefert also folgendes Ergebnis:

Kontonummer Name
18 Max Musterman
26 Martin Mustermann
42 NULL
RIGHT (OUTER) JOIN
Bei einem RIGHT JOIN, auch RIGHT OUTER JOIN genannt, werden alle Datensätze ausgegeben, die in der zuletzt genannten Tabelle vorhanden sind. Bei den Datensätzen, die in der ersten Tabelle nicht enthalten sind, werden die entsprechenden Spalten mit NULL-Werten ausgegeben.

select konten.kontonummer, kunden.name from konten right join kunden on kunden.kundennummer=konten.kundennummer
liefert also folgendes Ergebnis:

Kontonummer Name
18 Max Musterman
26 Martin Mustermann
NULL Maria Musterfrau
FULL OUTER JOIN
Bei einem FULL OUTER JOIN werden alle Datensätze ausgegeben, die in mindestens einer der verknüpften Tabelle vorhanden sind. Bei den Datensätzen, die in der jeweils anderen Tabelle nicht enthalten sind, werden die entsprechenden Spalten mit NULL-Werten ausgegeben.

select konten.kontonummer, kunden.name from konten full outer join kunden on kunden.kundennummer=konten.kundennummer
liefert also folgendes Ergebnis:

Kontonummer Name
18 Max Musterman
26 Martin Mustermann
NULL Maria Musterfrau
42 NULL
CROSS JOIN
Bei einem CROSS JOIN wird das kartesische Produkt der beiden Tabellen ausgeben. Es wird keine ON-Klausel notiert.

select konten.kontonummer, kunden.name from konten cross join kunden
liefert also folgendes Ergebnis:

Kontonummer Name
18 Max Musterman
18 Martin Mustermann
18 Maria Musterfrau
26 Max Musterman
26 Martin Mustermann
26 Maria Musterfrau
42 Max Musterman
42 Martin Mustermann
42 Maria Musterfrau

Und wie kann man sich das merken?

  • Bei einem JOIN werden alle Datensätze ausgegeben, die in beiden Tabellen vorhanden sind, das muss man sich halt merken.
  • Bei einem LEFT JOIN werden alle Datensätze ausgegeben, die in der ersten Tabelle (≙ linken) vorhanden sind (wir schreiben von links nach rechts, also steht die erste Tabelle im Statement links von der zweiten).
  • Bei einem RIGHT JOIN werden alle Datensätze ausgegeben, die in der zweiten (≙ rechten) Tabelle vorhanden sind.
  • OUTER und CROSS JOINs benötigt man kaum, da muss man dann nur wissen, wo es steht…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.