2011-09-25 109 views
8

比较为什么该查询返回与空

SELECT distinct u_id,timestamp as time 
FROM my_table; 

和行

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

当我的表有完全没有行(或者如果我添加一个where没有匹配行条款):

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

有人可以向我解释第二个人为什么会这样做?

回答

16

MySQL文档说,如果没有匹配的行

MAX()返回NULL。

如果你没有数据,那么它只是返回NULL值。

如果你想在第二个查询返回空结果也一样,那么你必须过滤掉例如NULL值与具有可与聚合函数使用条款:

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节。集合运算符。