SQL查询中NOT IN与NULL值问题

SQL查询中NOT IN与NULL值问题

为什么加了IS NOT NULL就可以查出数据,否则查不出数据

在SQL查询中,NOT IN子句在处理包含NULL值的子查询时可能会出现意外行为。具体来说,当子查询返回的结果集中包含NULL值时,NOT IN条件可能会导致整个查询返回空结果集。

例如查询中:

SELECT last_name
FROM employees
WHERE employee_id NOT IN (
    SELECT manager_id
    FROM employees
    #where manager_id is not null
);

如果子查询 SELECT manager_id FROM employees 返回的结果集中包含NULL值,那么 employee_id NOT IN (NULL, ...) 实际上会被解释为 employee_id <> NULL AND employee_id <> ...。在SQL中,任何与NULL的比较(包括 <>)都会返回UNKNOWN,而不是TRUEFALSE。因此,整个条件会评估为UNKNOWN,导致没有行满足条件,查询结果为空。

当你添加 WHERE manager_id IS NOT NULL 时:

SELECT last_name
FROM employees
WHERE employee_id NOT IN (
    SELECT manager_id
    FROM employees
    WHERE manager_id IS NOT NULL
);

子查询的结果集中不再包含NULL值,因此 employee_id NOT IN (...) 可以正常比较,返回预期的结果。

总结来说,NOT IN子句在处理包含NULL值的子查询时可能会导致意外的空结果集。为了避免这种情况,通常建议在子查询中排除NULL值,或者使用NOT EXISTS来代替NOT IN,因为NOT EXISTSNULL值的处理更为直观和可靠。


在SQL中,任何与NULL的比较(包括 <>)都会返回UNKNOWN,而不是TRUE或FALSE 这句话怎么理解

在SQL中,NULL表示缺失或未知的值。由于NULL的本质是“未知”,任何与NULL的比较操作都会返回UNKNOWN,而不是TRUEFALSE。这是因为SQL无法确定一个未知值与另一个值之间的关系。

让我们通过几个例子来理解这个概念:

  1. 等于 (=) 和 不等于 (<>) 操作符
    • 5 = NULL 返回 UNKNOWN,因为SQL无法确定5是否等于一个未知的值。
    • 5 <> NULL 也返回 UNKNOWN,因为SQL无法确定5是否不等于一个未知的值。
  2. 逻辑操作
    • 在逻辑表达式中,UNKNOWN 会影响整个表达式的结果。例如:
      • TRUE AND UNKNOWN 返回 UNKNOWN
      • FALSE OR UNKNOWN 返回 UNKNOWN
  3. NOT INNULL
    • 当使用 NOT IN 时,如果子查询返回的结果集中包含 NULL,那么整个 NOT IN 条件会被解释为 value <> NULL AND value <> ...。由于 value <> NULL 返回 UNKNOWN,整个条件会评估为 UNKNOWN,导致没有行满足条件。

举个例子:

SELECT * FROM employees WHERE employee_id NOT IN (SELECT manager_id FROM employees);

如果 manager_id 列中有 NULL 值,那么 employee_id NOT IN (NULL, ...) 会被解释为 employee_id <> NULL AND employee_id <> ...。由于 employee_id <> NULL 返回 UNKNOWN,整个条件评估为 UNKNOWN,查询结果为空。

为了避免这种情况,可以在子查询中排除 NULL 值:

SELECT * FROM employees WHERE employee_id NOT IN (SELECT manager_id FROM employees WHERE manager_id IS NOT NULL);

这样,NOT IN 子句中的比较就不会涉及 NULL,查询可以正常返回结果。

总结来说,NULL 在SQL中表示未知值,任何与 NULL 的比较都会返回 UNKNOWN,这会影响逻辑表达式的结果,尤其是在使用 NOT IN 时需要注意处理 NULL 值。


UNKNOWN是不是就是null

在SQL中,UNKNOWNNULL 是两个相关但不同的概念。让我们来详细解释它们的区别和联系:

  1. NULL

    • NULL 表示缺失或未知的值。它是一个特殊的值,表示“没有值”或“值未知”。
    • 例如,如果一个表中的某列允许 NULL,并且某行的该列没有值,那么该列的值就是 NULL
  2. UNKNOWN

    • UNKNOWN 是SQL中三值逻辑(Three-Valued Logic, 3VL)的一部分。在三值逻辑中,逻辑表达式的结果可以是 TRUEFALSEUNKNOWN
    • 当表达式涉及 NULL 时,结果通常是 UNKNOWN。例如,5 = NULL 的结果是 UNKNOWN,因为SQL无法确定5是否等于一个未知的值。
  3. 关系

    • UNKNOWN 是逻辑表达式的结果,而 NULL 是一个具体的值。
    • 当表达式涉及 NULL 时,结果通常是 UNKNOWN。例如:
      • NULL = NULL 的结果是 UNKNOWN,因为两个未知的值是否相等也是未知的。
      • NULL <> 5 的结果也是 UNKNOWN,因为无法确定一个未知的值是否不等于5。
  4. 实际应用

    • WHERE 子句中,只有条件评估为 TRUE 的行才会被选中。如果条件评估为 FALSEUNKNOWN,行不会被选中。

    • 例如:

      SELECT * FROM employees WHERE manager_id = NULL;
      

这个查询不会返回任何行,因为 manager_id = NULL 的结果是 UNKNOWN,而不是 TRUE

总结来说,NULL 是一个表示缺失或未知值的特殊值,而 UNKNOWN 是逻辑表达式在涉及 NULL 时的结果。它们密切相关,但在SQL中有不同的角色和含义。


注:学习SQL查询中NOT INNULL值问题的疑问

posted @   kokoasann  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示