Není v tom žádný rozdíl.
Všechny hlavní motory (to je MySQL
, SQL Server
, Oracle
a PostgreSQL
) sloučí tyto predikáty ve fázi analýzy a vytvoří z nich identické plány.
Manipulace s těmito podmínkami je složitější než pouhé použití operátorů v té či oné objednávce.
Například v Oracle
, IS NOT NULL
(nebo NOT IS NULL
) podmínka implikuje možnost použít index, takže dotaz jako tento:
SELECT column
FROM mytable
WHERE column IS NOT NULL
bude s největší pravděpodobností spuštěn pomocí index fast full scan
bez dalších kontrol prováděných za běhu (od NULL
hodnoty se do indexu prostě nedostanou, takže je zbytečné je kontrolovat).
I když by bylo nutné zkontrolovat každý záznam, pořadí kontrol bude definováno optimalizátorem (a nikoli pořadím, v jakém se predikáty a operátory objeví v WHERE
doložka).
Zde je například plán pro Oracle
dotaz:
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 můžete vidět, filter
byl interně přeložen do IS NOT NULL
(který Oracle
spolu s většinou komentujících se zdá být vhodnější formou)
Aktualizace:
Jak zdůraznil Jonathan Leffler, toto je rozdíl při hodnocení n-tic (na rozdíl od jednotlivých sloupců).
N-tice sestávající ze smíšených NULL
a jiné než NULL
Hodnoty nejsou ani NULL
ani NOT NULL
.
V PostgreSQL
(který podporuje tento predikát proti n-ticím), oba tyto výrazy:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
vyhodnotit jako nepravdivé.