違いはありません。
すべての主要なエンジン(つまり、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と評価します。