No hay diferencia.
Todos los principales motores (es decir, MySQL
, SQL Server
, Oracle
y PostgreSQL
) combinará estos predicados en la etapa de análisis, haciendo planes idénticos a partir de ellos.
El manejo de estas condiciones es más complejo que la mera aplicación de operadores en uno u otro orden.
Por ejemplo, en Oracle
, un IS NOT NULL
(o IS NOT NULL
) la condición implica la posibilidad de usar un índice, por lo que una consulta como esta:
SELECT column
FROM mytable
WHERE column IS NOT NULL
lo más probable es que se ejecute con un index fast full scan
, sin comprobaciones adicionales realizadas en tiempo de ejecución (ya que NULL
los valores simplemente no se incluirán en el índice, por lo que no sirve de nada verificarlos).
Incluso si fuera necesario comprobar cada registro, el optimizador definirá el orden de las comprobaciones (y no el orden en que aparecen los predicados y operadores en WHERE
cláusula).
Por ejemplo, aquí hay un plan para un Oracle
consulta:
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 puede ver, el filter
se tradujo internamente a IS NOT NULL
(que Oracle
junto con la mayoría de los comentaristas parece creer que es una forma más apropiada)
Actualización:
Como señaló Jonathan Leffler, esta es la diferencia al evaluar tuplas (en lugar de columnas individuales).
Una tupla que consta de NULL
mixtos y no NULL
valores no es ni un NULL
ni un NOT NULL
.
En PostgreSQL
(que admite este predicado contra tuplas), ambas expresiones:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
evaluar a falso.