Um es gleich vorweg zu nehmen, die Antwort lautet: Ja und Nein!
Auf den ersten Blick erscheint das nicht ganz logisch. Warum soll NOT IN nicht die Umkehrung von IN sein?
Im rein logischen Sinn ist sie das ja auch. Betrachtet man nur die logischen Zustände WAHR und FALSCH, dann ist NOT INexakt die Umkehrung von IN - deshalb die Antwort „Ja”.
Eine Datenbank kennt jedoch im logischen Sinn noch einen dritten Wert, den undefinierten Feldinhalt NULL. Und wenn NULL-Werte in einer Abfrage eine Rolle spielen, dann ist NOT IN eben nicht mehr die Umkehrung von IN! Aber warum ist das so?
Dazu zunächst ein paar Anmerkungen wie eine Datenbank den Zustand NULL logisch berücksichtigt:
- Eine logische UND-Verknüpfung mit einem NULL ist immer NULL.
- Eine logische ODER-Verknüpfung mit einem NULL ist:
- WAHR, wenn irgendein Ausdruck der ODER-Verknüpfung WAHR ist.
- NULL, wenn alle anderen Asudrücke FALSCH oder ebenfalls NULL sind.
- Eine logische NICHT-Verknüpfung mit einem NULL ist immer NULL.
- Ein Vergleich mit einem NULL ist immer NULL.
- In einer WAHR-FALSCH-Entscheidung wird Ein NULL-Ausdruck immer als FALSCH ausgewertet.
Als nächstes sollte man sich ansehen, wie eine Datenbank einen Abfrageausdruck der Form „WHERE x IN (a, b, c)” auswertet. Intern wird dieser Ausdruck als logische ODER-Verknüpfung umgesetzt, entspricht also einem „WHERE x=a OR x=b OR x=c”.
Die Umkehrung „WHERE x NOT IN (a, b, c)” wird nach logischen Regeln in eine UND-Verknüpfung aufgelöst. „WHERE NOT x=a AND NOT x=b AND NOT x=c”. Wer sich jetzt nocheinmal die o.g. Regeln für die Behandlung von NULL-Werten ansieht, dem wird eigentlich sofort klar, warum das NOT IN nicht die Umkehrung von IN ist, sobald einer der Werte a, b oder c ein NULL-Wert ist.
Trotzdem nochmal konkret: Angenommen der Wert c ist ein NULL-Wert. „WHERE x IN (a, b, NULL)” wird, wie wir bereits wissen, intern in „WHERE x=a OR x=b OR x=NULL” aufgelöst. Dieser Ausdruck kann durchaus WAHR werden, nämlich dann, wenn a oder b WAHR sind. Er wird jedoch nie FALSCH! Er wird zu NULL, wenn sowohl a als auch b FALSCH (oder ebenfalls NULL) sind.
Da die Datenbank den NULL-Ausdruck im Endeffekt wie ein FALSCH behandelt, fällt dies zunächst nicht auf.
Für die Umkehrung „WHERE x NOT IN (a, b, NULL)” ist es aber entscheidend! Da der ursprüngliche Ausdruck nie FALSCH werden kann, kann die Umkehrung mit NOT nie WAHR werden. Dies wird auch deutlich, wenn man sich die genaue Umsetzung mit „WHERE NOT x=a AND NOT x=b AND NOT x=NULL” ansieht. Der Ausdruck „NOT x=NULL” ist immer NULL und damit wird die gesamte UND-Verknüpfung ebenfalls immer NULL.
Fazit: Eine Abfrage mit IN kann bei Vorhandensein von NULL-Werten zutreffen oder auch nicht, da sie WAHR oder NULL
werden kann. Die Umkehrung NOT IN wird jedoch in keinem Fall zutreffen, da sie nur NULL werden kann.