INNER JOIN – Tabellen verknüpfen

6 Kernkonzepte
Die wichtigsten Konzepte für INNER JOIN in SQL: INNER JOIN · ON · Mehrfach-Joins · Tabellen-Aliase · JOIN + WHERE · Praxis-Beispiele Mit INNER JOIN verknüpfen Sie Daten aus zwei oder mehr Tabellen. Es werden nur die Datensätze zurückgegeben, die in allen verknüpften Tabellen eine Übereinstimmung haben.

INNER JOIN – Grundlegende Verknüpfung

SELECT ... FROM tabelle1 INNER JOIN tabelle2 ON bedingung
SELECT kunden.name, bestellungen.datum FROM kunden INNER JOIN bestellungen ON kunden.id = bestellungen.kunde_id;

INNER JOIN ist die häufigste JOIN-Art. Er kombiniert Zeilen aus zwei Tabellen, wenn die ON-Bedingung erfüllt ist. Datensätze ohne Übereinstimmung werden nicht zurückgegeben.

Wichtige Regeln für INNER JOIN

Regel Beschreibung
ON-Bedingung Definiert, wie die Tabellen verknüpft werden (meist Fremdschlüssel = Primärschlüssel)
Keine Übereinstimmung Zeilen ohne passenden Partner in der anderen Tabelle werden ignoriert
Spaltennamen Bei gleichen Spaltennamen in beiden Tabellen muss die Tabelle angegeben werden (z.B. kunden.id)
Reihenfolge Die Reihenfolge der Tabellen im JOIN ist egal (INNER JOIN ist kommutativ)
Beispiele
-- Kunden mit ihren Bestellungen
SELECT k.name, b.datum, b.betrag
FROM kunden k
INNER JOIN bestellungen b ON k.id = b.kunde_id;
-- Nur Kunden mit mindestens einer Bestellung
SELECT k.id, k.name
FROM kunden k
INNER JOIN bestellungen b ON k.id = b.kunde_id
GROUP BY k.id, k.name;
Typische Ausgabe (Kunden mit Bestellungen):
Anna Schmidt | 2024-01-15 | 149.99
Anna Schmidt | 2024-02-20 | 89.99
Max Mustermann | 2024-01-10 | 299.99
Tipp: INNER JOIN wird oft einfach als JOIN geschrieben – das ist äquivalent. Verwenden Sie immer eine ON-Bedingung, die auf Primärschlüssel = Fremdschlüssel basiert.

ON-Bedingung – Verknüpfungslogik

ON tabelle1.spalte = tabelle2.spalte
SELECT p.name, h.name AS "hersteller" FROM produkte p INNER JOIN hersteller h ON p.hersteller_id = h.id;

Die ON-Bedingung definiert, welche Spalten aus den Tabellen für die Verknüpfung verwendet werden. In den meisten Fällen verbindet man einen Primärschlüssel mit einem Fremdschlüssel.

Häufige ON-Bedingungen

Bedingung Beschreibung Beispiel
Gleichheit (=) Standard: Primärschlüssel = Fremdschlüssel ON k.id = b.kunde_id
Zusammengesetzte Schlüssel Mehrere Spalten für die Verknüpfung ON a.id = b.a_id AND a.jahr = b.jahr
Ungleiche Spaltennamen Wenn die Spalten unterschiedlich heißen ON p.hersteller = h.name
Mit anderen Operatoren >, <, LIKE möglich (selten) ON a.datum > b.datum
Beispiele
-- Einfache Gleichheit
SELECT *
FROM produkte p
INNER JOIN kategorien k ON p.kategorie_id = k.id;
-- Zusammengesetzte Bedingung
SELECT *
FROM bestellungen b
INNER JOIN lieferungen l
ON b.id = l.bestellung_id AND b.kunde_id = l.kunde_id;
-- ON mit LIKE (praktisches Beispiel für Text-Suche)
SELECT p.name, s.schlagwort
FROM produkte p
INNER JOIN schlagworte s
ON p.name LIKE '%' || s.wort || '%';
Tipp: Die ON-Bedingung sollte möglichst auf indizierten Spalten basieren (Primärschlüssel, Fremdschlüssel), um die Performance des JOINs zu optimieren.

