没有区别。
在我看来,性能可能有所不同。有人愿意对此进行详细说明吗?
所有主要搜索引擎(即MysqL
,sql Server
,Oracle
和Postgresql
)将合并在分析阶段,从他们制作计划相同,这些谓词。
例如,在中Oracle
,IS NOT NULL
(或NOT IS NULL
)条件表示有可能使用索引,因此查询如下:
SELECT column
FROM mytable
WHERE column IS NOT NULL
将最有可能使用来执行index fast full scan
,而在运行时NULL
不会进行任何其他检查(因为这些值不会进入索引,因此没有必要对其进行检查)。
即使需要检查每个记录,检查的顺序也将由优化器定义(而不是由谓词和运算符出现在WHERE
子句中的顺序)。
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
值组成的元组既不是aNULL
也不是a NOT NULL
。
在Postgresql
(支持针对元组的谓词)中,这两个表达式:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
评估为假。