没有区别。
在我看来,在性能方面可能存在差异。有人愿意详细说明一下吗?
所有主要发动机(即MySQL
, SQL Server
, Oracle
and PostgreSQL
)将在解析阶段合并这些谓词,从中制定相同的计划。
处理这些条件比仅按一种或另一种顺序应用运算符更为复杂。
例如,在Oracle
, an IS NOT NULL
(or NOT IS NULL
) 条件意味着可以使用索引,因此查询如下:
SELECT column
FROM mytable
WHERE column IS NOT NULL
很可能会被执行index fast full scan
,在运行时没有进行额外的检查(因为NULL
值不会进入索引,所以检查它们是没有用的)。
即使需要检查每条记录,检查的顺序也将由优化器定义(而不是由谓词和运算符在记录中出现的顺序定义)WHERE
条款)。
例如,这是一个计划Oracle
query:
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
(which Oracle
大多数评论者似乎认为这是一种更合适的形式)
Update:
正如 Jonathan Leffler 指出的那样,在评估元组(而不是单列)时,这些是不同的。
由混合组成的元组NULL
和非NULL
价值观既不是NULL
nor a NOT NULL
.
In PostgreSQL
(支持针对元组的谓词),这两个表达式:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
评估为假。