Nie ma różnicy.
Wszystkie główne silniki (czyli MySQL
, SQL Server
, Oracle
i PostgreSQL
) połączy te predykaty na etapie analizowania, tworząc z nich identyczne plany.
Obsługa tych warunków jest bardziej złożona niż zwykłe stosowanie operatorów w takiej czy innej kolejności.
Na przykład w Oracle
, IS NOT NULL
(lub IS NOT NULL
) warunek implikuje możliwość użycia indeksu, więc zapytanie takie jak:
SELECT column
FROM mytable
WHERE column IS NOT NULL
najprawdopodobniej zostanie wykonane z index fast full scan
, bez dodatkowych kontroli wykonywanych w czasie wykonywania (ponieważ NULL
wartości po prostu nie trafią do indeksu, więc nie ma sensu ich sprawdzać).
Nawet jeśli każdy rekord wymagałby sprawdzenia, kolejność sprawdzeń zostanie zdefiniowana przez optymalizator (a nie przez kolejność, w jakiej predykaty i operatory pojawiają się w WHERE
klauzula).
Na przykład, oto plan dla Oracle
zapytanie:
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)
Jak widać, filter
zostało przetłumaczone wewnętrznie na IS NOT NULL
(który Oracle
wraz z większością komentatorów wydaje się, że jest to bardziej odpowiednia forma)
Aktualizacja:
Jak zauważył Jonathan Leffler, jest to różnica przy ocenie krotek (w przeciwieństwie do pojedynczych kolumn).
Krotka składająca się z mieszanych NULL
i inne niż NULL
wartości nie są wartościami NULL
ani NOT NULL
.
W PostgreSQL
(który obsługuje ten predykat w stosunku do krotek), oba te wyrażenia:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
oceniać na fałsz.