【问题标题】:How null is treated using union and union all in mysql?在mysql中使用union和union all如何处理null?
【发布时间】:2018-12-28 09:50:43
【问题描述】:

基于以下陈述

select null
union
select null

上述语句的输出为:

null

虽然此声明:

select null
union all
select null

输出:

null
null

作为null <> null,那么这里如何处理 null 值以及它被认为是哪种数据类型

【问题讨论】:

  • DISTINCTUNIONGROUP BY 在涉及 NULL 相等时使用与is not distinct from 相同的语义
  • 在 SQL Server 中为 int。我不知道这在 MySql 中是否相同。如果你 CREATE TABLE AS SELECT 你会得到什么数据类型?

标签: mysql sql union sql-null


【解决方案1】:

UNION 是一个集合运算符,涉及检查“重复行”。规范将重复行定义为“不不同”。 SQL-92 规范的摘录:

如果有以下任何一个,则称两个值不不同:两者都是空值 值,或者它们根据子条款 8.2 比较相等,““。否则它们是不同的。两行(或部分行) 如果至少一对各自的值是不同的,则它们是不同的 清楚的。否则它们不是不同的。评估结果 两个值或两行是否不同永远是未知的。

(强调我的)。所以,在这个例子中:

select null
union all
select null

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

【讨论】:

    【解决方案2】:

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

    注意: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
    

    【讨论】:

      【解决方案3】:

      我认为您知道 UNION(重复数据删除结果)和 UNION ALL 之间的区别

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-03
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        相关资源
        最近更新 更多