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.