SQL EXCEPT ist ein Mengenoperator für die Differenzmenge: Er liefert alle Zeilen aus der ersten Abfrage, die in der zweiten Abfrage nicht vorkommen. EXCEPT beantwortet typische „Was fehlt?“-Fragen, etwa welche Kunden noch nie bestellt haben.
So funktioniert EXCEPT
Wie bei UNION und INTERSECT müssen beide Abfragen die gleiche Spaltenzahl mit kompatiblen Datentypen liefern. Die Reihenfolge der Abfragen ist entscheidend – EXCEPT ist nicht kommutativ:
SELECT kunden_id FROM kunden
EXCEPT
SELECT kunden_id FROM bestellungen;
Das Ergebnis enthält nur Kunden, die in keiner Bestellung auftauchen. Vertauscht man die Abfragen, erhält man eine völlig andere (meist leere) Menge.
Duplikate und NULL-Werte
- Standardmäßig entfernt EXCEPT doppelte Zeilen – jede Zeile erscheint höchstens einmal.
EXCEPT ALLbehält Duplikate: Eine Zeile erscheint so oft, wie sie in der ersten Abfrage häufiger vorkommt als in der zweiten.NULL-Werte gelten bei der Duplikat-Entfernung als gleich.
EXCEPT, MINUS und NOT EXISTS
Oracle nennt denselben Operator MINUS. In MySQL ist EXCEPT seit 8.0.31 verfügbar, in MariaDB seit 10.3. Alternativ lässt sich dieselbe Frage mit NOT EXISTS (EXISTS) oder einem LEFT JOIN mit IS NULL beantworten – praktisch, wenn man die Abfragen nicht als Mengen, sondern zeilenweise vergleichen möchte.
Grundlagen zu Abfragen finden sich unter SQL-Grundlagen.