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
ID | Name | Alter |
---|---|---|
1 | Anna | 36 |
2 | Benjamin | 12 |
3 | Claudia | 12 |
Tabelle: Mitgliedsbeitrag_202
6
ID | Name | Beitrag |
---|---|---|
2 | Benjamin | 12 |
3 | Claudia | 12 |
4 | Dominik | 24 |
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:
Name | Beitrag |
---|---|
Anna | 36 |
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:
- 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
);
- Oracle Database: Unterstützt das Schlüsselwort
EXCEPT
nicht, bietet aber eine Alternative mit dem SchlüsselwortMINUS
, 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:
Datenbankplattform | Unterstützung | Alternative |
---|---|---|
MariaDB | Ja, ab Version 10.3 | Ab 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. |
MySQL | Ja, ab Version 8.0.31 | – |
MSSQL (Microsoft SQL Server) | Ja | – |
SQLite | Ja | – |
Oracle Database | Nein | Verwendung 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.