Level 9: Zwei Tabellen mit JOIN verbinden
Aktualisiert am
Mittelstufe · Level 9 von 20. Ziel: Informationen aus zwei Tabellen kombinieren, die über eine ID verbunden sind.
Themen: JOIN … ON Tabellen-Alias Fremdschlüssel
Lektion
In einer gut entworfenen Datenbank vermeidet man es, Informationen zu wiederholen. Die Tabelle movies enthält nicht den Namen des Regisseurs, sondern nur director_id, eine Nummer. Der Name steht ein einziges Mal in der Tabelle directors. Ändert ein Regisseur seinen Namen, korrigiert man ihn nur an einer Stelle.
director_id ist ein Fremdschlüssel: Er verweist auf die Spalte id von directors, ihren Primärschlüssel, der jeden Regisseur eindeutig kennzeichnet. Night Train hat director_id = 1: Sein Regisseur ist die Zeile von directors, deren id 1 ist, Nora Ellis.
JOIN stellt diese Verbindung wieder her. FROM movies JOIN directors ON directors.id = movies.director_id ordnet jedem Film die Zeile des passenden Regisseurs zu. ON gibt die Zuordnungsbedingung an. Das Ergebnis hat die Spalten beider Tabellen.
Um weniger zu schreiben, gibt man jeder Tabelle einen kurzen Alias: FROM movies m JOIN directors d ON d.id = m.director_id. Dann setzt man den Alias vor die Spalten: m.title, d.name. Das Präfix wird Pflicht, wenn eine Spalte in beiden Tabellen vorkommt (id, name…): Sonst weiß SQL nicht, welche du meinst.
JOIN (oder INNER JOIN) behält nur die Zeilen, die auf beiden Seiten einen Partner haben. Deep Current ohne Regisseur verschwindet; Sara Diaz ohne Film ebenfalls. Das nächste Level zeigt, wie man sie behält.
Nach einem Join kann man filtern, sortieren und gruppieren wie bei einer einzigen Tabelle. Wenn du gruppierst, gruppiere zusätzlich zum Namen nach der ID (GROUP BY d.id, d.name): Zwei Regisseure können denselben Namen tragen. In unseren Daten kommt das nicht vor, in einer echten Datenbank aber häufig: Gewöhne es dir gleich an.
Syntax
SELECT a.col, b.col
FROM tabelle_a a
JOIN tabelle_b b ON b.id = a.b_id;Kommentiertes Beispiel
SELECT m.title, d.name AS director
FROM movies m
JOIN directors d ON d.id = m.director_id;Jeder Film wird seinem Regisseur zugeordnet. Deep Current, dessen director_id leer ist, erscheint nicht.
| id | title | genre | year | duration | rating | director_id |
|---|---|---|---|---|---|---|
| 1 | Night Train | Thriller | 2015 | 118 | 7.8 | 1 |
| 2 | Blue Harbor | Drama | 2018 | 102 | 7.1 | 2 |
| 3 | Paper Moon City | Comedy | 2012 | 95 | 6.4 | 5 |
| 4 | Silent Peak | Drama | 2020 | 131 | 8.2 | 3 |
| 5 | Last Signal | Sci-Fi | 2019 | 142 | 7.5 | 1 |
| 6 | Summer Keys | Comedy | 2016 | 88 | 5.9 | 4 |
| 7 | Iron Garden | Sci-Fi | 2021 | 125 | 8 | 3 |
| 8 | Dust and Gold | Western | 2014 | 110 | 6.8 | 2 |
| 9 | The Quiet Hour | Drama | 2022 | 97 | 7.4 | 5 |
| 10 | Deep Current | Thriller | 2017 | 105 | 6.9 | NULL |
| id | name | country |
|---|---|---|
| 1 | Nora Ellis | UK |
| 2 | Paulo Reis | Brazil |
| 3 | Kenji Mori | Japan |
| 4 | Anna Berg | Sweden |
| 5 | Luc Martin | France |
| 6 | Sara Diaz | Spain |
Ergebnis des Beispiels
| title | director |
|---|---|
| Night Train | Nora Ellis |
| Blue Harbor | Paulo Reis |
| Paper Moon City | Luc Martin |
| Silent Peak | Kenji Mori |
| Last Signal | Nora Ellis |
| Summer Keys | Anna Berg |
| Iron Garden | Kenji Mori |
| Dust and Gold | Paulo Reis |
| The Quiet Hour | Luc Martin |
Das Wichtigste
- ON verbindet den Fremdschlüssel mit der ID.
- Stelle den Spalten den Alias ihrer Tabelle voran.
- JOIN behält nur die passenden Zeilen.
Häufige Fallen
- Zwei Tabellen haben oft eine Spalte name: Ohne Präfix meldet SQL eine mehrdeutige Spalte.
- ON vergessen: SQLite verbindet dann jede Zeile mit allen Zeilen der anderen Tabelle, ohne jede Fehlermeldung.
- GROUP BY a.name würde zwei Namensvettern zusammenlegen: Gruppiere nach a.id, a.name.
SQLite-Besonderheit
SQLite (wie MySQL) akzeptiert ein JOIN ohne ON und behandelt es als kartesisches Produkt. PostgreSQL, SQL Server und Oracle lehnen die Abfrage ab: Im Standard-SQL verlangt JOIN ein ON (oder USING). Wenn du wirklich alle Kombinationen willst, schreibe es ausdrücklich mit CROSS JOIN.
Die 5 Übungen des Levels
- Zeige den Titel jedes Buchs und den Namen seines Autors.
- Zeige den Namen jedes Spielers und den Namen seines Teams.
- Zeige den Hotelnamen, den Typ und den Preis der Zimmer in Hotels in 'Paris'.
- Zeige den Namen jedes Künstlers und seine Zahl an Songs.
- Zeige die Fluggesellschaft, die Ankunftsstadt und den Preis der 3 teuersten Flüge in ein anderes Land als Frankreich.
In SpeedQL wird jede Abfrage sofort geprüft: Ihr Ergebnis wird mit dem erwarteten verglichen, dann läuft die Abfrage noch einmal auf einer versteckten Kontrolldatenbank. Zu jeder Übung gibt es schriftliche Hinweise, die du nur bei Bedarf aufrufst.
Die Übungen von Level 9 machen
Kostenlos und ohne Anmeldung: Die Lektion und die 5 Übungen öffnen sich direkt in deinem Browser.
← Vorheriges Level: Gruppen mit HAVING filtern · Nächstes Level: LEFT JOIN und mehrere Joins →