Zum Inhalt springen

All-Access: jede Lektion, ohne Werbung. 8,25 € im Monat, jährlich abgerechnet. Die ersten 2 Lektionen gratis. Jederzeit kündbar

Tarife ansehen
All-Access, ohne Werbung: jede Lektion, jeder Kurs und jede Vorlage. 8,25 $8,25 €8,25 US$ im Monat.Tarife ansehen →

SQL-Tabellen verknüpfen: JOIN, UNION und Beispiele

Vom LogicExcel-Redaktionsteam••14 Min. Lesezeit•2,653 Wörter

SQL-Tabellen verknüpfen: JOIN, UNION und Beispiele

Analystin verknüpft SQL-Tabellen am Laptop

Zwei SQL-Tabellen verknüpfen Sie mit JOIN: In der FROM-Klausel nennen Sie die erste Tabelle, dann JOIN, die zweite Tabelle und nach ON die Bedingung, welche Zeilen zusammengehören, fast immer Fremdschlüssel gleich Primärschlüssel. Ob nur passende Zeilen erscheinen (INNER JOIN) oder auch die ohne Partner (LEFT, RIGHT, FULL OUTER JOIN), entscheidet der Join-Typ. Wollen Sie dagegen gleich aufgebaute Tabellen untereinander zusammenführen, ist UNION das richtige Werkzeug. Hier finden Sie alle Varianten mit Beispielen, die Sie direkt abtippen können.

Kurz gesagt

  • Grundform: SELECT … FROM a JOIN b ON a.schluessel = b.schluessel. Die Bedingung gehört in die FROM-Klausel nach ON.
  • INNER JOIN liefert nur Zeilen mit Treffer in beiden Tabellen, LEFT JOIN behält alle Zeilen der linken Tabelle und füllt fehlende Werte mit NULL.
  • Unterschiedliche Spaltennamen sind kein Problem: Sie schreiben einfach ON k.kunden_nr = b.kunde_id.
  • Mehr als zwei Tabellen: Für jede weitere Tabelle ein eigenes JOIN … ON.
  • UNION statt JOIN, wenn Sie Zeilen untereinander stapeln wollen, etwa die Umsätze 2025 und 2026 aus zwei gleich aufgebauten Tabellen.

Inhaltsverzeichnis

Die Beispieltabellen für diesen Artikel

Alle Abfragen unten arbeiten mit zwei kleinen Tabellen, wie sie in jeder Buchhaltung oder jedem Vertrieb vorkommen. Wer aus Excel kommt, kann sie sich als zwei Tabellenblätter vorstellen, die man sonst mit SVERWEIS oder INDEX/VERGLEICH zusammenbringen würde.

Tabelle kunden:

kunden_idnamestadt
1Müller GmbHKöln
2Schneider AGHamburg
3Weber KGMünchen
Tabelle bestellungen:
bestell_idkunden_idbetrag
10111.200,00 €
1021340,50 €
1032980,00 €
104475,00 €
kunden.kunden_id ist der Primärschlüssel, bestellungen.kunden_id der Fremdschlüssel, der auf ihn verweist. Zwei Besonderheiten sind absichtlich eingebaut: Die Weber KG hat noch nichts bestellt, und Bestellung 104 gehört zu einem Kunden 4, den es in kunden nicht gibt. Genau an diesen Lücken sehen Sie später, wie sich die Join-Typen unterscheiden.

Zwei Tabellen mit JOIN … ON verbinden

Die Standardabfrage, um zu jeder Bestellung den Kundennamen zu holen, sieht so aus:

SELECT k.name, b.bestell_id, b.betrag
FROM kunden AS k
JOIN bestellungen AS b
  ON b.kunden_id = k.kunden_id;

So lesen Sie die Abfrage Schritt für Schritt:

  1. FROM kunden AS k nennt die erste Tabelle und gibt ihr den kurzen Alias k.
  2. JOIN bestellungen AS b holt die zweite Tabelle dazu. JOIN allein bedeutet INNER JOIN.
  3. ON b.kunden_id = k.kunden_id legt fest, welche Zeilen zusammengehören.
  4. SELECT k.name, … wählt die Spalten aus beiden Tabellen. Das Präfix k. oder b. sagt der Datenbank, aus welcher Tabelle eine Spalte stammt.
