Komplexe SQL Statements (JOIN)
In dieser interaktiven Lerneinheit erweiterst du deine SQL-Kenntnisse um komplexe Abfragen mit verschiedenen JOIN-Arten, die das Verknüpfen mehrerer Tabellen ermöglichen. Du lernst die Syntax und Anwendung von INNER JOIN, LEFT JOIN, RIGHT JOIN sowie FULL OUTER JOIN kennen und übst deren praktische Verwendung anhand realitätsnaher Datenbankszenarien. Durch zahlreiche Übungen entwickelst du die Fähigkeit, auch aus komplex strukturierten Datenbanken genau die Informationen abzufragen, die du für deine Projekte benötigst.
Einführung
Du sollst für den Azubi-Planer im Unternehmen eine Übersicht aller Mitarbeitenden mit ihren aktuellen Schulungen erstellen. Kein Problem – denkst du. Doch die Daten sind auf vier verschiedene Tabellen verteilt: Mitarbeitende, Abteilungen, Schulungen und Teilnahmen. Wie holst du die Infos aus diesem Datenchaos heraus?

Die Lösung:
JOIN-Statements sind das Werkzeug, mit dem du Daten aus mehreren Tabellen logisch verknüpfst. Damit kannst du z. B. sehen, welcher Mitarbeitende in welcher Abteilung arbeitet – auch wenn diese Infos auf zwei Tabellen verteilt sind.
Lernziele
Nach dieser Lerneinheit kannst du:
- erklären, was JOINs in SQL sind und warum sie notwendig sind, um Daten aus mehreren Tabellen zu kombinieren.
- unterscheiden zwischen INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN, CROSS JOIN und SELF JOIN – und deren Einsatzzweck beschreiben.
- für typische Szenarien den passenden JOIN-Typ auswählen und korrekt anwenden.
- eigene JOIN-Abfragen schreiben, die reale Anforderungen abbilden.
Überleitung
Um zu verstehen, wie das genau funktioniert, schauen wir uns jetzt an, was JOIN-Statements sind, welche Arten von JOINs es gibt – und wie du sie korrekt einsetzt, um auch komplexe Datenbeziehungen zuverlässig abzufragen.
Was sind JOINs in SQL?
JOINs in SQL ermöglichen es, Daten aus zwei oder mehr Tabellen basierend auf gemeinsamen Spalten zu kombinieren. Sie sind entscheidend, um Beziehungen zwischen Tabellen abzubilden und komplexe Abfragen zu erstellen.
Es gibt verschiedene Arten von JOINs:
Was macht ein Inner Join?
Mit einem Inner Join verknüpfst du zwei Tabellen, aber: Du bekommst nur die Datensätze angezeigt, bei denen es in beiden Tabellen eine passende Verbindung gibt. Die Verknüpfung erfolgt über ein gemeinsames Feld – etwa eine ID oder ein Schlüssel.
Warum ist das nützlich?
Stell dir vor, du arbeitest in einer Firma mit zwei Tabellen in der Datenbank:
-
Bestellungen, in der jede Bestellung mit einer Kundennummer gespeichert ist
-
Kunden, in der für jede Kundennummer Name und Adresse hinterlegt sind
Wenn du nun wissen willst, wer was bestellt hat, brauchst du Informationen aus beiden Tabellen. Genau hier hilft dir der Inner Join: Er verbindet jede Bestellung mit den passenden Kundendaten – aber nur dann, wenn es zu der Bestell-Kundennummer auch wirklich einen Kundeneintrag gibt.
Der INNER JOIN in der Praxis
Syntax:
SELECT Tabelle1.Feld, Tabelle2.Feld
FROM Tabelle1
INNER JOIN Tabelle2
ON Tabelle1.GemeinsamesFeld = Tabelle2.GemeinsamesFeld;Beispiel:
SELECT Bestellungen.BestellNr, Kunden.Name
FROM Bestellungen
INNER JOIN Kunden
ON Bestellungen.KundenNr = Kunden.KundenID;Dieser Befehl listet die Bestellnummern zusammen mit dem Namen des Kunden auf, der die jeweilige Bestellung aufgegeben hat.
Was passiert mit unvollständigen Daten?
Wenn in der Bestellungen-Tabelle eine KundenNr steht, die nicht in der Kunden-Tabelle vorhanden ist, wird diese Bestellung im Ergebnis nicht angezeigt. Genauso erscheinen auch keine Kunden, die noch nichts bestellt haben. Der Inner Join zeigt dir also nur die Datensätze, die auf beiden Seiten zueinander passen.
Merke:
- Inner Join = “Zeig mir nur das, was zusammenpasst.”
- Ideal, wenn du Daten aus mehreren Tabellen kombinieren willst, aber nur die vollständigen Informationen brauchst.
- Funktioniert nur über ein gemeinsames Feld – meistens ein Fremdschlüssel.
Was macht ein Left Join?
Mit einem Left Join (oder auch Left Outer Join) bekommst du alle Datensätze aus der linken Tabelle – unabhängig davon, ob es passende Einträge in der rechten Tabelle gibt. Wenn keine passenden Daten auf der rechten Seite gefunden werden, werden diese Felder mit NULL aufgefüllt.
Wann ist das nützlich?
Stell dir wieder zwei Tabellen vor:
Bestellungen(linke Tabelle)Lieferungen(rechte Tabelle)
Du willst herausfinden, welche Bestellungen bereits geliefert wurden und welche noch offen sind. Mit einem Left Join bekommst du alle Bestellungen aufgelistet. Dort, wo schon geliefert wurde, steht der Lieferstatus. Wo noch nicht geliefert wurde, steht NULL.
Der Left Join in der Praxis
Syntax:
SELECT Tabelle1.Feld, Tabelle2.Feld
FROM Tabelle1
LEFT OUTER JOIN Tabelle2
ON Tabelle1.GemeinsamesFeld = Tabelle2.GemeinsamesFeld;Beispiel:
SELECT Bestellungen.BestellNr, Lieferungen.Lieferdatum
FROM Bestellungen
LEFT OUTER JOIN Lieferungen
ON Bestellungen.BestellNr = Lieferungen.BestellNr;Dieser Befehl zeigt dir jede Bestellung, und wenn es bereits eine Lieferung dazu gibt, wird auch das Lieferdatum angezeigt. Falls nicht, steht dort NULL.
Beispielhafte Ausgabe:
| BestellNr | Lieferdatum |
|---|---|
| 1001 | 2023-04-02 |
| 1002 | NULL |
| 1003 | 2023-04-04 |
Merke:
- Left Join = “Zeig mir alles aus der linken Tabelle, egal ob es rechts dazugehört oder nicht.”
- Praktisch, um fehlende Daten zu identifizieren (z. B. Bestellungen ohne Lieferung).
- Auch hier erfolgt die Verbindung über ein gemeinsames Feld (z. B. Bestellnummer).
- Nicht passende rechte Datensätze erscheinen als
NULL.
Was macht ein Right Join?
Ein Right Join (oder Right Outer Join) gibt dir alle Datensätze aus der rechten Tabelle – ergänzt um passende Daten aus der linken Tabelle. Wenn auf der linken Seite kein passender Eintrag vorhanden ist, wird die fehlende Information mit NULL ersetzt.
Wann ist das nützlich?
Stell dir vor, du hast zwei Tabellen:
Mitarbeiter(linke Tabelle)Abteilungen(rechte Tabelle)
Du möchtest alle Abteilungen sehen – auch solche, in denen aktuell kein Mitarbeiter arbeitet. Mit einem Right Join bekommst du genau das: Jede Abteilung wird aufgelistet, und wenn es Mitarbeiter gibt, erscheinen sie daneben. Wenn nicht, bleibt das Mitarbeiterfeld NULL.
Der Right Join in der Praxis
Syntax:
SELECT Tabelle1.Feld, Tabelle2.Feld
FROM Tabelle1
RIGHT OUTER JOIN Tabelle2
ON Tabelle1.GemeinsamesFeld = Tabelle2.GemeinsamesFeld;Beispiel:
SELECT Mitarbeiter.Vorname, Abteilung.Abteilungsname
FROM Mitarbeiter
RIGHT OUTER JOIN Abteilung
ON Mitarbeiter.AbteilungsNr = Abteilung.AbteilungsID;Dieser Befehl gibt dir eine Liste aller Abteilungen und zeigt jeweils die zugeordneten Mitarbeiter an. Gibt es keine, steht dort NULL beim Vornamen.
Beispielhafte Ausgabe:
| Vorname | Abteilungsname |
|---|---|
| Max | IT |
| Anna | Personal |
| Lisa | Marketing |
| NULL | Finanzen |
Merke:
- Right Join = “Zeig mir alles aus der rechten Tabelle, auch wenn es links niemanden dazu gibt.”
- Nützlich, wenn du alle Referenzeinträge brauchst, auch ohne zugehörige Daten auf der linken Seite.
- Die Verknüpfung erfolgt wie bei anderen Joins über ein gemeinsames Feld (z. B. Abteilungs-ID).
- Nicht passende linke Datensätze werden mit
NULLangezeigt.
Was macht ein Full Outer Join?
Ein Full Outer Join kombiniert die Ergebnisse eines Left und eines Right Joins. Er zeigt dir alle Datensätze aus beiden Tabellen – egal ob es Überschneidungen gibt oder nicht. Wenn keine passenden Einträge gefunden werden, werden die fehlenden Felder mit NULL ergänzt.
Wann ist das nützlich?
Ein Full Outer Join ist hilfreich, wenn du eine vollständige Übersicht über beide Tabellen brauchst, z. B. um zu sehen:
- welche Bestellungen einen Kunden haben
- welche Bestellungen keinen Kunden zugeordnet bekommen haben (z. B. durch Datenfehler)
- welche Kunden noch nichts bestellt haben
Der Full Outer Join in der Praxis
Syntax:
SELECT Tabelle1.Feld, Tabelle2.Feld
FROM Tabelle1
FULL OUTER JOIN Tabelle2
ON Tabelle1.GemeinsamesFeld = Tabelle2.GemeinsamesFeld;Hinweis: Nicht alle Datenbanksysteme unterstützen FULL OUTER JOIN direkt. In solchen Fällen kann man mit einer Kombination aus LEFT JOIN und RIGHT JOIN arbeiten.
Alternative für Systeme ohne FULL OUTER JOIN:
Falls dein Datenbanksystem keinen FULL OUTER JOIN unterstützt (z.B. MySQL vor Version 8.0), kannst du das gleiche Ergebnis mit einer UNION-Kombination aus LEFT JOIN und RIGHT JOIN erreichen:
-- Alternative für Systeme ohne FULL OUTER JOIN:
SELECT m.Name, a.Name AS Abteilung
FROM Mitarbeiter m
LEFT JOIN Abteilungen a ON m.AbteilungsID = a.ID
UNION
SELECT m.Name, a.Name AS Abteilung
FROM Mitarbeiter m
RIGHT JOIN Abteilungen a ON m.AbteilungsID = a.ID;Diese Lösung kombiniert alle Mitarbeiter (auch die ohne Abteilung) mit allen Abteilungen (auch die ohne Mitarbeiter). UNION entfernt automatisch Duplikate, sodass du das gleiche Ergebnis wie bei einem FULL OUTER JOIN erhältst.
Beispiel:
Du hast zwei Tabellen:
Kunden: mit Kundennamen und Kunden-IDBestellungen: mit Bestellnummern und Kunden-ID
SELECT Kunden.Name, Bestellungen.BestellNr
FROM Kunden
FULL OUTER JOIN Bestellungen
ON Kunden.KundenID = Bestellungen.KundenID;Ergebnis:
| Name | BestellNr |
|---|---|
| Max | 1001 |
| Anna | 1002 |
| NULL | 1003 |
| Lisa | NULL |
Merke:
- Full Outer Join = “Zeig mir alles, was in beiden Tabellen ist – auch wenn nichts zusammenpasst.”
- Perfekt, um Vollständigkeit zu prüfen und Lücken zu erkennen.
- Fehlende Werte auf beiden Seiten erscheinen als
NULL.
Was macht ein Cross Join?
Ein Cross Join erzeugt das kartesische Produkt zweier Tabellen. Das bedeutet: Jede Zeile der ersten Tabelle wird mit jeder Zeile der zweiten Tabelle kombiniert.
Wann ist das nützlich?
Cross Joins benutzt man selten, aber gezielt – z. B. wenn du alle möglichen Kombinationen zweier Merkmalsgruppen erstellen willst:
- Alle Farben mit allen Produktvarianten
- Alle Mitarbeitenden mit allen Kalenderwochen
Der Cross Join in der Praxis
Syntax:
SELECT *
FROM Tabelle1
CROSS JOIN Tabelle2;Achtung: Wenn Tabelle1 10 Zeilen hat und Tabelle2 5, erhältst du 50 Zeilen im Ergebnis. Die Menge steigt also sehr schnell.
Beispiel:
Du hast zwei Tabellen:
Farben: Rot, BlauGrößen: S, M, L
SELECT *
FROM Farben
CROSS JOIN Groessen;Ergebnis:
| Farbe | Größe |
|---|---|
| Rot | S |
| Rot | M |
| Rot | L |
| Blau | S |
| Blau | M |
| Blau | L |
Du erhältst jede Kombination aus Farbe und Größe – ideal für z. B. Produktvarianten im Onlineshop.
Merke dir:
- Cross Join = “Alle mit allen kombinieren.”
- Liefert das kartesische Produkt beider Tabellen.
- Kann sinnvoll sein bei systematischen Kombinationen.
- Achtung bei großen Datenmengen – das Ergebnis kann riesig werden.
Was macht ein Self Join?
Ein Self Join verbindet eine Tabelle mit sich selbst. Das klingt erstmal ungewöhnlich, ist aber sehr praktisch, wenn du Beziehungen innerhalb derselben Tabelle analysieren willst – zum Beispiel: Wer arbeitet im selben Ort? Wer hat denselben Vorgesetzten? Welche Produkte gehören zur gleichen Kategorie?
Wann ist das nützlich?
Angenommen, du hast eine Tabelle Mitarbeiter mit Name, Ort und Mitarbeiter-ID. Du willst herausfinden, welche Mitarbeiter im selben Ort arbeiten – dann brauchst du einen Self Join.
Der Self Join in der Praxis
Syntax:
SELECT A.Feld, B.Feld
FROM Tabelle A
JOIN Tabelle B
ON A.GemeinsamesFeld = B.GemeinsamesFeld;Dabei gibst du der Tabelle zwei verschiedene Aliase (A und B), damit du auf unterschiedliche Zeilen innerhalb derselben Tabelle zugreifen kannst.
Beispiel:
SELECT a1.Nachname AS Mitarbeiter1, a2.Nachname AS Mitarbeiter2, a1.Ort
FROM Mitarbeiter a1
JOIN Mitarbeiter a2
ON a1.Ort = a2.Ort
WHERE a1.MitarbeiterID <> a2.MitarbeiterID;Dieser Befehl zeigt dir alle Mitarbeiterpaare, die im gleichen Ort arbeiten – aber nicht die gleiche ID haben (damit niemand mit sich selbst verglichen wird).
Beispielhafte Ausgabe:
| Mitarbeiter1 | Mitarbeiter2 | Ort |
|---|---|---|
| Max | Hans | Zürich |
| Hans | Max | Zürich |
Merke:
- Self Join = “Ich vergleiche eine Tabelle mit sich selbst.”
- Nützlich bei innerhalb der Tabelle liegenden Beziehungen (z. B. gleiche Orte, gleiche Gruppen).
- Wichtig: Arbeite mit Aliassen, sonst weiß SQL nicht, welche Zeile du meinst.
Warum sind JOINs wichtig?
- Datenintegration: Zusammenführung von logisch zusammenhängenden Daten aus verschiedenen Tabellen.
- Reduktion von Redundanz: Vermeidung von Datenwiederholungen durch Normalisierung.
- Komplexe Abfragen: Erstellung detaillierter Berichte und Datenanalysen.
- Effizienz: Optimierte Datenabfragen durch gezielte Verknüpfungen.
Praxisbeispiel
Ziel
Erstellung eines kompakten Berichts mit Nutzung verschiedener Join-Typen:
- Mitarbeiter: Vorname, Nachname, Abteilungsname
- Projekte: Projektname (falls vorhanden)
- Vorgesetzter: Name des Vorgesetzten (falls vorhanden)
Tabellenübersicht
Mitarbeiter
| MitarbeiterID | Vorname | Nachname | AbteilungsNr | VorgesetztenID |
|---|---|---|---|---|
| 1 | Maria | Eichenau | 1 | NULL |
| 2 | Sean | Conolly | 2 | 1 |
| 3 | Stefanie | Glahn | 2 | 1 |
Abteilung
| AbteilungsID | Abteilungsname |
|---|---|
| 1 | Personal |
| 2 | Verkauf |
Projekt
| ProjektID | Projektname |
|---|---|
| 1 | Verkaufsmesse |
Mitarbeiter_Projekt
| MitarbeiterID | ProjektID |
|---|---|
| 2 | 1 |
SQL-Abfrage
SELECT
M.Vorname AS Mitarbeiter,
M.Nachname,
A.Abteilungsname,
P.Projektname,
V.Vorname AS Vorgesetzter
FROM
Mitarbeiter M
INNER JOIN
Abteilung A ON M.AbteilungsNr = A.AbteilungsID
LEFT JOIN
Mitarbeiter V ON M.VorgesetztenID = V.MitarbeiterID
LEFT JOIN
Mitarbeiter_Projekt MP ON M.MitarbeiterID = MP.MitarbeiterID
LEFT JOIN
Projekt P ON MP.ProjektID = P.ProjektID
ORDER BY
M.Nachname;Ergebnis:
| Mitarbeiter | Nachname | Abteilungsname | Projektname | Vorgesetzter |
|---|---|---|---|---|
| Sean | Conolly | Verkauf | Verkaufsmesse | Maria |
| Maria | Eichenau | Personal | NULL | NULL |
| Stefanie | Glahn | Verkauf | NULL | Maria |
Erklärung der Join-Arten
- INNER JOIN Abteilung: Verbindet jeden Mitarbeiter fest mit seiner Abteilung.
- LEFT JOIN Mitarbeiter (Vorgesetzter): Zeigt jeden Mitarbeiter, ergänzt Vorgesetzte, falls vorhanden.
- LEFT JOIN Projekt: Zeigt alle Mitarbeiter, unabhängig davon, ob sie einem Projekt zugeordnet sind.
Zusammenfassung
In dieser Lerneinheit hast du gelernt, wie du mit SQL-JOINs Daten aus mehreren Tabellen kombinierst, um komplexe Informationen aus relationalen Datenbanken abzurufen.
-
JOINs ermöglichen es dir, Beziehungen zwischen Tabellen sichtbar zu machen – etwa, welcher Kunde welche Bestellung aufgegeben hat.
-
Du kennst jetzt die wichtigsten JOIN-Typen und ihren Einsatzzweck:
- INNER JOIN: Zeigt nur Datensätze, die in beiden Tabellen übereinstimmen.
- LEFT JOIN: Zeigt alle Datensätze der linken Tabelle, ergänzt um passende Werte aus der rechten – oder
NULL, wenn nichts passt. - RIGHT JOIN: Umgekehrt – alle aus der rechten Tabelle, ergänzt um passende linke Daten.
- FULL OUTER JOIN: Verbindet beide Seiten vollständig – alles, was passt, und alles, was nicht passt, wird angezeigt.
- CROSS JOIN: Erzeugt das kartesische Produkt, also alle möglichen Kombinationen zweier Tabellen.
- SELF JOIN: Verknüpft eine Tabelle mit sich selbst, um z. B. interne Beziehungen wie Hierarchien oder gleiche Orte zu analysieren.
-
Du kannst JOINs jetzt gezielt einsetzen, um etwa Bestellungen mit Kundendaten zu verbinden, Lieferstatus auszuwerten oder Mitarbeitende ihren Abteilungen und Vorgesetzten zuzuordnen.