Non c'è differenza.
Tutti i principali motori (ovvero MySQL
, SQL Server
, Oracle
e PostgreSQL
) unirà questi predicati in fase di analisi, creando piani identici da loro.
La gestione di queste condizioni è più complessa della semplice applicazione di operatori nell'uno o nell'altro ordine.
Ad esempio, in Oracle
, un IS NOT NULL
(o NOT IS NULL
) condizione implica la possibilità di utilizzare un indice, quindi una query come questa:
SELECT column
FROM mytable
WHERE column IS NOT NULL
molto probabilmente verrà eseguito con una index fast full scan
, senza ulteriori controlli effettuati in runtime (poiché NULL
i valori semplicemente non entreranno nell'indice, quindi è inutile controllarli).
Anche se ogni record dovesse essere verificato, l'ordine dei controlli sarà definito dall'ottimizzatore (e non dall'ordine in cui i predicati e gli operatori compaiono nel WHERE
clausola).
Ad esempio, ecco un piano per un Oracle
domanda:
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)
Come puoi vedere, il filter
è stato tradotto internamente in un IS NOT NULL
(che Oracle
insieme alla maggior parte dei commentatori sembra ritenere una forma più appropriata)
Aggiornamento:
Come ha sottolineato Jonathan Leffler, queste sono differenze quando si valutano le tuple (al contrario delle singole colonne).
Una tupla composta da NULL
misti e non NULL
values non è né un NULL
né un NOT NULL
.
In PostgreSQL
(che supporta questo predicato contro le tuple), entrambe queste espressioni:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
valuta come falso.