Zum Inhalt springen
SQL Anfänger 30 min

JOINs verstehen

Verstehe das Konzept von JOINs: Wie du Daten aus mehreren Tabellen in einer Abfrage kombinierst - das wichtigste SQL-Konzept überhaupt.

Aktualisiert:

JOINs sind das Herzstueck von SQL. Sie erlauben dir, Daten aus mehreren Tabellen in einer einzigen Abfrage zu kombinieren. Wenn du JOINs verstehst, verstehst du relationale Datenbanken.

Warum brauchen wir JOINs?

In unserer Shop-Datenbank sind die Daten auf mehrere Tabellen verteilt:

  • kunden - Wer hat bestellt?
  • bestellungen - Was wurde bestellt?
  • produkte - Welche Produkte gibt es?
  • bestellpositionen - Welche Produkte sind in welcher Bestellung?

Wenn du wissen willst, welcher Kunde was bestellt hat, brauchst du Daten aus zwei Tabellen gleichzeitig. Genau dafuer gibt es JOINs.

Ohne JOIN: Zwei separate Abfragen

-- Abfrage 1: Bestellung finden
SELECT kunden_id, betrag FROM bestellungen WHERE id = 1;
-- Ergebnis: kunden_id = 1, betrag = 69.98

-- Abfrage 2: Kunden finden
SELECT name FROM kunden WHERE id = 1;
-- Ergebnis: Anna Schmidt

Mit JOIN: Eine einzige Abfrage

SELECT kunden.name, bestellungen.betrag
FROM bestellungen
JOIN kunden ON bestellungen.kunden_id = kunden.id
WHERE bestellungen.id = 1;
-- Ergebnis: Anna Schmidt, 69.98

Viel eleganter!

Wie funktioniert ein JOIN?

Ein JOIN verbindet zwei Tabellen ueber eine gemeinsame Spalte. Die Syntax:

SELECT spalten
FROM tabelle1
JOIN tabelle2 ON tabelle1.spalte = tabelle2.spalte;

Die ON-Klausel definiert, welche Spalten die Verbindung herstellen. Meistens verbindet man einen Fremdschluessel mit einem Primaerschluessel.

Schritt fuer Schritt

Schauen wir uns an, was bei einem JOIN passiert:

Tabelle: kunden

id | name
---+---------------
 1 | Anna Schmidt
 2 | Max Mueller
 3 | Lisa Weber

Tabelle: bestellungen

id | kunden_id | betrag
---+-----------+-------
 1 |         1 |  69.98
 2 |         1 | 129.99
 3 |         2 |  94.98

JOIN-Ergebnis:

SELECT kunden.name, bestellungen.id AS bestell_id, bestellungen.betrag
FROM kunden
JOIN bestellungen ON kunden.id = bestellungen.kunden_id;
name          | bestell_id | betrag
--------------+------------+-------
Anna Schmidt  |          1 |  69.98
Anna Schmidt  |          2 | 129.99
Max Mueller   |          3 |  94.98

Beachte:

  • Anna Schmidt erscheint zweimal, weil sie zwei Bestellungen hat
  • Lisa Weber erscheint gar nicht, weil sie keine Bestellung hat (beim INNER JOIN)

Tabellen-Aliase

Bei JOINs werden Tabellennamen schnell lang. Nutze Aliase (Abkuerzungen):

-- Ohne Aliase (lang und unuebersichtlich)
SELECT kunden.name, bestellungen.betrag, bestellungen.bestelldatum
FROM kunden
JOIN bestellungen ON kunden.id = bestellungen.kunden_id;

-- Mit Aliasen (kurz und klar)
SELECT k.name, b.betrag, b.bestelldatum
FROM kunden k
JOIN bestellungen b ON k.id = b.kunden_id;

Der Alias wird direkt nach dem Tabellennamen geschrieben - ohne AS (obwohl AS auch erlaubt waere).

INNER JOIN - Der Standard

Das einfache JOIN ist ein INNER JOIN. Er zeigt nur Zeilen, die in beiden Tabellen eine Uebereinstimmung haben:

-- Diese beiden Abfragen sind identisch:
SELECT k.name, b.betrag
FROM kunden k
JOIN bestellungen b ON k.id = b.kunden_id;

SELECT k.name, b.betrag
FROM kunden k
INNER JOIN bestellungen b ON k.id = b.kunden_id;

Wichtig: Kunden ohne Bestellungen werden nicht angezeigt. Bestellungen ohne gueltigen Kunden ebenfalls nicht.

Praxisbeispiele

Bestelluebersicht mit Kundennamen

SELECT
    b.id AS bestell_nr,
    k.name AS kunde,
    b.bestelldatum,
    b.betrag,
    b.status
FROM bestellungen b
JOIN kunden k ON b.kunden_id = k.id
ORDER BY b.bestelldatum DESC;

Ergebnis:

bestell_nr | kunde        | bestelldatum | betrag | status
-----------+--------------+--------------+--------+---------------
         5 | Tom Becker   | 2026-03-08   | 184.97 | versendet
         4 | Lisa Weber   | 2026-03-05   |  19.99 | offen
         3 | Max Mueller  | 2026-03-01   |  94.98 | versendet
         2 | Anna Schmidt | 2026-02-20   | 129.99 | abgeschlossen
         1 | Anna Schmidt | 2026-01-15   |  69.98 | abgeschlossen

Bestellpositionen mit Produktnamen

SELECT
    bp.bestell_id,
    p.name AS produkt,
    bp.menge,
    bp.einzelpreis,
    bp.menge * bp.einzelpreis AS gesamt
