Joins
Nachdem du von der Normalisierung und der Aufteilung der Daten in verschiedene Tabellen gehört hast, fragst du dich vielleicht, wie wir diese Daten miteinander verbinden, wenn wir Daten aus mehreren Tabellen gleichzeitig benötigen.
Mit JOINs können wir Tabellen anhand von Schlüsseln in der Tabelle miteinander verbinden.
Das ist ein weiterer Grund, warum es wichtig ist, eindeutige Bezeichner für Entitäten zu haben.
Ohne diese ist das Verbinden von Tabellen ziemlich mühsam.
Bei Joins unterscheiden wir zwischen LEFT JOIN (das ist dasselbe wie JOIN und RIGHT JOIN nur umgekehrt) und INNER JOIN.
Weitere spezielle Joins sind der CROSS JOIN und der FULL OUTER JOIN (dieser wird nicht von allen Datenbanken unterstützt und soll hier nicht behandelt werden).
Left Join
Der LEFT JOIN ist der häufigste Join.
Du wirst ihn in der Regel am häufigsten verwenden und in vielen Fällen reicht er aus.
Im Grunde genommen fügt er die rechte Tabelle der linken Tabelle hinzu.
-- Wir verwenden eine normale Select-Anweisung
SELECT *
-- Wir wählen unsere erste Tabelle aus
FROM linke_tabelle l
-- Wir deklarieren einen Left Join und fügen unsere rechte Tabelle hinzu
LEFT JOIN rechte_Tabelle r
-- Wir legen fest, welche Werte zur Definition unseres Join-Schlüssels verwendet werden.
ON l.id = r.id
Nun gut. Das ist ziemlich abstrakt... Schauen wir mal, wie das mit unseren Daten aussieht. Zunächst fügen wir das money neben den Spielernamen ein, denn die IDs sind ziemlich schwer zu lesen.
| player_name | money |
|---|---|
| Lexy | 4117 |
| John | 7795 |
| Milana | 9843 |
| Mike | 4570 |
| Lenny | 984 |
| Marry | 2570 |
| Summer | 1858 |
| Lilly | 3602 |
| Lexi | 6057 |
| Matthias | 6244 |
| Sarah | 268 |
Du siehst, dass wir unsere money Werte jetzt direkt neben den Spielernamen haben.
Du kannst natürlich auch die ID daneben einfügen, wenn du sie brauchst.
Die rechte Verknüpfung ist im Grunde die gleiche. Der einzige Unterschied besteht darin, wie die Datenbank mit Werten umgeht, die nicht in einer der beiden Tabellen enthalten sind. Das wird ganz klar, wenn wir stattdessen die Kanaltabelle joinen.
SELECT player_name, channel_id
FROM player
LEFT JOIN channel_subscription cs ON player.id = cs.player_id;
| player_name | channel_id |
|---|---|
| Mike | 1 |
| Mike | 2 |
| Sarah | 1 |
| Sarah | 2 |
| Sarah | 3 |
| John | 1 |
| Lexi | NULL |
| Matthias | NULL |
| Marry | NULL |
| Lenny | NULL |
| Lilly | NULL |
| Lexy | NULL |
| Milana | NULL |
| Summer | NULL |
Du siehst hier, dass die Werte für Spieler, die keinen Eintrag in der Tabelle channel_subcription haben, einfach NULL sind.
Wenn wir andersherum verbinden:
SELECT player_name, channel_id
FROM player
RIGHT JOIN channel_subscription cs ON player.id = cs.player_id;
| player_name | channel_id |
|---|---|
| Mike | 1 |
| Mike | 2 |
| Sarah | 1 |
| Sarah | 2 |
| Sarah | 3 |
| John | 1 |
Es werden nur die Einträge angezeigt, die in der channel_subscription vorhanden sind, da dies unsere Referenztabelle ist.
Inner Join
Der INNER JOIN ist genau das, wofür du ihn hältst.
Er verbindet alle Daten, deren Schlüssel in beiden Tabellen vorhanden sind.
Er ist sogar noch restriktiver als der LEFT JOIN und der RIGHT JOIN.
Wenn wir den INNER JOIN verwenden, müssen wir uns nicht um fehlende Werte in unserer Tabelle kümmern, aber es kann sein, dass wir nicht alle Daten unserer ersten Tabelle erhalten.
SELECT player_name, channel_id
FROM player
INNER JOIN channel_subscription cs ON player.id = cs.player_id;
| player_name | channel_id |
|---|---|
| Mike | 1 |
| Mike | 2 |
| Sarah | 1 |
| Sarah | 2 |
| Sarah | 3 |
| John | 1 |
Der INNER JOIN hier ist im Grunde dasselbe wie unser RIGHT JOIN oben.
Aber anstatt die Tabelle mit den spärlicheren Daten zu wählen, verwenden wir einfach die kleinste Teilmenge unserer Tabellen.