Não há diferença.
Todos os principais mecanismos (que é
MySQL
, SQL Server
, Oracle
e PostgreSQL
) mesclará esses predicados no estágio de análise, fazendo planos idênticos a partir deles. O manuseio dessas condições é mais complexo do que a mera aplicação de operadores em uma ou outra ordem.
Por exemplo, em
Oracle
, um IS NOT NULL
(ou IS NOT NULL
) implica a possibilidade de usar um índice, então uma consulta como esta:SELECT column
FROM mytable
WHERE column IS NOT NULL
provavelmente será executado com um
index fast full scan
, sem verificações adicionais feitas em tempo de execução (já que o NULL
valores simplesmente não entrarão no índice, então não adianta verificá-los). Mesmo que cada registro precise ser verificado, a ordem das verificações será definida pelo otimizador (e não pela ordem em que os predicados e operadores aparecem no
WHERE
cláusula). Por exemplo, aqui está um plano para um
Oracle
inquerir: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)
Como você pode ver, o
filter
foi traduzido internamente para um IS NOT NULL
(que Oracle
junto com a maioria dos comentaristas parece acreditar ser uma forma mais apropriada) Atualização:
Como Jonathan Leffler apontou, essa é a diferença ao avaliar tuplas (em oposição a colunas únicas).
Uma tupla que consiste em
NULL
misto e não NULL
valores não é um NULL
nem um NOT NULL
. Em
PostgreSQL
(que suporta este predicado contra tuplas), ambas as expressões:SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
avaliar como falso.