gpt4 book ai didi

sql - "Is Not Null"和 "Not Is Null"有什么区别

转载 作者:IT老高 更新时间:2023-10-28 23:44:24 36 4
gpt4 key购买 nike

SELECT id FROM customers WHERE type IS NOT Null;

对比:

SELECT id FROM customers WHERE NOT type IS NULL;

以上任何一个返回的数据都将完全相同。

有什么区别,为什么其中一种更可取?

编辑:
在我看来,在性能方面可能会有所不同。有人愿意详细说明吗?

最佳答案

没有区别。

It seems to me that there might be a difference when it comes to performance. Anyone care to elaborate on this?

所有主要引擎(即 MySQLSQL ServerOraclePostgreSQL)都会合并这些谓词在解析阶段,根据它们制定相同的计划。

处理这些条件比仅以一种或另一种顺序应用运算符更为复杂。

例如,在 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

评估为假。

关于sql - "Is Not Null"和 "Not Is Null"有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4070207/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com