首页 > 数据库 > mysql教程 > 为什么 NULL 值会导致 SQL 的 NOT IN 子句出现意外结果?

为什么 NULL 值会导致 SQL 的 NOT IN 子句出现意外结果?

Mary-Kate Olsen
发布: 2025-01-23 12:31:09
原创
863 人浏览过

Why Do NULL Values Cause Unexpected Results with SQL's NOT IN Clause?

了解 SQL 中 NULL 值和 NOT IN 子句的意外行为

NULL 值与 NOT IN 运算符交互时,SQL 查询通常会产生令人惊讶的结果。 当将 NOT IN 查询与使用 LEFT JOIN.

的等效查询进行比较时,这种差异变得很明显

考虑这些问题:

<code class="language-sql">A: select 'true' where 3 in (1, 2, 3, null)
B: select 'true' where 3 not in (1, 2, null)</code>
登录后复制

查询 A 返回结果,而查询 B 则不返回结果。 根本原因在于不同的 SQL 数据库如何处理 NULL 值。

启用 ANSI_NULLS(许多系统(如 SQL Server 2005)中的默认设置),任何涉及 NULL 的比较(例如 3 = NULL)都会计算为 UNKNOWN。这种不确定性源于NULL.

固有的不确定性

在查询 B 中,NOT IN 运算符在子查询中遇到 NULL,从而产生 UNKNOWN 计算。 由于没有其他值匹配,整个谓词变为 UNKNOWN,产生空结果集。

相反,禁用ANSI_NULLS会改变行为。 当 ANSI_NULLS 关闭时,3 = NULL 的计算结果为 TRUE。 SQL 将 NULL 解释为可能等于一切,包括它本身。 因此,查询 B 的谓词计算结果为 TRUE,返回结果。

简而言之,不一致的结果源于对 NULL 设置确定的 ANSI_NULLS 值的不同处理。 当 ANSI_NULLS 启用时,与 NULL 的比较会产生 UNKNOWN,从而导致在使用 NOT INNULL 值的查询中出现意外结果。 这凸显了理解 NULL SQL 处理以获得准确查询结果的重要性。

以上是为什么 NULL 值会导致 SQL 的 NOT IN 子句出现意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板