SQL-Abfrage: Unterschiede ermitteln mit dem Schlüsselwort „EXCEPT“

Manchmal möchten wir wissen, welche Daten in einer Tabelle enthalten sind, die in einer anderen Tabelle nicht vorhanden sind. Dafür gibt es im SQL-Standard das Schlüsselwort EXCEPT. Dieses Schlüsselwort hilft uns, die Differenz oder die Unterschiede zwischen den Ergebnismengen zu ermitteln.

Stell dir das so vor:
Wir haben zwei Listen (Tabellen). Wir schauen uns zuerst die erste Liste an und prüfen dann, was darin nicht in der zweiten Liste vorkommt. Genau das macht EXCEPT!


Funktionsweise von EXCEPT

Das Schlüsselwort EXCEPT vergleicht die Ergebnisse von zwei Abfragen und gibt nur die Zeilen zurück, die in der ersten Abfrage vorkommen, aber NICHT in der zweiten. Es kann für viele Szenarien verwendet werden, zum Beispiel, um zu prüfen:

  • Welche Personen in Tabelle A sind, die in Tabelle B fehlen.
  • Produkte, die in einem Lager verfügbar sind, in einem anderen jedoch nicht.
  • Kunden ermitteln, die keine Bestellungen aufgegeben haben.
  • Mitarbeiter ermitteln, die nicht in einer bestimmten Abteilung arbeiten.
  • Studenten heraussuchen, die keine Prüfungen abgelegt haben.
  • Artikel ermitteln, die nicht gekauft wurden.
  • Bücher, die in einer Bibliothek vorhanden sind, in einer anderen jedoch nicht.
  • Veranstaltungen, die im vergangenen Jahr stattfanden, aber dieses Jahr fehlen.
  • Fahrzeuge, die in einer Mietstation verfügbar sind, in einer anderen jedoch nicht.
  • Artikel, die in einem Online-Shop gelistet sind, aber nicht auf Lager.

Das Schlüsselwort „EXCEPT“ bietet somit zahlreiche Möglichkeiten, Unterschiede zwischen Datensätzen verschiedener Tabellen und Abfragen hervorzuheben. Es ist besonders nützlich in Szenarien wie Reportings, Datenmigration und Datenbereinigung.


Die grundlegende Syntax

Die Syntax für die EXCEPT-Abfrage sieht wie folgt aus:

-- Syntax der EXCEPT-Abfrage:
SELECT
    spaltenname1,
    spaltenname2,
    ...
FROM
    tabelle1
EXCEPT
SELECT
    spaltenname1,
    spaltenname2,
    ...
FROM
    tabelle2;
Regeln:
  • Die Spaltenanzahl und der Datentyp müssen in beiden Abfragen gleich sein.
  • Die Reihenfolge der Spalten in beiden „SELECT“-Abfragen muss identisch sein.

Beispiel: Arbeiten mit den Tabellen „Mitgliedsbeitrag“

Nehmen wir an, wir haben eine Datenbank namens Vereinsmitglieder in der jeweils eine eigene Tabelle für die Mitgliedsbeiträge eines jeden Jahres existiert. Diese Tabellen haben den Namen Mitgliedsbeitrag_ gefolgt von dem Jahr, in dem die Mitgliedsbeiträge erfasst wurden. Also ist jede Tabelle spezifisch für unterschiedliche Jahre.

Wenn du mit der Tabelle selbst testen möchtest, dann lade dir die Datenbank

Tabelle: Mitgliedsbeitrag_2025

IDNameAlter
1Anna36
2Benjamin12
3Claudia12

Tabelle: Mitgliedsbeitrag_2026

IDNameBeitrag
2Benjamin12
3Claudia12
4Dominik24

Abfrage mit EXCEPT:

Jetzt möchten wir wissen, welche Personen 2022 in der Datenbank waren, aber 2023 nicht mehr vorhanden sind:

# SQL-Abfrage mit „EXCEPT“
SELECT 
    Name,
    Beitrag
