Mysql
 sql >> Base de données >  >> RDS >> Mysql

Quelle est la différence entre n'est pas nul et n'est pas nul

Il n'y a aucune différence.

Tous les principaux moteurs (c'est-à-dire MySQL , SQL Server , Oracle et PostgreSQL ) fusionnera ces prédicats lors de l'étape d'analyse, en faisant des plans identiques à partir d'eux.

La gestion de ces conditions est plus complexe que la simple application d'opérateurs dans l'une ou l'autre commande.

Par exemple, dans Oracle , un IS NOT NULL (ou NOT IS NULL ) implique la possibilité d'utiliser un index, donc une requête comme celle-ci :

SELECT  column
FROM    mytable
WHERE   column IS NOT NULL

sera très probablement exécuté avec un index fast full scan , sans vérifications supplémentaires effectuées à l'exécution (puisque le NULL les valeurs ne seront tout simplement pas intégrées à l'index, il est donc inutile de les vérifier).

Même si chaque enregistrement devait être vérifié, l'ordre des vérifications sera défini par l'optimiseur (et non par l'ordre dans lequel les prédicats et les opérateurs apparaissent dans le WHERE clause).

Par exemple, voici un plan pour un Oracle requête :

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)

Comme vous pouvez le voir, le filter a été traduit en interne en un IS NOT NULL (quel Oracle avec la plupart des commentateurs semble croire que c'est une forme plus appropriée)

Mise à jour :

Comme l'a souligné Jonathan Leffler, il s'agit d'une différence lors de l'évaluation des tuples (par opposition aux colonnes uniques).

Un tuple composé de NULL mélangés et non NULL valeurs n'est ni un NULL ni un NOT NULL .

Dans PostgreSQL (qui prend en charge ce prédicat contre les tuples), ces deux expressions :

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

évaluer à faux.