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.