Eine Join-Bedingung besteht laut Microsoft-Dokumentation zu Joins aus der Spalte jeder beteiligten Tabelle, typischerweise einem Fremdschlüssel und dem zugehörigen Schlüssel, und einem logischen Operator wie = oder <>, der die Werte vergleicht. In der Praxis ist es fast immer das Gleichheitszeichen.

Ergebnis mit unseren Daten: drei Zeilen. Müller erscheint zweimal (zwei Bestellungen), Schneider einmal. Weber fehlt, weil es keine passende Bestellung gibt, und Bestellung 104 fehlt, weil Kunde 4 nicht existiert.

Aliase wie k und b sind kein Pflichtprogramm, machen lange Abfragen aber deutlich lesbarer. Wie AS funktioniert, können Sie in der Übung zu Aliasen mit AS direkt ausprobieren, und die Grundform des Joins in der Übung JOIN: Tabellen verbinden.

Die ältere Schreibweise mit WHERE

In älteren Lehrbüchern und gewachsenen Datenbanken sehen Sie oft eine zweite Form. Die Tabellen stehen mit Komma getrennt in der FROM-Klausel, die Verknüpfung in der WHERE-Klausel:

SELECT k.name, b.betrag
FROM kunden k, bestellungen b
WHERE b.kunden_id = k.kunden_id;

Der SQL-Kurs der TU Dresden beschreibt genau diese Grundform und zeigt, was passiert, wenn die verbindende Bedingung fehlt: Es entsteht ein Kreuzprodukt, also jede Zeile der einen Tabelle kombiniert mit jeder Zeile der anderen. Bei 3 Kunden und 4 Bestellungen wären das 12 Zeilen, bei 10.000 Kunden und 200.000 Bestellungen schon zwei Milliarden.

Microsoft erlaubt innere Joins sowohl in FROM als auch in WHERE, äußere Joins und Kreuzprodukte aber nur in der FROM-Klausel. Die Join-Bedingung in FROM zu schreiben, trennt sie zudem von den übrigen Filtern in WHERE und ist laut Microsoft Learn die empfohlene Methode. Unsere Empfehlung deshalb: Verknüpfungen nach ON, Filter nach WHERE. Wie Filter sauber gebaut werden, erklärt unser Leitfaden zu WHERE-Klauseln.

Die Join-Typen im Überblick

Join-TypWas er zurückgibtZeilen mit unseren DatenTypischer Einsatz
INNER JOINNur Zeilen mit Treffer in beiden Tabellen3Bestellungen mit Kundennamen
LEFT JOINAlle Zeilen links, rechts NULL ohne Treffer4 (Weber mit NULL)Kunden ohne Bestellung finden
RIGHT JOINAlle Zeilen rechts, links NULL ohne Treffer4 (Bestellung 104 ohne Namen)Verwaiste Bestellungen aufspüren
FULL OUTER JOINAlle Zeilen beider Seiten5Zwei Listen vollständig abgleichen
CROSS JOINJede Zeile mit jeder12Alle Kombinationen, z. B. Filiale × Monat
Diese Schreibweisen, [INNER] JOIN, LEFT [OUTER] JOIN, RIGHT [OUTER] JOIN, FULL [OUTER] JOIN und CROSS JOIN, führt Microsoft für SQL Server auf; die Wörter in eckigen Klammern sind optional.

Den Cross Join beschreibt das Skript der HdM Stuttgart als Verbindung jeder Zeile der ersten mit jeder Zeile der zweiten Tabelle, geschrieben als SELECT * FROM Mitarbeiter CROSS JOIN Projekte oder in der älteren Form mit Komma.

INNER JOIN und OUTER JOIN: der Unterschied

Ein Inner Join verbindet Datensätze nur dann, wenn das gemeinsame Feld in beiden Tabellen denselben Wert enthält. Ein Outer Join gibt zusätzlich die Zeilen ohne Partner zurück und füllt die fehlenden Spalten mit NULL.

INNER und OUTER JOIN im Zeilenvergleich
SELECT k.name, b.bestell_id, b.betrag
FROM kunden AS k
LEFT JOIN bestellungen AS b
  ON b.kunden_id = k.kunden_id;

Ergebnis:

