Welcher Film läuft um 20:30?
Im Kinoprogramm steht bei jeder Vorstellung nur die Nummer des Films, nicht sein Titel. Der Titel steht in einer zweiten Liste.
Um die Frage zu beantworten, musst du beide Listen verbinden. Genau das tut ein JOIN in einer Datenbank.
Am Ende dieser Lektion
Notiz
Ich kann zwei Tabellen mit einem JOIN verbinden.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Fremdschlüssel | eine Spalte mit der Nummer einer Zeile in einer anderen Tabelle | film_id |
| JOIN | verbindet Zeilen zweier Tabellen, die zusammengehören | |
| Verbindungsbedingung | der Test, der sagt, welche Zeilen zusammengehören | ON a.id = b.a_id |
| LEFT JOIN | ein JOIN, der alle Zeilen der linken Tabelle behält | |
| Alias | ein kurzer Name für eine Tabelle in einer Abfrage | f |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Fremdschlüssel zeigt auf eine andere Tabelle
Der Titel eines Films steht nur einmal in der Tabelle filme. Die Tabelle vorstellungen kopiert ihn nicht, sondern merkt sich die Nummer des Films.
Diese Spalte heißt Fremdschlüssel. Die Datenbank prüft bei jeder neuen Zeile, ob es die Nummer in filme wirklich gibt.
Bevor du anfängst
Notiz
Drück oben in der Leiste auf Lab starten, warte auf beide Dienste und öffne das Terminal. Die zwei ersten Runs richten die Anmeldung ein. Hast du das Lab schon laufen, brauchst du sie nur nach einem Neustart des Terminals.
Das Zertifikat des Servers annehmen
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Abkürzung für die Datenbank shop
alias sql='mariadb -h db -u student -pstudent shop -t -e'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein JOIN setzt zusammen, was zusammengehört
Hinter JOIN steht die zweite Tabelle, hinter ON die Verbindungsbedingung: Der Fremdschlüssel einer Seite ist gleich dem Schlüssel der anderen.
Die Datenbank bildet für jede passende Zeile eine neue, breitere Zeile. Schreibe vor jede Spalte den Tabellennamen, damit klar ist, woher sie kommt.
Teure Artikel mit dem Namen ihrer Kategorie
sql "SELECT products.name, categories.name AS kategorie, products.price FROM products JOIN categories ON categories.id = products.category_id WHERE products.price > 60 ORDER BY products.price"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die ersten drei Bestellungen mit Kundenname
sql "SELECT orders.id, customers.first_name, customers.city, orders.status FROM orders JOIN customers ON customers.id = orders.customer_id WHERE orders.id <= 3 ORDER BY orders.id"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Probier es: Vorstellungen mit Titel
-- Jede Vorstellung mit dem Titel ihres Films.
SELECT filme.titel, vorstellungen.saal, vorstellungen.uhrzeit
FROM vorstellungen
JOIN filme ON filme.id = vorstellungen.film_id
ORDER BY vorstellungen.uhrzeit;
-- Ändere JOIN in LEFT JOIN und tausche die Tabellen hinter FROM und JOIN.
Ein einfacher JOIN lässt Zeilen ohne Partner weg
Ein normaler JOIN zeigt nur Zeilen, die auf beiden Seiten einen Partner haben. Ein Film ohne Vorstellung verschwindet aus dem Ergebnis.
Ein LEFT JOIN behält alle Zeilen der Tabelle vor dem Wort JOIN. Hat eine keinen Partner, steht in den Spalten der anderen Tabelle NULL.
Beispiel: dieselben Filme, zwei Joins
| Film | Mit JOIN | Mit LEFT JOIN |
|---|---|---|
| Sturmflut | 2 Zeilen | 2 Zeilen |
| Hinterhof | 2 Zeilen | 2 Zeilen |
| Nachtzug | 1 Zeile | 1 Zeile |
| Nordlicht (keine Vorstellung) | fehlt | 1 Zeile mit NULL |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele glauben, ein JOIN zeige immer alle Zeilen beider Tabellen. Das stimmt nicht. Ein normaler JOIN wirft jede Zeile ohne Partner weg, ohne eine Meldung. Willst du auch die ohne Partner sehen, nimm einen LEFT JOIN.
Artikel mit Kategorie zählen
sql "SELECT COUNT(*) AS mit_kategorie FROM products JOIN categories ON categories.id = products.category_id"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Artikel ohne Kategorie mit einem LEFT JOIN finden
sql "SELECT products.name FROM products LEFT JOIN categories ON categories.id = products.category_id WHERE categories.id IS NULL ORDER BY products.name"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Probier es: Filme ohne Vorstellung
-- Alle Filme, auch die ohne Vorstellung.
SELECT filme.titel, vorstellungen.uhrzeit
FROM filme
LEFT JOIN vorstellungen ON vorstellungen.film_id = filme.id
ORDER BY filme.titel;
-- Welche zwei Filme zeigen NULL? Ergänze WHERE vorstellungen.id IS NULL.
Eine eigene Datenbank anlegen
sql "CREATE DATABASE IF NOT EXISTS student_kino"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Abkürzung dafür
alias kino='mariadb -h db -u student -pstudent student_kino -t -e'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Von vorn beginnen: beide Tabellen löschen
kino "DROP TABLE IF EXISTS vorstellungen, filme"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Tabelle der Filme anlegen
kino "CREATE TABLE filme (id INT AUTO_INCREMENT PRIMARY KEY, titel VARCHAR(60) NOT NULL)"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Tabelle der Vorstellungen mit Fremdschlüssel
kino "CREATE TABLE vorstellungen (id INT AUTO_INCREMENT PRIMARY KEY, film_id INT NOT NULL, saal VARCHAR(10) NOT NULL, uhrzeit TIME NOT NULL, FOREIGN KEY (film_id) REFERENCES filme(id))"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Einen Film eintragen
kino "INSERT INTO filme (titel) VALUES ('Sturmflut')"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Vorstellung für Film 9 eintragen
kino "INSERT INTO vorstellungen (film_id, saal, uhrzeit) VALUES (9, 'Saal 1', '18:00')"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.