Level 9: Zwei Tabellen mit JOIN verbinden

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.

Tabelle movies (10 Zeilen)
idtitlegenreyeardurationratingdirector_id
1Night TrainThriller20151187.81
2Blue HarborDrama20181027.12
3Paper Moon CityComedy2012956.45
4Silent PeakDrama20201318.23
5Last SignalSci-Fi20191427.51
6Summer KeysComedy2016885.94
7Iron GardenSci-Fi202112583
8Dust and GoldWestern20141106.82
9The Quiet HourDrama2022977.45
10Deep CurrentThriller20171056.9NULL
Tabelle directors (6 Zeilen)
idnamecountry
1Nora EllisUK
2Paulo ReisBrazil
3Kenji MoriJapan
4Anna BergSweden
5Luc MartinFrance
6Sara DiazSpain

Ergebnis des Beispiels

titledirector
Night TrainNora Ellis
Blue HarborPaulo Reis
Paper Moon CityLuc Martin
Silent PeakKenji Mori
Last SignalNora Ellis
Summer KeysAnna Berg
Iron GardenKenji Mori
Dust and GoldPaulo Reis
The Quiet HourLuc 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

  1. Geführt · Zeige den Titel jedes Buchs und den Namen seines Autors. (Tabellen: books, authors)
  2. Training · Zeige den Namen jedes Spielers und den Namen seines Teams. (Tabellen: players, teams)
  3. Training · Zeige den Hotelnamen, den Typ und den Preis der Zimmer in Hotels in 'Paris'. (Tabellen: rooms, hotels)
  4. Training · Zeige den Namen jedes Künstlers und seine Zahl an Songs. (Tabellen: songs, artists)
  5. Herausforderung · Zeige die Fluggesellschaft, die Ankunftsstadt und den Preis der 3 teuersten Flüge in ein anderes Land als Frankreich. (Tabellen: flights, airports)

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.

Level 9 in SpeedQL öffnen

·