Oft steckt die Antwort auf eine Datenbankfrage nicht in einer einzigen Tabelle. Eine Bestellung kennt vielleicht nur eine Kunden-ID, der Kundenname steht aber in einer anderen Tabelle. SQL JOIN verbindet solche Tabellen wieder sinnvoll. Nach dieser Erklärung kannst du INNER JOIN und OUTER JOIN unterscheiden, einfache JOIN-Abfragen lesen und typische Denkfehler erkennen.
- Ich kann erklären, warum JOINs in relationalen Datenbanken gebraucht werden.
- Ich kann eine JOIN-Bedingung mit Primär- und Fremdschlüssel deuten.
- Ich kann INNER JOIN, LEFT JOIN und FULL OUTER JOIN grob unterscheiden.
- Ich kann erkennen, wann eine Zwischentabelle für n:m-Beziehungen nötig ist.
- Ich kann einfache JOIN-Abfragen mit SELECT, FROM, JOIN und ON lesen.
Warum Tabellen verbunden werden
Relationale Datenbanken verteilen Informationen auf mehrere Tabellen, damit Daten nicht unnötig doppelt gespeichert werden. Das ist sauber, aber beim Abfragen musst du die passenden Teile wieder zusammenführen.
JOIN
Ein JOIN ist eine SQL-Verknüpfung zwischen Tabellen. Er erzeugt Ergebniszeilen, indem Zeilen aus verschiedenen Tabellen nach einer Bedingung zusammengeführt werden.
Join-Bedingung
Die Join-Bedingung steht meist nach ON. Sie sagt, welche Werte aus beiden Tabellen zusammenpassen, zum Beispiel Bestellung.kunden_id = Kunde.id.
Ohne JOIN würdest du nur Nummern sehen. Mit JOIN kannst du die Nummern mit den passenden Namen, Titeln oder Preisen verbinden.
Tabelle Kunde
| id | name |
|---|---|
| 1 | Mia |
| 2 | Ben |
Tabelle Bestellung
| id | kunden_id | artikel |
|---|---|---|
| 10 | 1 | Heft |
| 11 | 2 | Stift |
Abfrage:
SELECT Kunde.name, Bestellung.artikel
FROM Bestellung
JOIN Kunde ON Bestellung.kunden_id = Kunde.id;
Ergebnis:
| name | artikel |
|---|---|
| Mia | Heft |
| Ben | Stift |
Ein JOIN beantwortet die Frage: Welche Zeile aus Tabelle A gehört zu welcher Zeile aus Tabelle B?
Interaktive Quizfrage wird geladen ...
INNER JOIN: Nur passende Paare
Der häufigste JOIN ist der INNER JOIN. Er zeigt nur Zeilen, für die es auf beiden Seiten einen Treffer gibt. Wenn eine Bestellung auf keinen Kunden passt, erscheint sie nicht. Wenn ein Kunde keine Bestellung hat, erscheint er ebenfalls nicht.
INNER JOIN
Ein INNER JOIN liefert nur Zeilen, bei denen die Join-Bedingung in beiden Tabellen erfüllt ist. Nicht passende Zeilen werden im Ergebnis weggelassen.
In SQL darf man oft einfach JOIN schreiben; gemeint ist dann meist INNER JOIN. Für Schulaufgaben ist es aber hilfreich, "inner" mitzudenken: Nur der gemeinsame passende Teil wird angezeigt.
Tabelle Kunde
| id | name |
|---|---|
| 1 | Mia |
| 2 | Ben |
| 3 | Sara |
Tabelle Bestellung
| id | kunden_id | artikel |
|---|---|---|
| 10 | 1 | Heft |
| 11 | 2 | Stift |
| 12 | 99 | Tasche |
Abfrage:
SELECT Kunde.name, Bestellung.artikel
FROM Bestellung
INNER JOIN Kunde ON Bestellung.kunden_id = Kunde.id;
Ergebnis:
- Mia, Heft
- Ben, Stift
Sara fehlt, weil sie keine Bestellung hat. Die Bestellung mit kunden_id = 99 fehlt, weil es keinen passenden Kunden gibt.
In einer gut entworfenen Datenbank verhindert ein Fremdschlüssel normalerweise eine Bestellung mit kunden_id = 99, wenn es diesen Kunden nicht gibt. Für Lernbeispiele ist der Fall trotzdem nützlich, weil du daran das JOIN-Verhalten erkennst.
Interaktiver Lückentext wird geladen ...
LEFT JOIN: Alles links behalten
Manchmal willst du auch Zeilen sehen, die keinen passenden Partner haben. Dafür nutzt du einen OUTER JOIN. Der wichtigste für den Einstieg ist LEFT JOIN.
LEFT JOIN
Ein LEFT JOIN liefert alle Zeilen der linken Tabelle und ergänzt passende Zeilen aus der rechten Tabelle. Gibt es rechts keinen Treffer, stehen dort leere Werte, also NULL.
Links bedeutet: die Tabelle, die im SQL-Text vor LEFT JOIN steht. Das ist eine häufige Prüfungsfalle. Dreht man die Tabellen um, ändert sich auch, was "links" ist.
Alle Kunden anzeigen, auch wenn sie nichts bestellt haben:
SELECT Kunde.name, Bestellung.artikel
FROM Kunde
LEFT JOIN Bestellung ON Kunde.id = Bestellung.kunden_id;
Mit den Tabellen aus dem letzten Beispiel entsteht:
- Mia, Heft
- Ben, Stift
- Sara, NULL
Sara bleibt im Ergebnis, weil Kunde links steht. Bei ihrer Bestellungsspalte steht NULL, weil es keine passende Bestellung gibt.
Beim LEFT JOIN bleibt die linke Tabelle vollständig erhalten. Frage dich immer: Welche Tabelle steht links von LEFT JOIN?
Interaktive Quizfrage wird geladen ...
RIGHT, FULL und CROSS JOIN kurz eingeordnet
Neben INNER und LEFT gibt es weitere JOIN-Arten. Du musst sie nicht alle ständig verwenden, aber du solltest ihre Idee erkennen.
RIGHT JOIN
Ein RIGHT JOIN funktioniert wie ein LEFT JOIN, nur bleibt die rechte Tabelle vollständig erhalten. Viele Entwickler vermeiden ihn, indem sie die Tabellenreihenfolge umdrehen und LEFT JOIN nutzen.
FULL OUTER JOIN
Ein FULL OUTER JOIN behält alle Zeilen beider Tabellen. Wo kein Partner gefunden wird, stehen auf der fehlenden Seite NULL-Werte.
CROSS JOIN
Ein CROSS JOIN kombiniert jede Zeile der einen Tabelle mit jeder Zeile der anderen Tabelle. Das Ergebnis ist das kartesische Produkt.
Ein CROSS JOIN ist selten das, was du aus Versehen willst: Bei 4 Zeilen links und 3 Zeilen rechts entstehen 12 Kombinationen. Fehlt bei einem normalen JOIN die passende Bedingung, kann eine viel zu große Ergebnismenge entstehen.
Tabelle Farbe: Rot, Blau
Tabelle Groesse: S, M, L
CROSS JOIN erzeugt:
- Rot S
- Rot M
- Rot L
- Blau S
- Blau M
- Blau L
Das ist sinnvoll, wenn wirklich alle Kombinationen gebraucht werden, zum Beispiel Produktvarianten.
Interaktive Quizfrage wird geladen ...
JOINs bei n:m-Beziehungen
Bei n:m-Beziehungen reicht ein einzelner Fremdschlüssel nicht aus. Wenn Schüler mehrere Kurse belegen und Kurse mehrere Schüler haben, entsteht eine Zwischentabelle. JOINs holen daraus wieder lesbare Ergebnisse.
Zwischentabelle
Eine Zwischentabelle speichert die Zuordnungen einer n:m-Beziehung. Sie enthält meist Fremdschlüssel auf beide beteiligten Tabellen.
Tabellen:
Schueler(id, name)
Kurs(id, titel)
Belegung(schueler_id, kurs_id)
Frage: "Welche Kurse belegt Mia?"
SQL:
SELECT Kurs.titel
FROM Schueler
JOIN Belegung ON Schueler.id = Belegung.schueler_id
JOIN Kurs ON Belegung.kurs_id = Kurs.id
WHERE Schueler.name = 'Mia';
Erst verbindet SQL Mia mit ihren Belegungen. Dann verbindet SQL diese Belegungen mit den passenden Kursen.
Bei mehreren JOINs liest du am besten Kette für Kette: Von welcher Tabelle starte ich? Über welche Fremdschlüssel gehe ich weiter? Welche Spalten sollen am Ende angezeigt werden?
n:m-Beziehungen liest du meist über zwei JOINs: Starttabelle → Zwischentabelle → Zieltabelle.
Prüfungsmodus
JOIN-Aufgaben wirken schwer, wenn du nur auf die SQL-Wörter starrst. Zeichne dir lieber kleine Pfeile zwischen den Schlüsseln. Dann wird die Abfrage fast mechanisch.
Aufgabe:
"Gib alle Artikelnamen aus, die Ben bestellt hat."
Tabellen:
Kunde(id, name)Bestellung(id, kunden_id)Bestellposition(bestellung_id, artikel_id)Artikel(id, name)
Denkweg:
- Ben steht in
Kunde. - Seine Bestellungen findest du über
Kunde.id = Bestellung.kunden_id. - Die Artikel pro Bestellung findest du über
Bestellung.id = Bestellposition.bestellung_id. - Die Artikelnamen findest du über
Bestellposition.artikel_id = Artikel.id.
SQL-Skelett:
SELECT Artikel.name
FROM Kunde
JOIN Bestellung ON Kunde.id = Bestellung.kunden_id
JOIN Bestellposition ON Bestellung.id = Bestellposition.bestellung_id
JOIN Artikel ON Bestellposition.artikel_id = Artikel.id
WHERE Kunde.name = 'Ben';
Interaktive Quizfrage wird geladen ...
Alles auf einen Blick
Interaktive Mindmap wird geladen ...
Interaktive Lernkarten wird geladen ...
Abschluss-Check
Interaktive Quizfrage wird geladen ...
Zusammenfassung
Ein SQL JOIN verbindet Tabellen über eine Bedingung, meistens über Primär- und Fremdschlüssel. So werden verteilte Daten wieder zu lesbaren Ergebnissen zusammengesetzt.
INNER JOIN zeigt nur passende Paare. LEFT JOIN behält alle Zeilen der linken Tabelle und füllt fehlende rechte Werte mit NULL. CROSS JOIN bildet alle Kombinationen und muss bewusst eingesetzt werden.
Bei n:m-Beziehungen führt der Weg meist über eine Zwischentabelle. Wenn du die Schlüssel-Pfade zeichnest, kannst du auch längere JOIN-Abfragen Schritt für Schritt verstehen.
Mit Google fortfahren