Mehrfach-Joins – Drei oder mehr Tabellen

t1 JOIN t2 ON ... JOIN t3 ON ...
SELECT k.name, p.name, b.datum FROM kunden k INNER JOIN bestellungen b ON k.id = b.kunde_id INNER JOIN produkte p ON b.produkt_id = p.id;

Mehrfach-Joins verknüpfen drei oder mehr Tabellen in einer Abfrage. Jeder JOIN baut auf dem vorherigen Ergebnis auf – wie eine Kette von Tabellen.

Beispiele
-- Kunden mit Bestellungen und Produktdetails
SELECT k.name AS "kunde",
p.name AS "produkt",
b.datum, b.menge, p.preis
FROM kunden k
INNER JOIN bestellungen b ON k.id = b.kunde_id
INNER JOIN produkte p ON b.produkt_id = p.id;
-- Kategorie, Produkt, Bestellungen
SELECT kat.name AS "kategorie",
p.name AS "produkt",
COUNT(b.id) AS "bestellungen"
FROM kategorien kat
INNER JOIN produkte p ON kat.id = p.kategorie_id
INNER JOIN bestellungen b ON p.id = b.produkt_id
GROUP BY kat.name, p.name;
Typische Ausgabe (4 Tabellen verknüpft):
Anna | Laptop | 2024-01-15 | 1 | 999.99
Max | Maus | 2024-01-10 | 2 | 29.99
Anna | Tastatur | 2024-02-20 | 1 | 49.99
Tipp: Bei vielen JOINs kann die Abfrage unübersichtlich werden. Verwenden Sie Tabellen-Aliase (kurze Namen) und achten Sie auf die logische Reihenfolge der Verknüpfungen.

Tabellen-Aliase – Kurznamen für Tabellen

FROM tabelle AS alias
SELECT k.name, b.datum FROM kunden k INNER JOIN bestellungen b ON k.id = b.kunde_id;

Tabellen-Aliase verkürzen die Schreibweise und sind bei JOINs mit mehreren Tabellen unverzichtbar. Sie werden mit AS oder ohne definiert.

Beispiele
-- Ohne Alias (umständlich)
SELECT kunden.name, bestellungen.datum
FROM kunden
INNER JOIN bestellungen ON kunden.id = bestellungen.kunde_id;
-- Mit Alias (übersichtlich)
SELECT k.name, b.datum
FROM kunden k
INNER JOIN bestellungen b ON k.id = b.kunde_id;
-- Mit AS (explizit, optional)
SELECT k.name, b.datum
FROM kunden AS k
INNER JOIN bestellungen AS b ON k.id = b.kunde_id;
-- Self-Join: Tabelle mit sich selbst (benötigt Aliase!)
SELECT e.name AS "mitarbeiter", v.name AS "vorgesetzter"
FROM mitarbeiter e
INNER JOIN mitarbeiter v ON e.vorgesetzter_id = v.id;
Tipp: Verwenden Sie aussagekräftige, kurze Alias-Namen (z.B. k für kunden, b für bestellungen). Das macht den Code lesbarer und ist in komplexen Abfragen unerlässlich.

JOIN + WHERE – Verknüpfen & Filtern

JOIN ... ON ... WHERE bedingung
SELECT k.name, b.datum, b.betrag FROM kunden k INNER JOIN bestellungen b ON k.id = b.kunde_id WHERE b.betrag > 100;

JOIN + WHERE kombiniert die Verknüpfung von Tabellen mit der Filterung von Ergebnissen. WHERE wird nach dem JOIN ausgeführt und filtert die bereits verknüpften Datensätze.

