如何在MySQL中使用union和union all处理null?

时间:2018-12-28 09:50:44

标签: mysql sql null union

基于以下声明

select null
union
select null

以上语句的输出为:

null

这句话:

select null
union all
select null

输出:

null
null

null <> null一样,此处如何处理null值以及将其视为哪种数据类型

3 个答案:

答案 0 :(得分:3)

在标准SQL中,UNION删除重复的记录,UNION ALL不会删除。令人高兴的是,您的RDBMS足够聪明,可以找出NULL IS NULL,并且在使用UNION时可以消除重复的行。

NB:null = nullunknown,但是null <> null也是unknown。检查无效性的唯一方法是使用类似IS NULL的东西。

SELECT case when null <> null then 1 else 0 end;  --> yields : 0
SELECT case when null =  null then 1 else 0 end;  --> yields : 0
SELECT case when null IS null then 1 else 0 end;  --> yields : 1

答案 1 :(得分:2)

UNION是集合运算符,涉及检查“重复行”。规范将重复的行定义为“不是唯一的”,并区分为:

  

如果有两个值,则说两个值不是唯一的:均为空   值,或者根据第8.2节“ <比较   谓词>“。否则它们是不同的。两行(或部分行)   如果它们各自的值对中至少有一个是   不同。否则,它们并没有区别。评价结果   两个值或两行是否不同永远是未知的。

(重点是我的)。因此,在此示例中:

select null
union all
select null

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

答案 2 :(得分:0)

我正在考虑您知道UNION(重复数据删除)和UNION ALL之间的区别

select 'x' from dual where null is null \\results with x 

在这种情况下,null实际上是null。这意味着联合会返回正确的结果(重复数据删除)