Skript: Datenbanken und SQL mit der Warenautomat-Datenbank
11. JOINs und Mehrfach-JOINs
Da wir in der Modellierung oder bei der Normalisierung häufig Daten in verschiedenen Tabellen speichern, die wir aber gemeinsam in einer Abfrage benötigen, brauchen wir eine Möglichkeit, Daten aus mehreren Tabellen abzufragen. Dies geschieht mittels JOINs.
11.1 Einfacher JOIN
Mit JOINs verbindet man Daten aus mehreren Tabellen über Beziehungen (meist Primär- und Fremdschlüssel).
Wichtige JOIN-Arten:
INNER JOIN: Nur Datensätze mit passender Verknüpfung auf beiden Seiten.LEFT JOIN: Alle Datensätze der linken Tabelle, auch wenn rechts kein Treffer existiert.RIGHT JOIN: Alle Datensätze der rechten Tabelle, auch wenn links kein Treffer existiert.OUTER JOIN: Alle Datensätze beider Tabellen, auch wenn auf einer Seite kein Treffer existiert.SELF JOIN: Eine Tabelle wird mit sich selbst verknüpft (z. B. Hierarchien oder Vergleiche innerhalb derselben Tabelle).
[!NOTE] Beispiel
INNER JOIN:SELECT a.seriennummer, s.bezeichnung FROM automat a INNER JOIN standort s ON a.standort_id = s.standort_id;
[!NOTE] Beispiel
LEFT JOIN:SELECT l.name AS lieferant, p.name AS produkt FROM lieferant l LEFT JOIN produkt p ON p.lieferant_id = l.lieferant_id;
[!NOTE] Beispiel
FULL OUTER JOIN:SELECT l.name AS lieferant, p.name AS produkt FROM lieferant l FULL OUTER JOIN produkt p ON p.lieferant_id = l.lieferant_id;
[!NOTE] Beispiel
SELF JOIN(Automaten im gleichen Standort):SELECT a1.seriennummer AS automat_1, a2.seriennummer AS automat_2, a1.standort_id FROM automat a1 JOIN automat a2 ON a1.standort_id = a2.standort_id AND a1.automat_id < a2.automat_id;
11.2 JOIN über Fremdschlüssel
JOINs folgen häufig genau den im Modell definierten Fremdschlüsseln.
ON und WHERE sauber trennen:
ONbeschreibt die Verknüpfungslogik zwischen Tabellen.WHEREfiltert das Ergebnis nach der Verknüpfung.
11.3 Mehrfach-JOIN
Mehrfache JOINs verbinden drei oder mehr Tabellen.
Vorgehensweise bei Mehrfach-JOINs:
- Mit zwei Tabellen starten und Ergebnis prüfen.
- Dann schrittweise weitere Tabellen ergänzen.
- Für jede neue Tabelle die FK-Beziehung in
ONklar angeben. - Aliase verwenden, um Spalten eindeutig und lesbar zu halten.
[!NOTE] Beispiel:
SELECT a.seriennummer, s.bezeichnung AS standort, p.name AS produkt, i.aktueller_bestand FROM inventar i JOIN automat a ON i.automat_id = a.automat_id JOIN standort s ON a.standort_id = s.standort_id JOIN produkt p ON i.produkt_id = p.produkt_id;
11.4 Häufige JOIN-Fehler
- Fehlende
ON-Bedingung: Führt zu sehr vielen falschen Kombinationen (kartesisches Produkt). - Falscher Join-Schlüssel: Tabellen werden über unpassende Spalten verbunden.
- Verwechslung von
ONundWHEREbeiLEFT JOIN: Gewollte “auch ohne Treffer”-Zeilen verschwinden. - Mehrdeutige Spaltennamen: Ohne Alias ist oft unklar, aus welcher Tabelle eine Spalte kommt.
- Unerwartete Duplikate: Bei 1:n- oder m:n-Beziehungen ist Mehrfachausgabe normal und muss korrekt interpretiert werden.
Querverweise
Übungen zum Kapitel
Übung 1: Gib Automaten mit ihrem Standort aus.
Lösung
**Lösung:** ```sql SELECT a.seriennummer, a.modell, s.bezeichnung, s.ort FROM automat a JOIN standort s ON a.standort_id = s.standort_id; ```Übung 2: Gib Produkte mit dem Namen ihres Lieferanten aus.
Lösung
**Lösung:** ```sql SELECT p.name AS produkt, l.name AS lieferant FROM produkt p JOIN lieferant l ON p.lieferant_id = l.lieferant_id; ```Übung 3: Gib Automaten, Produkte und Bestandsdaten aus.
Lösung
**Lösung:** ```sql SELECT a.seriennummer, p.name, i.fachnummer, i.aktueller_bestand FROM inventar i JOIN automat a ON i.automat_id = a.automat_id JOIN produkt p ON i.produkt_id = p.produkt_id; ```Übung 4: Gib alle Lieferanten aus, auch wenn sie aktuell kein Produkt haben.
Lösung
**Lösung:** ```sql SELECT l.lieferant_id, l.name, p.produkt_id, p.name AS produkt FROM lieferant l LEFT JOIN produkt p ON p.lieferant_id = l.lieferant_id; ```Übung 5: Warum kann ein Filter auf die rechte Tabelle in WHERE einen LEFT JOIN verändern?
Lösung
**Lösung:** Weil der Filter nach dem Join angewendet wird und Zeilen mit `NULL` auf der rechten Seite entfernt. Dadurch bleibt faktisch nur noch das Verhalten eines `INNER JOIN` übrig.Übung 6: Nenne zwei typische Join-Fehler und eine passende Gegenmaßnahme.