Det är ingen skillnad.
Alla större motorer (det vill säga MySQL
, SQL Server
, Oracle
och PostgreSQL
) kommer att slå samman dessa predikat på parsningsstadiet och göra identiska planer från dem.
Hantering av dessa villkor är mer komplicerad än att bara använda operatörer i en eller annan ordning.
Till exempel i Oracle
, en IS NOT NULL
(eller NOT IS NULL
) condition innebär en möjlighet att använda ett index, så en fråga som denna:
SELECT column
FROM mytable
WHERE column IS NOT NULL
kommer med största sannolikhet att köras med en index fast full scan
, utan ytterligare kontroller gjorda under körning (eftersom NULL
värden kommer helt enkelt inte in i indexet, så det är ingen idé att kontrollera dem).
Även om varje post skulle behöva kontrolleras, kommer kontrollordningen att definieras av optimeraren (och inte av den ordning som predikaten och operatorerna visas i WHERE
klausul).
Här är till exempel en plan för ett Oracle
fråga:
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 är filter
översattes internt till en IS NOT NULL
(vilket Oracle
tillsammans med de flesta kommentatorer verkar det vara en lämpligare form)
Uppdatering:
Som Jonathan Leffler påpekade är dessa skillnader vid utvärdering av tupler (i motsats till enstaka kolumner).
En tuppel som består av blandad NULL
och icke-NULL
värden är varken en NULL
inte heller en NOT NULL
.
I PostgreSQL
(som stöder detta predikat mot tupler), båda dessa uttryck:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
utvärdera till falskt.