SQL Joins – Wiederholung
In einer relationalen Datenbank sind Informationen auf mehrere Tabellen verteilt. Joins verknüpfen Tabellen anhand von Schlüssel–Fremdschlüssel-Beziehungen und ermöglichen es, verteilte Daten gemeinsam auszuwerten.
Beispiel aus der Northwind-Datenbank:
- In der Tabelle Customers sind die Kunden gespeichert, erkennbar durch den Primärschlüssel
CustomerID. - In der Tabelle Orders stehen die Bestellungen. Dort gibt es ebenfalls eine Spalte
CustomerID, die als Fremdschlüssel auf die Kunden verweist.
Damit lassen sich die Daten logisch verbinden: Welche Bestellung gehört zu welchem Kunden?

1. INNER JOIN
Abschnitt betitelt „1. INNER JOIN“Zeigt nur Datensätze, bei denen es in beiden Tabellen eine Übereinstimmung gibt.
SELECT c.CustomerName, o.OrderIDFROM Customers cINNER JOIN Orders o ON c.CustomerID = o.CustomerID;Ergebnis: Nur Kunden, die Bestellungen aufgegeben haben.
2. LEFT JOIN (oder LEFT OUTER JOIN)
Abschnitt betitelt „2. LEFT JOIN (oder LEFT OUTER JOIN)“Zeigt alle Datensätze aus der linken Tabelle und die passenden aus der rechten. Falls keine Übereinstimmung vorhanden ist, stehen dort NULL-Werte.
SELECT c.CustomerName, o.OrderIDFROM Customers cLEFT JOIN Orders o ON c.CustomerID = o.CustomerID;Ergebnis: Alle Kunden, auch jene ohne Bestellung (OrderID = NULL).
3. RIGHT JOIN (oder RIGHT OUTER JOIN)
Abschnitt betitelt „3. RIGHT JOIN (oder RIGHT OUTER JOIN)“Wie LEFT JOIN, nur umgekehrt: Alle Datensätze aus der rechten Tabelle, passende aus der linken.
SELECT c.CustomerName, o.OrderIDFROM Customers cRIGHT JOIN Orders o ON c.CustomerID = o.CustomerID;Ergebnis: Alle Bestellungen, auch wenn der Kunde nicht mehr existiert.
4. FULL OUTER JOIN
Abschnitt betitelt „4. FULL OUTER JOIN“Kombination von LEFT und RIGHT JOIN. Alle Datensätze aus beiden Tabellen – wo kein Match vorhanden ist, erscheinen NULL-Werte.
SELECT c.CustomerName, o.OrderIDFROM Customers cFULL OUTER JOIN Orders o ON c.CustomerID = o.CustomerID;Ergebnis: Alle Kunden und alle Bestellungen, egal ob sie zusammenpassen.
5. CROSS JOIN
Abschnitt betitelt „5. CROSS JOIN“Bildet das kartesische Produkt zweier Tabellen: jede Zeile der ersten mit jeder Zeile der zweiten.
SELECT c.CustomerName, p.ProductNameFROM Customers cCROSS JOIN Products p;Ergebnis: Jeder Kunde wird mit jedem Produkt kombiniert.
Mehrere Joins in einer Abfrage
Abschnitt betitelt „Mehrere Joins in einer Abfrage“Fragestellung: Zeige zu jeder Bestellung: die Bestellnummer, den Kundennamen, den betreuenden Mitarbeiter und den Versanddienstleister.
SELECT o.OrderID, c.CompanyName AS Customer, e.FirstName || ' ' || e.LastName AS Employee, s.CompanyName AS Shipper, o.OrderDateFROM Orders oINNER JOIN Customers c ON o.CustomerID = c.CustomerIDINNER JOIN Employees e ON o.EmployeeID = e.EmployeeIDINNER JOIN Shippers s ON o.ShipVia = s.ShipperID;Erklärung:
Abschnitt betitelt „Erklärung:“Orders→ zentrale TabelleCustomersüberCustomerID(Fremdschlüssel)EmployeesüberEmployeeID(Fremdschlüssel)ShippersüberShipVia→ShipperID
Ergebnis (Beispielauszug)
Abschnitt betitelt „Ergebnis (Beispielauszug)“| OrderID | Customer | Employee | Shipper | OrderDate |
|---|---|---|---|---|
| 10248 | Vins et alcools | Nancy Davolio | Speedy Express | 1996-07-04 |
| 10249 | Toms Spezialitäten | Andrew Fuller | United Package | 1996-07-05 |
| … | … | … | … | … |
Strategie beim Arbeiten mit Joins
Abschnitt betitelt „Strategie beim Arbeiten mit Joins“- Starte mit der zentralen Tabelle (Fakten-Tabelle)
- In Northwind oft:
Orders - Überlege: Was will ich wirklich anzeigen? → z. B. Bestellungen.
- In Northwind oft:
- Finde die Schlüssel–Fremdschlüssel-Beziehungen
- Jede Zusatz-Info kommt aus einer Tabelle, die per Primär-/Fremdschlüssel verknüpft ist.
- Beispiel:
Orders.CustomerID → Customers.CustomerID
- Baue die Abfrage Schritt für Schritt auf
- Zuerst nur
SELECT * FROM Orders. - Dann einen Join hinzufügen (z. B.
Customers). - Prüfe das Ergebnis.
- Danach den nächsten Join einfügen (
Employees,Shippers…).
- Zuerst nur
- Wähle die passenden Spalten aus
- Nutze Aliase (
c.CompanyName,e.FirstName) für Übersicht. - Entferne
*und gib nur die wirklich relevanten Spalten aus.
- Nutze Aliase (
- Prüfe, welche Join-Art sinnvoll ist
- Meistens
INNER JOIN, wenn nur „passende“ Datensätze gewünscht sind. LEFT JOIN, wenn auch Datensätze ohne Partner gezeigt werden sollen (z. B. Kunden ohne Bestellung).
- Meistens
- Filter & Bedingungen zuletzt hinzufügen
- Erst wenn die Joins stimmen, schränke mit
WHEREoderANDein. - Beispiel: nur Bestellungen im Jahr 1997 (
WHERE YEAR(o.OrderDate) = 1997).
- Erst wenn die Joins stimmen, schränke mit
„Von der Mitte nach außen bauen – zuerst die Haupttabelle, dann Schritt für Schritt Joins hinzufügen.“
1. Mehrdeutige Spaltennamen
Abschnitt betitelt „1. Mehrdeutige Spaltennamen“- Spalten wie
ID,NameoderDategibt es in mehreren Tabellen. - Tipp: Immer mit Alias qualifizieren (
c.CustomerID,o.OrderID).
2. NULL-Werte
Abschnitt betitelt „2. NULL-Werte“- Bei
LEFT/RIGHT/FULL JOINentstehen automatischNULL-Werte. - Folge: Vergleiche mit
=schlagen fehl (= NULLfunktioniert nicht). - Tipp: Mit
IS NULLoderIS NOT NULLarbeiten.
3. Filter an der falschen Stelle
Abschnitt betitelt „3. Filter an der falschen Stelle“WHEREnach einemLEFT JOINkann dazu führen, dass dieNULL-Zeilen wieder verschwinden → Ergebnis verhält sich wieINNER JOIN.- Tipp: Bedingungen, die sich auf die verbundene Tabelle beziehen, lieber in die
ON-Klausel verschieben.
4. Performance
Abschnitt betitelt „4. Performance“- Viele Joins + große Tabellen = langsame Abfragen.
- Tipp:
- Nur die benötigten Spalten auswählen (kein
SELECT *). - Indizes auf Fremdschlüsselspalten nutzen (
CustomerID,EmployeeID, …).
5. Lesbarkeit
Abschnitt betitelt „5. Lesbarkeit“- Lange Abfragen mit vielen Joins werden schnell unübersichtlich.
- Tipp:
- Immer mit Alias arbeiten (
c,o,e). - Joins sauber untereinander schreiben.
- Bei komplexeren Abfragen lieber CTEs (
WITH) nutzen.