namebestell_idbetrag
Müller GmbH1011.200,00 €
Müller GmbH102340,50 €
Schneider AG103980,00 €
Weber KGNULLNULL
Die Weber KG steht jetzt in der Liste, mit leeren Bestellspalten. Das ist die SQL-Entsprechung zum SVERWEIS, der #NV liefert: Sie sehen, wo etwas fehlt. Mit einem Filter darauf finden Sie alle Kunden ohne Bestellung:
SELECT k.name
FROM kunden AS k
LEFT JOIN bestellungen AS b ON b.kunden_id = k.kunden_id
WHERE b.bestell_id IS NULL;

Ein RIGHT JOIN ist das Spiegelbild: Er behält alle Bestellungen, auch die 104 ohne Kunden. Viele Teams schreiben trotzdem lieber LEFT JOIN und tauschen einfach die Reihenfolge der Tabellen, weil sich Abfragen so einheitlicher lesen. Beide Varianten üben Sie in LEFT JOIN online üben und RIGHT JOIN online üben. Eine Übersicht mit weiteren Beispielen finden Sie in SQL Joins erklärt.

Wenn die Join-Spalten unterschiedlich heißen

Echte Datenbanken sind selten so ordentlich wie Beispieltabellen. Die Kundennummer heißt in der einen Tabelle kunden_nr, in der anderen kunde_id oder debitor. Für SQL spielt das keine Rolle: Nach ON vergleichen Sie zwei beliebige Spalten, solange sie dieselbe Bedeutung und einen vergleichbaren Datentyp haben.

SELECT k.name, r.rechnungs_nr, r.summe
FROM kunden AS k
JOIN rechnungen AS r
  ON r.debitor = k.kunden_nr;

Die MariaDB-Anleitung zu Joins zeigt genau diesen Fall mit ON t1.a = t2.b: zwei verschiedene Spaltennamen, eine Verknüpfung.

Heißen die Spalten dagegen gleich, gibt es eine Kurzform. JOIN … USING (kunden_id) ersetzt ON a.kunden_id = b.kunden_id. Laut PostgreSQL-Dokumentation erzeugt USING (a, b) die Bedingung ON T1.a = T2.a AND T1.b = T2.b und gibt die verbindende Spalte nur einmal aus.

Drei Punkte, die bei abweichenden Namen oft stolpern lassen:

  • Datentyp prüfen: Steht die Kundennummer einmal als Zahl und einmal als Text („00123“) in der Datenbank, finden sich keine Treffer. Dann hilft ein CAST auf einer Seite.
  • Zusammengesetzte Schlüssel: Ist eine Zeile erst durch zwei Spalten eindeutig, etwa Mandant und Kundennummer, verbinden Sie beide mit AND: ON r.mandant = k.mandant AND r.debitor = k.kunden_nr. Mehrere Bedingungen trainieren Sie in der Übung zum AND-Operator.
  • Mehrdeutige Spalten: Gibt es name in beiden Tabellen, meldet die Datenbank einen Fehler, bis Sie k.name oder r.name schreiben.

Drei und mehr Tabellen verknüpfen

Jede weitere Tabelle bekommt ihr eigenes JOIN … ON. Die Datenbank verbindet zuerst die ersten beiden Tabellen, dann das Zwischenergebnis mit der dritten und so weiter. Angenommen, bestellungen hat eine Spalte artikel_id, die auf eine Tabelle artikel verweist:

SELECT k.name, a.bezeichnung, b.betrag
FROM kunden AS k
JOIN bestellungen AS b ON b.kunden_id = k.kunden_id
JOIN artikel AS a ON a.artikel_id = b.artikel_id;

Join-Typen dürfen Sie dabei mischen. Ein typisches Reporting-Muster: kunden als Ausgangstabelle, dann LEFT JOIN bestellungen, damit auch Kunden ohne Umsatz im Bericht stehen. Achten Sie darauf, dass eine Tabelle nach einem LEFT JOIN nicht mit einem INNER JOIN weiterverknüpft wird, der die NULL-Zeilen wieder herausfiltert. Wer mehrere Ebenen braucht, schreibt die Kette am besten so, dass jede Bedingung direkt unter ihrem Join steht: Dann sieht man auf einen Blick, welche Tabelle woran hängt.

Eine Tabelle mit sich selbst verbinden: der Self Join

