为什么此查询返回带有空值的行

时间:2011-09-25 13:22:54

标签: mysql sql null resultset

比较

SELECT distinct u_id,timestamp as time
FROM my_table;

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

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

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

有人可以向我解释为什么第二个会像它那样行事吗?

2 个答案:

答案 0 :(得分:17)

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;

答案 1 :(得分:0)

这个问题的实际答案很难解释,对我来说无论如何:)标题要点:SQL不支持在关系模型中找到的聚合运算符,而只是支持一个特殊的汇总案例。此外,因为SQL只有一个数据结构 - 表 - SQL聚合操作符调用(松散地说)必须作为某些表表达式的一部分出现,因此为什么第二个表返回一个“虚拟”单行。

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