sql >> Base de Datos >  >> RDS >> Mysql

¿Cuál es la diferencia entre No es nulo y No es nulo?

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.