Skip to content

SQL Joins – Wiederholung

Switch to Zen Mode

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?

Joins

Zeigt nur Datensätze, bei denen es in beiden Tabellen eine Übereinstimmung gibt.

SELECT c.CustomerName, o.OrderID
FROM Customers c
INNER JOIN Orders o ON c.CustomerID = o.CustomerID;

Ergebnis: Nur Kunden, die Bestellungen aufgegeben haben.

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.OrderID
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID;

Ergebnis: Alle Kunden, auch jene ohne Bestellung (OrderID = NULL).

Wie LEFT JOIN, nur umgekehrt: Alle Datensätze aus der rechten Tabelle, passende aus der linken.

SELECT c.CustomerName, o.OrderID
FROM Customers c
RIGHT JOIN Orders o ON c.CustomerID = o.CustomerID;

Ergebnis: Alle Bestellungen, auch wenn der Kunde nicht mehr existiert.

Kombination von LEFT und RIGHT JOIN. Alle Datensätze aus beiden Tabellen – wo kein Match vorhanden ist, erscheinen NULL-Werte.

SELECT c.CustomerName, o.OrderID
FROM Customers c
FULL OUTER JOIN Orders o ON c.CustomerID = o.CustomerID;

Ergebnis: Alle Kunden und alle Bestellungen, egal ob sie zusammenpassen.

Bildet das kartesische Produkt zweier Tabellen: jede Zeile der ersten mit jeder Zeile der zweiten.

SELECT c.CustomerName, p.ProductName
FROM Customers c
CROSS JOIN Products p;

Ergebnis: Jeder Kunde wird mit jedem Produkt kombiniert.

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.OrderDate
FROM Orders o
INNER JOIN Customers c ON o.CustomerID = c.CustomerID
INNER JOIN Employees e ON o.EmployeeID = e.EmployeeID
INNER JOIN Shippers s ON o.ShipVia = s.ShipperID;
  • Orders → zentrale Tabelle
  • Customers über CustomerID (Fremdschlüssel)
  • Employees über EmployeeID (Fremdschlüssel)
  • Shippers über ShipViaShipperID

OrderIDCustomerEmployeeShipperOrderDate
10248Vins et alcoolsNancy DavolioSpeedy Express1996-07-04
10249Toms SpezialitätenAndrew FullerUnited Package1996-07-05

  1. Starte mit der zentralen Tabelle (Fakten-Tabelle)
    • In Northwind oft: Orders
    • Überlege: Was will ich wirklich anzeigen? → z. B. Bestellungen.
  2. 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
  3. 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 …).
  4. Wähle die passenden Spalten aus
    • Nutze Aliase (c.CompanyName, e.FirstName) für Übersicht.
    • Entferne * und gib nur die wirklich relevanten Spalten aus.
  5. 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).
  6. Filter & Bedingungen zuletzt hinzufügen
    • Erst wenn die Joins stimmen, schränke mit WHERE oder AND ein.
    • Beispiel: nur Bestellungen im Jahr 1997 (WHERE YEAR(o.OrderDate) = 1997).

„Von der Mitte nach außen bauen – zuerst die Haupttabelle, dann Schritt für Schritt Joins hinzufügen.“

  • Spalten wie ID, Name oder Date gibt es in mehreren Tabellen.
  • Tipp: Immer mit Alias qualifizieren (c.CustomerID, o.OrderID).

  • Bei LEFT/RIGHT/FULL JOIN entstehen automatisch NULL-Werte.
  • Folge: Vergleiche mit = schlagen fehl (= NULL funktioniert nicht).
  • Tipp: Mit IS NULL oder IS NOT NULL arbeiten.

  • WHERE nach einem LEFT JOIN kann dazu führen, dass die NULL-Zeilen wieder verschwinden → Ergebnis verhält sich wie INNER JOIN.
  • Tipp: Bedingungen, die sich auf die verbundene Tabelle beziehen, lieber in die ON-Klausel verschieben.

  • Viele Joins + große Tabellen = langsame Abfragen.
  • Tipp:
  • Nur die benötigten Spalten auswählen (kein SELECT *).
  • Indizes auf Fremdschlüsselspalten nutzen (CustomerID, EmployeeID, …).

  • 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.