Manchmal stecken beide Seiten der Beziehung in derselben Tabelle. Das klassische Beispiel ist eine Mitarbeitertabelle, in der die Spalte chef_id auf die id einer anderen Person derselben Tabelle zeigt.

SELECT m.name AS mitarbeiter, c.name AS vorgesetzter
FROM mitarbeiter AS m
LEFT JOIN mitarbeiter AS c ON c.id = m.chef_id;

Eine eigene Syntax gibt es dafür nicht. Laut dbt-Referenz zu Self Joins verwenden Sie die normale Join-Syntax, brauchen aber für jede Instanz der Tabelle einen eindeutigen Alias; eingesetzt wird das vor allem bei hierarchischen Strukturen. Der LEFT JOIN sorgt hier dafür, dass auch die Geschäftsführung ohne Vorgesetzte in der Liste bleibt.

Tabellen zusammenführen mit UNION statt JOIN

„Zusammenführen“ meint oft etwas anderes als „verknüpfen“. Haben Sie die Umsätze 2025 in umsatz_2025 und die von 2026 in umsatz_2026, beide mit denselben Spalten, wollen Sie die Zeilen nicht nebeneinander, sondern untereinander. Dafür gibt es UNION:

SELECT monat, filiale, umsatz FROM umsatz_2025
UNION ALL
SELECT monat, filiale, umsatz FROM umsatz_2026;

Den Unterschied fasst die Microsoft-Referenz zu UNION knapp zusammen: UNION hängt die Ergebnismengen zweier Abfragen aneinander, bildet aber keine Zeilen aus Spalten beider Tabellen; genau das tut ein JOIN. Damit es funktioniert, müssen Anzahl und Reihenfolge der Spalten in allen Abfragen gleich und die Datentypen kompatibel sein.

FrageJOINUNION
RichtungNebeneinander (mehr Spalten)Untereinander (mehr Zeilen)
VoraussetzungGemeinsamer SchlüsselGleiche Spaltenzahl, passende Datentypen
Excel-VergleichSVERWEIS, XVERWEISZwei Listen untereinander kopieren
DuplikateBleiben, wenn der Schlüssel mehrfach vorkommtUNION entfernt sie, UNION ALL behält sie
Die Spaltennamen müssen laut HdM Stuttgart nicht identisch sein, nur Datentyp und Wertebereich müssen passen. Das Ergebnis übernimmt die Spaltennamen der ersten SELECT-Anweisung, so steht es in der MariaDB-Dokumentation zu UNION. Für Monatsumsätze nehmen Sie fast immer UNION ALL, denn zwei Filialen mit zufällig gleichem Umsatz im selben Monat sollen nicht zu einer Zeile verschmelzen. Mehr dazu in SQL UNION: Abfragen kombinieren und in der Übung UNION: Ergebnisse kombinieren.

Typische Fehler beim Verknüpfen

  • Vergessene Join-Bedingung: Das Ergebnis explodiert zum Kreuzprodukt. Wenn die Zeilenzahl verdächtig hoch ist, zuerst die ON-Klausel prüfen.
  • Doppelte Summen: Verknüpfen Sie Kunden mit Bestellungen und mit Zahlungen gleichzeitig, vervielfachen sich die Zeilen. Summieren Sie dann erst je Tabelle und verbinden Sie die Zwischensummen.
  • LEFT JOIN, der heimlich zum INNER JOIN wird: Ein Filter wie WHERE b.betrag > 100 wirft die NULL-Zeilen wieder hinaus. Gehört der Filter zur rechten Tabelle, schreiben Sie ihn in die ON-Klausel.
  • NULL im Schlüssel: NULL ist mit nichts gleich, auch nicht mit NULL. Zeilen mit leerem Fremdschlüssel finden beim INNER JOIN nie einen Partner.

Unsere Sicht: Joins lernt man mit den Fingern

> Wer Joins nur liest, versteht sie meistens. Wer sie selbst schreibt, merkt erst, wo es hakt: beim Alias, der fehlt, beim LEFT JOIN, der plötzlich Zeilen verliert, beim Ergebnis, das doppelt so lang ist wie erwartet. Deshalb setzen wir bei LogicExcel darauf, dass Lernende echte Abfragen und Formeln selbst eintippen und sofort sehen, was sie ergeben.
>
> Unsere Übungen bewerten, was tatsächlich herauskommt. Ein anderer Lösungsweg zählt genauso, und jede falsche Antwort wird erklärt. Gerade bei Joins ist das wichtig, denn dieselbe Frage lässt sich mit LEFT oder RIGHT JOIN, mit ON oder USING beantworten.
>
> Viele unserer Lernenden kommen aus Buchhaltung, Controlling und Analyse. Für sie ist SQL oft die Fortsetzung dessen, was sie in Excel mit SVERWEIS und Pivot-Tabellen schon jeden Monat tun. Wer beide Seiten beherrscht, baut Berichte schneller und mit weniger Kopierarbeit.
>
> Thomas Houza

