Mysql 为什么这个查询返回一个空的行

Mysql 为什么这个查询返回一个空的行,mysql,sql,null,resultset,Mysql,Sql,Null,Resultset,比较 SELECT distinct u_id,timestamp as time FROM my_table; 及 当我的表完全没有行时(或者如果我添加了一个where子句,该子句不匹配任何行): 前者返回一个空的结果集(这是我所期望的) 而后者则返回一行,该行的两个字段的值均为null 有人能给我解释一下为什么第二个会这样做吗 如果没有匹配的行,MAX()将返回NULL 如果没有数据,那么它只会将这两个值返回为NULL 如果希望第二个查询也返回空的resultset,则必须过滤掉空值,例如

比较

SELECT distinct u_id,timestamp as time
FROM my_table;

当我的表完全没有行时(或者如果我添加了一个where子句,该子句不匹配任何行):

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


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

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

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

如果希望第二个查询也返回空的resultset,则必须过滤掉空值,例如使用HAVING子句,您可以将其用于聚合函数:

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

对我来说,这个问题的实际答案很难解释:)标题点:SQL不支持关系模型中的聚合运算符,而只是支持一种特殊的摘要。此外,由于SQL只有一个数据结构——表——SQL聚合运算符调用(松散地说)必须作为某个表表达式的一部分出现,因此第二个表返回一个“伪”单行


有关更全面/更好的解释,请参见第7.5节。聚合运算符。

从技术上讲,这只是答案的一半-另一半是第二个答案中没有group by子句,而使用的聚合函数混合了非聚合,这就是u\u id为
NULL的原因
SELECT DISTINCT u_id, MAX(timestamp) as time FROM my_table GROUP BY u_id HAVING time IS NOT NULL;