【问题标题】:why does this query return a row with nulls为什么此查询返回带有空值的行
【发布时间】:2011-11-24 15:16:54
【问题描述】:

比较

SELECT distinct u_id,timestamp as time
FROM my_table;

SELECT distinct u_id,max(timestamp) as time
FROM my_table;

当我的表根本没有行时(或者如果我添加了一个不匹配行的 where 子句):

前者返回一个空的结果集(这是我所期望的) 而后者返回一行,其两个字段的值都为 null。

有人能解释一下为什么第二个会这样吗?

【问题讨论】:

    标签: mysql sql null resultset


    【解决方案1】:

    MySQL 文档说

    如果没有匹配的行,MAX() 返回 NULL。

    如果您没有数据,那么它只会将两个值都返回为 NULL。

    如果您希望第二个查询也返回空结果集,那么您必须过滤掉 NULL 值,例如可以与聚合函数一起使用的 HAVING 子句:

    SELECT DISTINCT u_id, MAX(timestamp) as time FROM my_table GROUP BY u_id HAVING time IS NOT NULL;
    

    【讨论】:

    • 从技术上讲,这只是答案的一半——另一半是在使用与非聚合混合的聚合函数时第二个中没有 group-by 子句,这就是为什么 u_id 是 NULL
    【解决方案2】:

    这个问题的实际答案解释起来相当复杂,无论如何对我来说 :) 标题点:SQL 不支持关系模型中的聚合运算符,而仅支持汇总的特殊情况。此外,由于 SQL 只有一种数据结构——表——SQL 聚合运算符调用(松散地说)必须作为某些表表达式的一部分出现,因此为什么您的第二个表返回“虚拟”单行。

    有关更全面/更好的解释,请参阅SQL and Relational Theory: How to Accurate SQL Code - C. J. Date (2009),第 7.5 节。聚合运算符。

    【讨论】:

      猜你喜欢
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2021-04-29
      • 2014-01-26
      • 2023-04-05
      • 1970-01-01
      • 2021-10-26
      相关资源
      最近更新 更多