Die EXCEPT-Klausel stellt die Möglichkeit bereit, Ergebnisse aus einer Ergebnistabelle von einer anderen abzuziehen.
Gewünscht seien zunächst alle Orte, die in der Tabelle 'hotel' gefunden werden, aber nicht in der Ergebnistabelle von 'kunde' enthalten sind.
SELECT ort FROM hotel WHERE plz > '7' EXCEPT SELECT ort FROM kunde WHERE plz > '7'
Die Reihenfolge der SELECT-Anweisungen ist hier nicht - wie bei UNION und INTERSECT - beliebig.
Sind alle Ergebniszeilen gesucht, die in 'kunde', aber nicht in 'hotel' enthalten sind, wird die Meldung 'Zeile nicht gefunden' geliefert. Die Orte Stuttgart und München haben ein Pendant in der Hoteltabelle, werden also nicht als Ergebnis geliefert. Es spielt hierbei keine Rolle, daß die Kundentabelle einen 'München'-Eintrag mehr enthält als 'hotel'.
Bevor das EXCEPT wirksam wird, wird implizit ein DISTINCT auf die Tabellen abgesetzt.
Möchte man erreichen, daß auch die Anzahl der in den einzelnen Ergebnistabellen gefundenen Zeilen in Betracht gezogen wird, muß mit EXCEPT ALL gearbeitet werden.
SELECT ort FROM kunde WHERE plz > '7' EXCEPT ALL SELECT ort FROM hotel WHERE plz > '7'
Wir sehen hier, daß das 'ALL' die Anwendung von DISTINCT verhindert hat. Da 'München' in der Kundentabelle einmal häufiger vorkommt als in 'hotel', bleibt dieser Wert als Ergebnis erhalten.
Anschaulich gesehen bedeutet das, daß man die jeweils übereinstimmenden Werte der beiden Tabellen "wegstreicht"; die verbleibenden Werte der ersten Tabelle bleiben als Ergebnis stehen.
In unserem Beispiel:
Zwei der Einträge 'München' sowie 'Stuttgart' "heben sich auf".