select id,guid,max(dataTime) from Data where id > 100 group by guid order by dataTime desc;
执行步骤:
1、执行where条件,得到原始查询结果;
2、执行group by,通过group by字段对原始结果进行分组,每个分组生成为一行;
3、执行max,对每个分组各自执行聚合函数max,也是生成为一行,这一行不一定与group by默认生成的那一行一致,因为group by默认生成的那一行不一定是max行;
4、执行order by,order by是对最终的结果在呈现给用户之前,进行了排序,也就是说它是最后一个动作,因此,max(dataTime)并不会受order by dataTime是asc还是desc的影响;
备忘:
1、注意,max类似avg,也是聚合函数,它会使得查询结果只返回一行,在上面的例子中由于有group by本身已经只返回一行,所以max的效果看不出来。
2、对max的理解尤其不要误解,它是对where条件取得的结果基础上再取max,并不是先于where执行,因此它不会导致总是取得整个表的最max的那条记录。
补:
1、取max行的那一行内容。注意,select max(pid), * from mytable,pid一定是最大行的,但其它列不一定是pid最大行的。正确的方法是:
select n.* from mytable n join (select max(pid) as id from mytable) m on n.pid = m.id;