MySQL 中 union/union all 中如何处理空值?

ash*_*ish 3 mysql sql union sql-null

基于以下声明

select null
union
select null
Run Code Online (Sandbox Code Playgroud)

上述语句的输出是:

null
Run Code Online (Sandbox Code Playgroud)

虽然这个声明:

select null
union all
select null
Run Code Online (Sandbox Code Playgroud)

输出:

null
null
Run Code Online (Sandbox Code Playgroud)

那么null <> null这里如何处理 null 值以及在哪种数据类型中考虑它?

Sal*_*n A 5

在 SQL 中:

  • UNION是一个集合运算符,涉及检查(并抑制)重复行
  • 重复行被定义为不不同的行
  • 不同(值或行)定义为:

如果两个值都为空值,或者根据第 8.2 节“<比较谓词>”,它们比较相等,则称两个值不不同。否则它们是不同的。如果两行(或部分行)至少一对各自的值不同,则它们是不同的。否则它们就没有区别。评估两个值或两行是否不同的结果永远是未知的。

(以上是 SQL-92 规范的摘录,重点是我的)。所以,在这个例子中:

select null
union all
select null
Run Code Online (Sandbox Code Playgroud)

这两行被认为是彼此重复的,因为第一列中的空值被认为是不不同的......即相同。根据定义,UNION仅返回一组重复行中的一行。