SQL FULL OUTER JOIN

6 Kernkonzepte
FULL OUTER JOIN – Alle Datensätze aus beiden Tabellen: FULL OUTER JOIN · COALESCE · LEFT/RIGHT JOIN · NULL-Behandlung · Performance Der FULL OUTER JOIN kombiniert die Ergebnisse von LEFT JOIN und RIGHT JOIN – er liefert alle Datensätze aus beiden Tabellen, auch wenn keine Übereinstimmung in der anderen Tabelle existiert.

FULL OUTER JOIN – Alle Datensätze beider Tabellen

FULL OUTER JOIN · FULL JOIN
SELECT * FROM tabelle_a FULL OUTER JOIN tabelle_b ON tabelle_a.id = tabelle_b.id;

FULL OUTER JOIN (oder kurz FULL JOIN) kombiniert LEFT JOIN und RIGHT JOIN. Er liefert alle Datensätze aus beiden Tabellen – sowohl übereinstimmende als auch nicht übereinstimmende. Fehlende Werte werden mit NULL aufgefüllt.

Venn-Diagramm: FULL OUTER JOIN

Tabelle ATabelle B
┌─────────┐ ┌─────────┐
│ A │◄───►│ B │
└─────────┘ └─────────┘
Alle Datensätze aus A UND alle aus B
Beispiele
-- Alle Mitarbeiter und deren Abteilungen (auch ohne Zuordnung)
SELECT m.name, a.bezeichnung
FROM mitarbeiter m
FULL OUTER JOIN abteilungen a
ON m.abteilung_id = a.id;
-- Kürzere Schreibweise (FULL JOIN)
SELECT m.name, a.bezeichnung
FROM mitarbeiter m
FULL JOIN abteilungen a
ON m.abteilung_id = a.id;
Typische Ausgabe:
Anna Müller | IT
Peter Schmidt | HR
NULL | Finanzen
Klaus Weber | NULL
Tipp: Nicht alle Datenbanken unterstützen FULL OUTER JOIN nativ (z.B. MySQL). Für MySQL gibt es Workarounds mit LEFT JOIN + RIGHT JOIN + UNION.

Syntax & Optionen – FULL JOIN, USING, NATURAL

FULL [OUTER] JOIN · USING · NATURAL
-- Mit USING (bei gleichem Spaltennamen) SELECT * FROM tabelle_a FULL JOIN tabelle_b USING (id); -- NATURAL FULL JOIN (automatisch nach gleichen Spaltennamen) SELECT * FROM tabelle_a NATURAL FULL JOIN tabelle_b;

Syntax-Optionen für FULL OUTER JOIN: ON (explizite Bedingung), USING (bei gleichen Spaltennamen) und NATURAL (automatisch – selten empfohlen).

Beispiele
-- ON (explizite Bedingung) – Standard
SELECT a.name, b.produkt
FROM kunden a
FULL JOIN bestellungen b
ON a.id = b.kunde_id;
-- USING (wenn beide Spalten gleich heißen)
SELECT *
FROM mitarbeiter m
FULL JOIN abteilungen a
USING (abteilung_id);
-- NATURAL FULL JOIN (verwenden Sie es mit Vorsicht!)
SELECT *
FROM tabelle_a NATURAL FULL JOIN tabelle_b;
Tipp: Verwenden Sie USING anstelle von ON, wenn die Join-Spalten in beiden Tabellen den gleichen Namen haben – das entfernt doppelte Spalten im Ergebnis. NATURAL JOIN ist oft zu unvorhersehbar und wird nicht empfohlen.

LEFT vs RIGHT vs FULL – Die Unterschiede

LEFT · RIGHT · FULL · INNER
-- LEFT: Alle aus A, nur passende aus B LEFT JOIN b ON a.id = b.id -- RIGHT: Alle aus B, nur passende aus A RIGHT JOIN b ON a.id = b.id -- FULL: Alle aus A UND alle aus B FULL JOIN b ON a.id = b.id

LEFT JOIN liefert alle Datensätze der linken Tabelle, RIGHT JOIN alle der rechten. FULL JOIN kombiniert beide – er liefert alle Datensätze aus beiden Tabellen.