FROM bestellpositionen bp
JOIN produkte p ON bp.produkt_id = p.id
ORDER BY bp.bestell_id;

Ergebnis:

bestell_id | produkt        | menge | einzelpreis | gesamt
-----------+----------------+-------+-------------+-------
         1 | T-Shirt Basic  |     2 |       19.99 |  39.98
         1 | Muetze Winter  |     2 |       14.99 |  29.98
         2 | Jacke Outdoor  |     1 |      129.99 | 129.99
         3 | Jeans Classic  |     1 |       49.99 |  49.99
         3 | Muetze Winter  |     3 |       14.99 |  44.97
         4 | T-Shirt Basic  |     1 |       19.99 |  19.99
         5 | Sneaker Sport  |     1 |       79.99 |  79.99
         5 | Rucksack Urban |     1 |       39.99 |  39.99
         5 | Jeans Classic  |     1 |       49.99 |  49.99

Drei Tabellen verknuepfen

Du kannst mehrere JOINs hintereinander schreiben:

SELECT
    k.name AS kunde,
    b.bestelldatum,
    p.name AS produkt,
    bp.menge,
    bp.einzelpreis
FROM bestellungen b
JOIN kunden k ON b.kunden_id = k.id
JOIN bestellpositionen bp ON b.id = bp.bestell_id
JOIN produkte p ON bp.produkt_id = p.id
ORDER BY b.bestelldatum, k.name;

Die JOIN-Bedingung verstehen

Die ON-Klausel bestimmt, wie die Tabellen verbunden werden:

-- Die typische Verbindung: Fremdschluessel = Primaerschluessel
JOIN bestellungen b ON k.id = b.kunden_id
--                     ^^^^    ^^^^^^^^^^^
--                     PK      FK

Du kannst auch mehrere Bedingungen in der ON-Klausel verwenden:

-- Nur abgeschlossene Bestellungen joinen
SELECT k.name, b.betrag
FROM kunden k
JOIN bestellungen b ON k.id = b.kunden_id AND b.status = 'abgeschlossen';

Haeufige Fehler bei JOINs

1. ON-Klausel vergessen

-- FALSCH: Ohne ON-Klausel
SELECT k.name, b.betrag
FROM kunden k
JOIN bestellungen b;  -- Fehler!

-- RICHTIG:
SELECT k.name, b.betrag
FROM kunden k
JOIN bestellungen b ON k.id = b.kunden_id;

2. Mehrdeutige Spaltennamen

-- FALSCH: 'id' existiert in beiden Tabellen
SELECT id, name, betrag
FROM kunden k
JOIN bestellungen b ON k.id = b.kunden_id;
-- Fehler: column reference "id" is ambiguous

-- RICHTIG: Tabelle angeben
SELECT k.id, k.name, b.betrag
FROM kunden k
JOIN bestellungen b ON k.id = b.kunden_id;

3. Falsche Verknuepfungsspalte

-- FALSCH: id mit id verbinden (falsche Logik)
SELECT k.name, b.betrag
FROM kunden k
JOIN bestellungen b ON k.id = b.id;  -- FALSCH!

-- RICHTIG: PK mit FK verbinden
SELECT k.name, b.betrag
FROM kunden k
JOIN bestellungen b ON k.id = b.kunden_id;  -- RICHTIG!

Was kommt als Naechstes?

Im naechsten Tutorial lernst du die verschiedenen JOIN-Arten kennen: INNER JOIN, LEFT JOIN, RIGHT JOIN und FULL OUTER JOIN. Damit kannst du steuern, welche Zeilen im Ergebnis erscheinen sollen.

Zusammenfassung

  • JOINs verbinden Daten aus mehreren Tabellen in einer Abfrage
  • Die ON-Klausel definiert die Verbindungsbedingung (meist FK = PK)
  • INNER JOIN (= JOIN) zeigt nur Zeilen mit Uebereinstimmung in beiden Tabellen
  • Tabellen-Aliase machen Abfragen kuerzer und lesbarer
  • Du kannst mehrere JOINs hintereinander verwenden
  • Verwende immer den Tabellennamen oder Alias bei mehrdeutigen Spalten

Uebungen

  1. Einfacher JOIN: Zeige alle Bestellungen mit dem Namen des Kunden.
  2. Drei Tabellen: Zeige fuer jede Bestellposition den Kundennamen, das Produkt und die Menge.
  3. Mit Filter: Zeige alle Bestellungen von Kunden aus Berlin, inklusive Kundenname und Betrag.
  4. Mit Sortierung: Zeige alle Bestellpositionen mit Produktnamen, sortiert nach Gesamtpreis (Menge * Einzelpreis) absteigend.
  5. Analyse: Welcher Kunde hat den hoechsten Einzelbestellwert? Zeige Name und Betrag.
-- Loesung zu Uebung 1:
SELECT k.name, b.id AS bestell_id, b.betrag, b.status
FROM bestellungen b
JOIN kunden k ON b.kunden_id = k.id;

-- Loesung zu Uebung 3:
SELECT k.name, b.betrag, b.bestelldatum
FROM bestellungen b
JOIN kunden k ON b.kunden_id = k.id
WHERE k.stadt = 'Berlin';

Pro-Tipp: Zeichne dir die Tabellenbeziehungen auf, bevor du einen JOIN schreibst. Ein einfaches Diagramm mit Pfeilen zwischen den Tabellen hilft enorm, die richtige Verknuepfung zu finden. Die Frage ist immer: “Welche Spalte in Tabelle A zeigt auf welche Spalte in Tabelle B?”

Zurück zum SQL Kurs