以下2个查询之间有什么区别?
DELETE FROM experience WHERE end IS NOT NULL;
和
DELETE FROM experience WHERE NOT( end=NULL);
第一个查询被接受为正确答案,但第二个不是。
答案 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运算符。
请参阅以下链接了解更多详情。
答案 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
的应用程序都将生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。
所以,我不相信值得进一步讨论这个设置:不要碰它。