Vergleich der JOIN-Typen

JOIN-Typ Ergebnis Typische Verwendung
INNER JOIN Nur Datensätze mit Übereinstimmung in beiden Tabellen Stammdaten abfragen
LEFT JOIN Alle aus linker Tabelle + passende aus rechter Fehlende Verknüpfungen finden
RIGHT JOIN Alle aus rechter Tabelle + passende aus linker Selten verwendet (LEFT reicht meist)
FULL OUTER JOIN Alle aus beiden Tabellen Vollständigen Datensatzabgleich
Beispiele
-- LEFT JOIN: Mitarbeiter auch ohne Abteilung
SELECT m.name, a.name AS "abteilung"
FROM mitarbeiter m
LEFT JOIN abteilungen a ON m.abteilung_id = a.id;
-- FULL JOIN: Alle Mitarbeiter + alle Abteilungen
SELECT m.name, a.name AS "abteilung"
FROM mitarbeiter m
FULL JOIN abteilungen a ON m.abteilung_id = a.id;
-- FULL JOIN mit WHERE: Nur nicht übereinstimmende
SELECT m.name, a.name AS "abteilung"
FROM mitarbeiter m
FULL JOIN abteilungen a ON m.abteilung_id = a.id
WHERE m.id IS NULL OR a.id IS NULL;
Tipp: RIGHT JOIN können Sie meist durch LEFT JOIN ersetzen, indem Sie die Tabellen vertauschen. FULL JOIN ist nützlich, wenn Sie wirklich alle Datensätze aus beiden Tabellen benötigen.

NULL-Behandlung – COALESCE & IS NULL

COALESCE · IS NULL · IS NOT NULL
-- NULL-Werte durch Standardwerte ersetzen SELECT COALESCE(m.name, 'Kein Mitarbeiter') AS "mitarbeiter", COALESCE(a.name, 'Keine Abteilung') AS "abteilung" FROM mitarbeiter m FULL JOIN abteilungen a ON m.abteilung_id = a.id;

NULL-Behandlung ist bei FULL OUTER JOIN besonders wichtig, da viele Spalten NULL sein können. COALESCE ersetzt NULL-Werte durch einen Standardwert, IS NULL filtert nach nicht übereinstimmenden Datensätzen.

Beispiele
-- COALESCE: NULL-Werte durch Platzhalter ersetzen
SELECT
COALESCE(m.name, '---') AS "mitarbeiter",
COALESCE(a.name, '---') AS "abteilung"
FROM mitarbeiter m
FULL JOIN abteilungen a ON m.abteilung_id = a.id;
-- Nur nicht übereinstimmende Datensätze finden
SELECT m.name AS "mitarbeiter_ohne_abteilung"
FROM mitarbeiter m
FULL JOIN abteilungen a ON m.abteilung_id = a.id
WHERE a.id IS NULL;
-- Leere Abteilungen (ohne Mitarbeiter)
SELECT a.name AS "abteilung_ohne_mitarbeiter"
FROM mitarbeiter m
FULL JOIN abteilungen a ON m.abteilung_id = a.id
WHERE m.id IS NULL;
Typische Ausgabe mit COALESCE:
Anna Müller | IT
--- | Finanzen
Klaus Weber | ---
Tipp: COALESCE(wert1, wert2, wert3) gibt den ersten nicht-NULL-Wert zurück. Das ist ideal für aussagekräftige Berichte mit FULL OUTER JOIN.

Performance – FULL JOIN & Alternativen

Performance · UNION · MySQL Workaround
-- MySQL: FULL JOIN mit LEFT + RIGHT + UNION SELECT * FROM tabelle_a LEFT JOIN tabelle_b ON a.id = b.id UNION SELECT * FROM tabelle_a RIGHT JOIN tabelle_b ON a.id = b.id WHERE a.id IS NULL;

Performance von FULL OUTER JOIN: Nicht alle Datenbanken unterstützen FULL JOIN nativ (z.B. MySQL). Der UNION-Workaround kann bei großen Tabellen teuer sein. Indizes auf den Join-Spalten sind entscheidend.

Unterstützung nach Datenbank

