为什么这个查询返回了带有空值的行?

8
比较
SELECT distinct u_id,timestamp as time
FROM my_table;

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

当我的表没有任何行时(或者如果我添加了一个匹配不到任何行的where子句):
前者返回一个空结果集(这是我所期望的), 而后者返回一行,该行的两个字段的值都为null。
有人可以解释一下为什么第二个会这样吗?
2个回答

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;

2
这只是技术上的一半答案 - 另一半是第二个查询中缺少group-by子句,同时使用聚合函数和非聚合函数,这就是为什么u_id为NULL的原因。 - tobyodavies

0

这个问题的实际答案相当复杂,至少对我来说是这样的 :) 主要点:SQL不支持关系模型中发现的聚合运算符,而仅支持一种特殊情况的汇总。此外,由于SQL只有一个数据结构——表格——因此SQL聚合运算符调用(宽泛地说)必须出现在某个表达式的一部分中,这就是为什么你的第二个表返回一个“虚拟”的单行的原因。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接