为空与等于空

is null vs. equals null

this one.

这样的问题,我大概明白了为什么SQL中的= nullis null不一样

但是,为什么

update table 
set column = null

有效的 SQL 语句(至少在 Oracle 中)?

从那个 answer,我知道 null 可以被看作是某种 "UNKNOWN",因此 sql-statement with where column = null "should" return 所有行,因为 column 的值不再是未知值。我明确地将其设置为 null ;)

我哪里错了/没看懂?

所以,如果我的问题可能不清楚: 为什么 = nullset 子句中有效,但在 SQL 语句的 where 子句中无效?

它们完全不同的运算符,即使您以相同的方式编写它们也是如此。

  • 在 where 子句中,是 比较运算符
  • 在集合中,是一个赋值运算符

赋值运算符允许 "clear" 列中的数据并将其设置为 "null value" .

在 set 子句中,您将值分配给由 NULL 定义的未知数。在 where 子句中,您正在查询一个未知数。当你不知道未知数是什么时,你就不能指望它有任何结果。

SQL 没有像 or 等语言那样的赋值和相等运算符的不同图形符号。在这些语言中,= 赋值运算符 ,而 == 相等运算符 。在 SQL 中,= 用于两种情况,并根据上下文进行解释。

where 子句中,= 充当相等运算符(类似于C 中的==)。即,它检查两个操作数是否相等,如果相等,则 returns true。正如您提到的,null 不是一个值——它是缺少一个值。因此,它不能等于任何其他值。

set子句中,=充当赋值运算符(类似于C中的=)。即,它将左操作数(列名)设置为右操作数的值。这是一个完全合法的声明——您声明您不知道某个列的值。