SQL Joins Erklaerung
SQL JOINs: Tabellen verknüpfen verstehen
JOINs sind das Herzstück relationaler Datenbanken. Sie verknüpfen Daten aus mehreren Tabellen zu einem sinnvollen Ergebnis.
Beispiel-Tabellen
Kunden Bestellungen
+----+-------+ +----+----------+--------+
| id | name | | id | kunde_id | betrag |
+----+-------+ +----+----------+--------+
| 1 | Max | | 1 | 1 | 100 |
| 2 | Anna | | 2 | 1 | 200 |
| 3 | Tom | | 3 | 2 | 150 |
| 4 | Lisa | | 4 | 5 | 300 |
+----+-------+ +----+----------+--------+
(kunde_id 5 existiert nicht!)
INNER JOIN
Gibt nur Zeilen zurück, die in beiden Tabellen übereinstimmen.
SELECT k.name, b.betrag FROM kunden k INNER JOIN bestellungen b ON k.id = b.kunde_id; Ergebnis: +------+--------+ | name | betrag | +------+--------+ | Max | 100 | | Max | 200 | | Anna | 150 | +------+--------+ (Tom und Lisa haben keine Bestellungen → nicht im Ergebnis) (Bestellung mit kunde_id=5 → nicht im Ergebnis)
Visualisierung:
Kunden Bestellungen
┌────┐ ┌────┐
│ │ │ │
│ ██████████████████│ ← INNER JOIN (Schnittmenge)
│ │ │ │
└────┘ └────┘
LEFT JOIN (LEFT OUTER JOIN)
Alle Zeilen der linken Tabelle + Übereinstimmungen der rechten.
SELECT k.name, b.betrag FROM kunden k LEFT JOIN bestellungen b ON k.id = b.kunde_id; Ergebnis: +------+--------+ | name | betrag | +------+--------+ | Max | 100 | | Max | 200 | | Anna | 150 | | Tom | NULL | ← Keine Bestellung, aber im Ergebnis | Lisa | NULL | ← Keine Bestellung, aber im Ergebnis +------+--------+
Praktischer Einsatz: Kunden ohne Bestellungen
SELECT k.name FROM kunden k LEFT JOIN bestellungen b ON k.id = b.kunde_id WHERE b.id IS NULL; Ergebnis: +------+ | name | +------+ | Tom | | Lisa | +------+
RIGHT JOIN (RIGHT OUTER JOIN)
Alle Zeilen der rechten Tabelle + Übereinstimmungen der linken.
SELECT k.name, b.betrag FROM kunden k RIGHT JOIN bestellungen b ON k.id = b.kunde_id; Ergebnis: +------+--------+ | name | betrag | +------+--------+ | Max | 100 | | Max | 200 | | Anna | 150 | | NULL | 300 | ← Bestellung ohne gültigen Kunden +------+--------+
FULL OUTER JOIN
Alle Zeilen aus beiden Tabellen.
SELECT k.name, b.betrag FROM kunden k FULL OUTER JOIN bestellungen b ON k.id = b.kunde_id; Ergebnis: +------+--------+ | name | betrag | +------+--------+ | Max | 100 | | Max | 200 | | Anna | 150 | | Tom | NULL | | Lisa | NULL | | NULL | 300 | +------+--------+ (Hinweis: MySQL unterstützt kein FULL OUTER JOIN direkt)
FULL OUTER JOIN in MySQL simulieren
SELECT k.name, b.betrag FROM kunden k LEFT JOIN bestellungen b ON k.id = b.kunde_id UNION SELECT k.name, b.betrag FROM kunden k RIGHT JOIN bestellungen b ON k.id = b.kunde_id;
CROSS JOIN
Kartesisches Produkt: Jede Zeile mit jeder kombiniert.
SELECT k.name, p.produkt FROM kunden k CROSS JOIN produkte p; -- Bei 4 Kunden und 3 Produkten: 12 Zeilen
SELF JOIN
Tabelle mit sich selbst verknüpfen.
-- Mitarbeiter mit Vorgesetzten Mitarbeiter +----+-------+-----------+ | id | name | chef_id | +----+-------+-----------+ | 1 | Chef | NULL | | 2 | Max | 1 | | 3 | Anna | 1 | | 4 | Tom | 2 | +----+-------+-----------+ SELECT m.name AS mitarbeiter, c.name AS chef FROM mitarbeiter m LEFT JOIN mitarbeiter c ON m.chef_id = c.id; Ergebnis: +-------------+------+ | mitarbeiter | chef | +-------------+------+ | Chef | NULL | | Max | Chef | | Anna | Chef | | Tom | Max | +-------------+------+
Mehrere JOINs
SELECT
k.name AS kunde,
b.id AS bestellung_nr,
p.name AS produkt,
bp.menge
FROM kunden k
JOIN bestellungen b ON k.id = b.kunde_id
JOIN bestellpositionen bp ON b.id = bp.bestellung_id
JOIN produkte p ON bp.produkt_id = p.id
WHERE b.bestelldatum > '2024-01-01';
JOIN-Übersicht
| JOIN-Typ | Ergebnis |
|---|---|
| INNER JOIN | Nur Übereinstimmungen |
| LEFT JOIN | Alle links + Übereinstimmungen rechts |
| RIGHT JOIN | Alle rechts + Übereinstimmungen links |
| FULL OUTER JOIN | Alles aus beiden Tabellen |
| CROSS JOIN | Jeder mit jedem (kartesisch) |
Performance-Tipps
- Indizes auf JOIN-Spalten (Foreign Keys)
- INNER JOIN wenn möglich (schneller als OUTER)
- Kleine Tabelle links bei LEFT JOIN
- EXPLAIN zur Analyse verwenden
- Nur benötigte Spalten selektieren