違いはありません。
すべての主要なエンジン(つまり、MySQL 、SQL Server 、Oracle およびPostgreSQL )解析段階でこれらの述語をマージし、それらから同一の計画を作成します。
これらの条件の処理は、演算子を1つまたは別の順序で適用するよりも複雑です。
たとえば、Oracle 、IS NOT NULL (またはNOT IS NULL )条件は、インデックスを使用する可能性を意味するため、次のようなクエリ:
SELECT column
FROM mytable
WHERE column IS NOT NULL
ほとんどの場合、index fast full scanで実行されます 、実行時に追加のチェックが行われない(NULL以降) 値はインデックスに含まれないため、チェックする必要はありません。
各レコードをチェックする必要がある場合でも、チェックの順序はオプティマイザーによって定義されます(WHEREに表示される述語と演算子の順序ではありません)。 条項)。
たとえば、Oracleの計画は次のとおりです。 クエリ:
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)
ご覧のとおり、filter 内部でIS NOT NULLに変換されました (Oracle ほとんどのコメント投稿者と一緒に、より適切な形式であると信じているようです)
更新:
Jonathan Lefflerが指摘したように、これらはタプルを評価するときの違いです(単一の列ではありません)。
混合NULLで構成されるタプル および非NULL 値はNULLでもありません また、NOT NULL 。
PostgreSQLで (タプルに対するこの述語をサポートします)、これらの表現は両方とも:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
falseと評価します。