FROM
    Mitgliedsbeitrag_2025
EXCEPT
SELECT 
    Name,
    Beitrag
FROM
    Mitgliedsbeitrag_2026;

Ergebnis:

NameBeitrag
Anna36

Erklärung: EXCEPT filtert hier die Daten so, dass nur die Zeilen aus der Tabelle Personen_2022 zurückgegeben werden, die in Personen_2023 NICHT vorhanden sind.


Beispiele für andere Szenarien:

1. Liste der fehlenden Produkte

Du hast zwei Tabellen: Produkte_A und Produkte_B. Eine Abfrage könnte so aussehen, um Produkte zu finden, die nur in der ersten Tabelle vorhanden sind:

SELECT ProduktName
FROM Produkte_A
EXCEPT
SELECT ProduktName
FROM Produkte_B;

2. Mitarbeiter, die das Unternehmen verlassen haben

Angenommen, wir möchten eine Liste der Mitarbeiter, die letztes Jahr im Unternehmen waren, dieses Jahr jedoch fehlen:

SELECT MitarbeiterID, Name
FROM Mitarbeiter_Vorjahr
EXCEPT
SELECT MitarbeiterID, Name
FROM Mitarbeiter_Jahr;

Einschränkungen der Verwendung von EXCEPT

Nicht alle Plattformen unterstützen das EXCEPT-Schlüsselwort gemäß SQL-Standard. In einigen Datenbanken werden alternative Befehle bzw. andere Ansätze benötigt. Nachfolgend zeigen wir, wie du ähnlich funktionierende Abfragen schreiben kannst, je nach Datenbank:

  1. Falls du eine alte Datenbankversion oder eine Datenbank verwendest, die „EXCEPT“ nicht unterstützt, kannst du stattdessen das Konzept mit einem Subquery und einer NOT IN-Abfrage umsetzen:
SELECT Name, Alter
FROM Personen_2022
WHERE (Name, Alter) NOT IN (
SELECT Name, Alter
FROM Personen_2023
);
      1. Oracle Database: Unterstützt das Schlüsselwort EXCEPT nicht, bietet aber eine Alternative mit dem Schlüsselwort MINUS, das die gleiche Funktionalität hat. Die Syntax kann ebenfalls in MariaDB genutzt werden, wenn der SQL_MODE=ORACLE gesetzt ist.
      SELECT Name, Alter
      FROM Personen_2022
      MINUS
      SELECT Name, Alter
      FROM Personen_2023;

      Zusammenfassung der Unterschiede

      Hier ist eine Übersicht über die Unterstützung des SQL-Standards auf verschiedenen Plattformen und mögliche Alternativen:

      DatenbankplattformUnterstützungAlternative
      MariaDBJa, ab Version 10.3Ab Version 10.6.1 kann „MINUS“ ebenfalls verwendet werden, wenn der SQL_MODE=ORACLE gesetzt ist. Die klare Empfehlung ist, dies jedoch nicht zu tun, da „EXCEPT“ dem Standard entspricht.
      MySQLJa, ab Version 8.0.31
      MSSQL (Microsoft SQL Server)Ja
      SQLiteJa
      Oracle DatabaseNeinVerwendung von MINUS statt EXCEPT

      Zusammenfassung

      Das Schlüsselwort EXCEPT ist ein unglaublich praktisches Werkzeug, um Unterschiede in großen Datensätzen leicht sichtbar zu machen. Es spart Zeit in der Analyse von Tabellen, die miteinander verglichen werden sollen, und wird in vielen realen Szenarien eingesetzt, etwa bei:

      • der Migration von Daten.
      • der Datenbereinigung,
      • der Überprüfung von fehlenden Werten,
      • der Identifikation von Lücken in Datensätzen,
      • dem Vergleich von BackUps

      Obwohl einige Datenbanken das EXCEPT“-Schlüsselwort nicht unterstützen, gibt es immer Alternativen, um dasselbe Ergebnis zu erzielen.