Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Qual é a diferença entre não é nulo e não é nulo


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.