【问题标题】:Difference between "IS NOT NULL" and "NOT (field = NULL)" in these 2 queries这两个查询中“IS NOT NULL”和“NOT (field = NULL)”之间的区别
【发布时间】:2016-03-18 04:57:21
【问题描述】:

以下2个查询有什么区别?

DELETE FROM experience WHERE end IS NOT NULL;

DELETE FROM experience WHERE NOT( end=NULL);

第一个查询被接受为正确答案,但第二个不是。

【问题讨论】:

标签: mysql sql


【解决方案1】:

NULL 有点奇怪。 NULL 从不等于任何事物包括另一个 NULL。 此外,任何针对 NULL 的布尔运算都返回 NULL。

如果end 为NULL,表达式end IS NOT NULL 将评估false,如果end 不为NULL,则评估true

表达式NOT( end=NULL) 实际上总是会计算为NULL,因为(end = NULL) 等于NULL,而NOT (NULL) 也等于NULL。更重要的是,在 WHERE 子句中,它永远不会评估 true

【讨论】:

    【解决方案2】:

    NULL 值的处理方式与其他值不同。

    NULL 用作未知或不适用值的占位符。 无法使用比较运算符(例如 =、

    )测试 NULL 值

    您必须改用 IS NULL 和 IS NOT NULL 运算符。

    更多详情请参考以下链接。

    http://www.w3schools.com/sql/sql_null_values.asp

    【讨论】:

      【解决方案3】:

      将变量与 null 进行比较(即 field = NULL)与将未知值分配给“field”相同。 IS NOT NULL 检查字段是否为空。第二个 NOT (end=NULL) 将“未知”值分配给字段,然后记录结果。您不应将变量分配给未知值。

      【讨论】:

        【解决方案4】:

        您不应该单独使用“NOT”。后面应该跟“IS”。因此,如果您希望第二个查询起作用,请使用 - DELETE FROM experience WHERE IS NOT(end=NULL);

        【讨论】:

          【解决方案5】:

          除非与IS 结合使用,否则其中包含NULL 的表达式永远不会被评估为真(但请参阅更多内容)。如MySql docs中所述:

          您不能使用 =<<> 等算术比较运算符来测试 NULL

          由于与NULL 的任何算术比较结果也是NULL,因此您无法从此类比较中获得任何有意义的结果。

          规则的例外情况

          并非所有以NULL 作为参数的表达式都计算为NULL。除了NULL IS NULL,下面的也会产生一个真值:

          NULL <=> NULL,
          COALESCE(NULL, true),
          IFNULL(NULL, true),
          ISNULL(NULL),
          1 IN (1, NULL),
          INTERVAL(1, 0, 2, NULL)
          CASE 1 WHEN 1 THEN TRUE WHEN NULL THEN false END
          

          最后三个不产生NULL 的原因是这些表达式执行某种形式的short-circuit evaluation。因此,如果在从左到右的评估过程中结果是明确的,则表达式的其余部分(包括 NULL)不会被评估。

          但以下所有内容都将是NULL

          NULL = NULL
          CASE NULL WHEN NULL THEN TRUE END,
          'test' || NULL,
          GREATEST(1, NULL),
          1 NOT IN (2, NULL)
          

          请注意,在最后两个表达式中,短路是不可能的:必须评估所有参数,至少在找到 NULL 之前。

          ANSI_NULLS设置

          当设置为OFF 时,有一个ANSI_NULLS 设置会影响上述行为。默认为ON,实际上不应更改。如文档中所述:

          重要

          在 SQL Server 的未来版本中,ANSI_NULLS 将始终为 ON,任何将选项显式设置为 OFF 的应用程序都会生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

          所以,我认为不值得进一步讨论这个设置:不要碰它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-04
            • 1970-01-01
            • 2015-04-21
            • 1970-01-01
            • 1970-01-01
            • 2011-01-15
            • 1970-01-01
            相关资源
            最近更新 更多