Beispiele
-- Kunden mit Bestellungen über 100 €
SELECT k.name, b.datum, b.betrag
FROM kunden k
INNER JOIN bestellungen b ON k.id = b.kunde_id
WHERE b.betrag > 100;
-- Nur Bestellungen aus dem Jahr 2024
SELECT p.name, b.datum, b.betrag
FROM produkte p
INNER JOIN bestellungen b ON p.id = b.produkt_id
WHERE b.datum BETWEEN '2024-01-01' AND '2024-12-31';
-- Kombination: Kategorie + Preis + Datum
SELECT k.name AS "kategorie", p.name AS "produkt", b.datum
FROM kategorien k
INNER JOIN produkte p ON k.id = p.kategorie_id
INNER JOIN bestellungen b ON p.id = b.produkt_id
WHERE p.preis > 50 AND b.datum > '2024-01-01';
Tipp: Bei JOINs mit WHERE können Sie Bedingungen, die nur eine Tabelle betreffen, auch in die ON-Klausel schreiben – das ist aber unüblich. Die WHERE-Klausel ist für die Filterung des Endergebnisses gedacht.

Praxis-Beispiele – INNER JOIN in Aktion

Berichte · Analysen · Exporte
SELECT k.name, SUM(b.betrag) AS "umsatz" FROM kunden k INNER JOIN bestellungen b ON k.id = b.kunde_id GROUP BY k.id, k.name ORDER BY "umsatz" DESC;

Praxis-Beispiele zeigen typische Anwendungen von INNER JOIN – von Umsatzberichten über Bestellanalysen bis zu Auswertungen mit Aggregationen.

Beispiele
-- Umsatz pro Kunde (Top-Kunden)
SELECT k.name, SUM(b.betrag) AS "umsatz"
FROM kunden k
INNER JOIN bestellungen b ON k.id = b.kunde_id
GROUP BY k.id, k.name
ORDER BY "umsatz" DESC
LIMIT 10;
-- Produkte, die nie bestellt wurden (mit LEFT JOIN)
SELECT p.name
FROM produkte p
LEFT JOIN bestellungen b ON p.id = b.produkt_id
WHERE b.id IS NULL;
-- Bestellungen mit Kunden- und Produktdetails (für Export)
SELECT b.id AS "bestellnr",
k.name AS "kunde",
p.name AS "produkt",
b.datum, b.menge, p.preis
FROM bestellungen b
INNER JOIN kunden k ON b.kunde_id = k.id
INNER JOIN produkte p ON b.produkt_id = p.id
ORDER BY b.datum DESC;
-- Kategorien mit den meisten verkauften Produkten
SELECT kat.name AS "kategorie",
SUM(b.menge) AS "verkaufte_einheiten"
FROM kategorien kat
INNER JOIN produkte p ON kat.id = p.kategorie_id
INNER JOIN bestellungen b ON p.id = b.produkt_id
GROUP BY kat.id, kat.name
ORDER BY "verkaufte_einheiten" DESC;
Tipp: INNER JOIN ist der Standard für die Verknüpfung von Tabellen. In der Praxis werden oft 3-5 Tabellen verknüpft – mit guten Indizes ist das auch bei großen Datenmengen performant.

INNER JOIN im Überblick

INNER JOIN Nur übereinstimmende Datensätze
Grundlegende Verknüpfung
ON Verknüpfungsbedingung
PK = FK
Alias Kurznamen für Tabellen
FROM tabelle AS t
Mehrfach Drei oder mehr Tabellen
Ketten-Join
WHERE Ergebnisse filtern
Nach dem JOIN
GROUP BY Aggregation
Nach dem JOIN

Quick Summary

JOIN
Tabellen verknüpfen
ON
Verknüpfungslogik
Mehrfach
3+ Tabellen
Alias
Kurznamen
WHERE
Filtern
Analysen
Praxis-Beispiele
SELECT k.name, b.datum FROM kunden k INNER JOIN bestellungen b ON k.id = b.kunde_id WHERE b.betrag > 100;