Der er ingen forskel.
Alle større motorer (det vil sige MySQL , SQL Server , Oracle og PostgreSQL ) vil flette disse prædikater på parsing-stadiet og lave identiske planer ud fra dem.
Håndtering af disse forhold er mere kompleks end blot at anvende operatører i en eller anden rækkefølge.
For eksempel i Oracle , en IS NOT NULL (eller NOT IS NULL ) betingelse indebærer en mulighed for at bruge et indeks, så en forespørgsel som denne:
SELECT column
FROM mytable
WHERE column IS NOT NULL
vil højst sandsynligt blive udført med en index fast full scan , uden yderligere kontrol foretaget i runtime (siden NULL værdier kommer bare ikke ind i indekset, så det nytter ikke at tjekke dem).
Selvom hver post skulle kontrolleres, vil kontrolrækkefølgen blive defineret af optimeringsværktøjet (og ikke af den rækkefølge, prædikaterne og operatorerne vises i WHERE) klausul).
For eksempel er her en plan for en Oracle forespørgsel:
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)
Som du kan se, er filter blev internt oversat til en IS NOT NULL (hvilket Oracle sammen med de fleste kommentatorer synes at være en mere passende form)
Opdatering:
Som Jonathan Leffler påpegede, er disse forskelle ved evaluering af tupler (i modsætning til enkelte kolonner).
En tuple bestående af blandet NULL og ikke-NULL værdier er hverken en NULL heller ikke en NOT NULL .
I PostgreSQL (som understøtter dette prædikat mod tupler), begge disse udtryk:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
evaluer til falsk.