Datenbank FULL OUTER JOIN Alternative
PostgreSQL ✅ Ja
SQL Server ✅ Ja
Oracle ✅ Ja (mit (+))
SQLite ❌ Nein LEFT + RIGHT + UNION
MySQL ❌ Nein LEFT + RIGHT + UNION
Beispiele
-- MySQL Workaround für FULL JOIN
SELECT m.name, a.name AS "abteilung"
FROM mitarbeiter m
LEFT JOIN abteilungen a ON m.abteilung_id = a.id
UNION
SELECT m.name, a.name AS "abteilung"
FROM mitarbeiter m
RIGHT JOIN abteilungen a ON m.abteilung_id = a.id
WHERE m.id IS NULL;
-- Performance-Tipp: Index auf JOIN-Spalten
CREATE INDEX idx_mitarbeiter_abteilung_id ON mitarbeiter (abteilung_id);
CREATE INDEX idx_abteilungen_id ON abteilungen (id);
Tipp: Wenn Ihre Datenbank FULL JOIN nicht unterstützt, verwenden Sie den UNION-Workaround. Achten Sie auf Indizes auf den Join-Spalten – das verbessert die Performance erheblich.

Praxis-Beispiele – FULL OUTER JOIN in Aktion

Datenabgleich · Berichte · Migration
SELECT COALESCE(a.id, b.id) AS "id", a.name AS "alter_name", b.name AS "neuer_name" FROM alte_tabelle a FULL JOIN neue_tabelle b ON a.id = b.id;

Praxis-Beispiele zeigen typische Anwendungen von FULL OUTER JOIN – von Datenabgleichen über Migrationsberichte bis zu vollständigen Übersichten.

Beispiele
-- Datenabgleich: Unterschiede zwischen zwei Tabellen finden
SELECT
COALESCE(a.id, b.id) AS "id",
CASE
WHEN a.id IS NULL THEN 'Nur in B'
WHEN b.id IS NULL THEN 'Nur in A'
ELSE 'In beiden'
END AS "status"
FROM tabelle_a a
FULL JOIN tabelle_b b ON a.id = b.id;
-- Vollständige Liste aller Produkte und Kategorien (auch ohne Zuordnung)
SELECT
COALESCE(p.name, 'Kein Produkt') AS "produkt",
COALESCE(k.name, 'Keine Kategorie') AS "kategorie"
FROM produkte p
FULL JOIN kategorien k ON p.kategorie_id = k.id;
-- Mitarbeiter mit Abteilungen: Vollständige Übersicht
SELECT
COALESCE(m.name, '[Kein Mitarbeiter]') AS "mitarbeiter",
COALESCE(a.name, '[Keine Abteilung]') AS "abteilung"
FROM mitarbeiter m
FULL JOIN abteilungen a ON m.abteilung_id = a.id
ORDER BY "abteilung";
Typische Ausgabe (Datenabgleich):
1 | In beiden
2 | In beiden
5 | Nur in A
7 | Nur in B
Tipp: FULL OUTER JOIN ist ideal für Datenmigrationen, um Unterschiede zwischen alter und neuer Datenbankstruktur zu identifizieren. Mit CASE und COALESCE erstellen Sie aussagekräftige Berichte.

FULL OUTER JOIN im Überblick

FULL JOIN Alle Datensätze aus beiden Tabellen
LEFT + RIGHT kombiniert
COALESCE NULL-Werte ersetzen
Ersten nicht-NULL-Wert
IS NULL Nicht übereinstimmende finden
Fehlende Verknüpfungen
USING Bei gleichem Spaltennamen
Vermeidet Duplikate
UNION Workaround für MySQL/SQLite
LEFT + RIGHT + UNION
Index Performance optimieren
Auf Join-Spalten

Quick Summary

FULL JOIN
Alle aus beiden Tabellen
USING
Gleiche Spaltennamen
LEFT/RIGHT
Vergleich der JOIN-Typen
UNION
MySQL Workaround
COALESCE
NULL ersetzen
Datenabgleich
Praxis-Beispiele
SELECT * FROM tabelle_a FULL JOIN tabelle_b ON a.id = b.id;