2016-02-26 183 views
1

在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允许这种奇怪的行为?

+2

它并不决定它只是为Y返回一个随机值。对于这种畸变,Mysql在数据库提供程序中是唯一的。5.7 AFAIK http://dev.mysql.com/doc/refman/5.7/en/sql- mode.html#sqlmode_only_full_group_by将默认启用,结束此行为。 – Mihai

+0

您希望退还X&Y的什么价值? – PaulF

+0

@Mihai mysql在这方面并不是那么独特,sybase也有这个功能,在某些情况下,即使是teradata也支持它。 – Shadow

回答

1

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

正如@Mihai已经在他的评论中指出,MySQL有only full group by sql mode管辖是否

许可证查询要求选择列表,HAVING条件,或ORDER BY 列表,请参阅既不非聚合列在GROUP BY子句中命名为 ,在功能上依赖于GROUP BY列(由唯一确定的 )。

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

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

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

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

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

Transact-SQL扩展至基团通过和具有

Transact-SQL扩展到标准SQL化妆显示数据更 灵活,通过允许列和不用于创建组的 表达式引用或摘要计算:

包含聚合的选择列表可以包含不是集合函数参数的扩展列,也不是包含在group by子句中的 。由于显示了更多的行,所以扩展列会影响最终结果的显示结果 。

它的行为与mysql的不同。