Es gibt keinen Unterschied.
Alle wichtigen Engines (also MySQL
, SQL Server
, Oracle
und PostgreSQL
) werden diese Prädikate in der Parsing-Phase zusammenführen und daraus identische Pläne erstellen.
Die Handhabung dieser Bedingungen ist komplexer als die bloße Anwendung von Operatoren in der einen oder anderen Reihenfolge.
Zum Beispiel in Oracle
, ein IS NOT NULL
(oder NOT IS NULL
) Bedingung impliziert die Möglichkeit, einen Index zu verwenden, also eine Abfrage wie diese:
SELECT column
FROM mytable
WHERE column IS NOT NULL
wird höchstwahrscheinlich mit einem index fast full scan
ausgeführt , ohne zusätzliche Prüfungen zur Laufzeit (da der NULL
Werte schaffen es einfach nicht in den Index, also ist es sinnlos, sie zu überprüfen).
Selbst wenn jeder Datensatz geprüft werden müsste, wird die Reihenfolge der Prüfungen durch den Optimierer definiert (und nicht durch die Reihenfolge, in der die Prädikate und Operatoren in WHERE
erscheinen Klausel).
Hier ist zum Beispiel ein Plan für ein Oracle
Abfrage:
SQL> EXPLAIN PLAN FOR
2
2 SELECT *
3 FROM t_test
4 WHERE NOT column IS NULL
5 /
Explained
SQL> SELECT *
2 FROM TABLE(DBMS_XPLAN.display())
3 /
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 958699830
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 30 | 1260 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T_TEST | 30 | 1260 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("COLUMN" IS NOT NULL)
Wie Sie sehen können, ist der filter
wurde intern in ein IS NOT NULL
übersetzt (welche Oracle
zusammen mit den meisten Kommentatoren für eine angemessenere Form zu halten)
Aktualisierung:
Wie Jonathan Leffler betonte, ist dies ein Unterschied bei der Auswertung von Tupeln (im Gegensatz zu einzelnen Spalten).
Ein Tupel bestehend aus gemischtem NULL
und nicht-NULL
values ist weder ein NULL
noch ein NOT NULL
.
In PostgreSQL
(was dieses Prädikat gegen Tupel unterstützt), diese beiden Ausdrücke:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
als falsch auswerten.