Excel und SQL gezielt trainieren

Wenn Sie im Beruf Tabellen verknüpfen, sei es per SVERWEIS in Excel oder per JOIN in der Datenbank, lohnt sich ein ehrlicher Blick auf den eigenen Stand. Unser kostenloser Excel-Test stellt Ihnen 12 echte Aufgaben, bewertet Ihre Antworten und zeigt die Lösungen.

LogicExcel

Danach öffnet All-Access alle 95 Übungslektionen, die Kurse Excel I bis III mit Abschlussprüfung und Zertifikat, den Kurs Excel für die Buchhaltung und die Vorlagenbibliothek. Das Abo kostet 29 US-Dollar im Monat oder 99 US-Dollar im Jahr, also 8,25 US-Dollar pro Monat, und ist auch als Lifetime-Zugang erhältlich. Die ersten zwei Übungslektionen sind kostenlos, ebenso der 5-Tage-Buchhaltungskurs per E-Mail, und Lektionen, die Sie abgeschlossen haben, bleiben für Sie geöffnet.

Häufige Fragen

Wie verknüpfe ich zwei Tabellen in SQL?

Sie schreiben SELECT … FROM tabelle1 JOIN tabelle2 ON tabelle1.schluessel = tabelle2.schluessel. Die Bedingung nach ON verbindet meist den Fremdschlüssel der einen mit dem Primärschlüssel der anderen Tabelle. Ohne weitere Angabe ist JOIN ein INNER JOIN und liefert nur Zeilen mit Treffer auf beiden Seiten.

Was ist der Unterschied zwischen INNER JOIN und OUTER JOIN?

Ein INNER JOIN gibt nur Zeilen zurück, die in beiden Tabellen einen passenden Partner haben. Ein OUTER JOIN (LEFT, RIGHT oder FULL) behält zusätzlich die Zeilen ohne Partner und füllt die fehlenden Spalten mit NULL. Damit finden Sie zum Beispiel Kunden ohne Bestellung.

Wann nehme ich UNION und wann JOIN?

JOIN brauchen Sie, wenn Sie Spalten aus zwei Tabellen in einer Zeile zusammenbringen wollen, etwa Kundenname und Bestellbetrag. UNION brauchen Sie, wenn Sie gleich aufgebaute Tabellen untereinander stapeln, etwa die Umsätze zweier Jahre. UNION verlangt gleiche Spaltenzahl und passende Datentypen.

Kann ich Tabellen verknüpfen, deren Schlüsselspalten verschieden heißen?

Ja. Nach ON vergleichen Sie beliebige Spalten, zum Beispiel ON r.debitor = k.kunden_nr. Wichtig ist nur, dass beide Spalten dasselbe bedeuten und denselben Datentyp haben. Die Kurzform USING funktioniert dagegen nur bei gleichen Namen.

Wie verbinde ich zwei Tabellen in Access?

Access bietet dafür den Abfrageentwurf, in dem Sie die Tabellen hinzufügen und die Schlüsselfelder miteinander verbinden. In der SQL-Ansicht derselben Abfrage sehen Sie die Verknüpfung als INNER JOIN oder LEFT JOIN mit ON-Bedingung, also mit genau der Logik aus diesem Artikel.

Quellen

Microsoft Learn: Joins (SQL Server)
Microsoft Learn: UNION (Transact-SQL)
TU Dresden: Die Grundform mit WHERE, 2 Tabellen verbinden
HdM Stuttgart: Relationale Datenbanken, Kapitel 7
MariaDB: Joining Tables with JOIN Clauses
MariaDB: UNION
PostgreSQL: Table Expressions
dbt: Working with self joins in SQL

Empfehlungen

Weiterlernen

Anleitungen, die andere als Nächstes lesen.