为什么Mysql的Group By和Oracle的Group by行为不同
我多次发现 Mysql 的 groupBy 功能和 Oracle 的 GroupBy 功能表现不同
很多次我在 Oracle 中发现错误(这实际上是错误的查询)但是 Mysql 会给出结果
那么这个Mysql奇怪的行为背后有什么原因吗
最佳答案
MySQL 设计者将他们的非标准扩展放入 GROUP BY
中,试图使开发更容易,某些查询更高效。
这是他们的理由。
https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
有一种名为 ONLY_FULL_GROUP_BY
的服务器模式可以禁用非标准扩展。您可以使用此语句设置此模式。
SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'
这是该页面的引述,并添加了重点。
If
ONLY_FULL_GROUP_BY
is disabled, a MySQL extension to the standard SQL use ofGROUP BY
permits the select list,HAVING
condition, orORDER BY
list to refer to nonaggregated columns even if the columns are not functionally dependent onGROUP BY
columns... In this case, the server is free to choose any value from each group, so unless they are the same, the values chosen are nondeterministic, which is probably not what you want.
这里的重要词是不确定性。这是什么意思?这意味着随机,但更糟。如果服务器选择随机值,这意味着它将在不同的查询中返回不同的值,因此您有机会在测试软件时发现问题。但在此上下文中,不确定性 意味着服务器每次都选择相同的值,直到它不选择为止。
为什么它会改变它选择的值?服务器升级是一个原因。表大小的变化可能是另一个。关键是,服务器可以自由地返回它想要的任何值。
我希望新学习 SQL 的人设置这种 ONLY_FULL_GROUP_BY
模式;他们将从查询中获得更可预测的结果,并且服务器会拒绝不确定的查询。
关于mysql - 为什么Mysql的Group By和Oracle的Group by行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21679804/