" IS NOT NULL"之间的区别和" NOT(字段= NULL)"在这2个查询中

时间:2016-03-18 04:57:21

标签: mysql sql

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

DELETE FROM experience WHERE end IS NOT NULL;

DELETE FROM experience WHERE NOT( end=NULL);

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

5 个答案:

答案 0 :(得分:6)

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

如果end IS NOT NULL为NULL,则表达式false将评估 end ,如果{{1>,则 true 不是NULL。

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

答案 1 :(得分:5)

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

NULL用作未知或不适用值的占位符。 使用比较运算符测试NULL值是不可能的,例如=,<或<>

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

请参阅以下链接了解更多详情。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

你不应该使用" NOT"单独。它应该跟随" IS"。因此,如果您希望第二个查询起作用,那么使用 - DELETE FROM experience WHERE IS NOT(end = NULL);

答案 4 :(得分:1)

除非与NULL结合使用,否则其中IS的表达式永远不会被评估为真(但请参阅进一步说明)。如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的应用程序都将生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

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