MySQL聚合函数的奇怪行为

时间:2016-02-26 10:13:01

标签: mysql

在mySQL中,以下作品: 案例1:

Select X , MAX(Y) from table 

但是在MS SQL Server中,你会得到 “它不包含在聚合函数或GROUP BY子句中。”

正确的方法是

Select X, MAX(Y) from table group by X

更糟糕的是,在mySQL中,您可以: 案例2:

Select X, Y, MAX(Z) from table group by X

我的问题是,在上述情况下MySQL如何确定Y? 案例1中的X值怎么样? 为什么MySQL允许这种奇怪的行为?

1 个答案:

答案 0 :(得分:1)

关于group by handling的Mysql文档非常详细地解释了当您使用group by时,mysql在某些配置设置下的行为方式和原因。

正如@Mihai在他的评论中已经指出的那样,mysql有only full group by sql mode来决定是否

  

允许查询选择列表,HAVING条件或ORDER   BY列表指的是既未在其中命名的非聚合列   GROUP BY子句也不依赖于(唯一确定的)   by)GROUP BY专栏。

允许这种语法放宽的原因在于,在许多情况下,表/视图可能包含在功能上依赖于其他字段的字段。简单来说:一个字段的值决定了其他字段的值。使用宽松的语法,您只需要包含确定group by子句中其他字段值的字段。

如果使用宽松语法,但功能依赖性不存在,那么

  

服务器可以自由选择每个组中的任何值,因此除非他们   是相同的,所选择的值是不确定的,这可能是   不是你想要的。

实际上,mysql为扫描数据时遇到的这些字段选择第一个值,因此它不是完全随机的。但是,依赖这个功能有点自杀,因为mysql可以随时改变这种行为而不需要任何通知。

正如我在评论中已经指出的那样,mysql并不是这种方法所独有的。 Sybase also allows this relaxed syntax

  

Transact-SQL扩展以分组和拥有

     

标准SQL的Transact-SQL扩展使得更多地显示数据   灵活,允许引用列和表达式   不用于创建组或汇总计算:

     

包含聚合的选择列表可以包括不是聚合函数参数的扩展列,而不是   包含在group by子句中。扩展列会影响   显示最终结果,因为显示了其他行。

它的行为与mysql的行为不同。