Mysql
 sql >> Database >  >> RDS >> Mysql

Qual è la differenza tra non è nullo e non è nullo

Non c'è differenza.

Tutti i principali motori (ovvero MySQL , SQL Server , Oracle e PostgreSQL ) unirà questi predicati in fase di analisi, creando piani identici da loro.

La gestione di queste condizioni è più complessa della semplice applicazione di operatori nell'uno o nell'altro ordine.

Ad esempio, in Oracle , un IS NOT NULL (o NOT IS NULL ) condizione implica la possibilità di utilizzare un indice, quindi una query come questa:

SELECT  column
FROM    mytable
WHERE   column IS NOT NULL

molto probabilmente verrà eseguito con una index fast full scan , senza ulteriori controlli effettuati in runtime (poiché NULL i valori semplicemente non entreranno nell'indice, quindi è inutile controllarli).

Anche se ogni record dovesse essere verificato, l'ordine dei controlli sarà definito dall'ottimizzatore (e non dall'ordine in cui i predicati e gli operatori compaiono nel WHERE clausola).

Ad esempio, ecco un piano per un Oracle domanda:

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)

Come puoi vedere, il filter è stato tradotto internamente in un IS NOT NULL (che Oracle insieme alla maggior parte dei commentatori sembra ritenere una forma più appropriata)

Aggiornamento:

Come ha sottolineato Jonathan Leffler, queste sono differenze quando si valutano le tuple (al contrario delle singole colonne).

Una tupla composta da NULL misti e non NULL values ​​non è né un NULL né un NOT NULL .

In PostgreSQL (che supporta questo predicato contro le tuple), entrambe queste espressioni:

SELECT  (1, NULL) IS NULL
SELECT  (1, NULL) IS NOT NULL

valuta come falso.