为什么Mysql的Group By和Oracle的Group by行为不同

2024-05-08

为什么Mysql的Group By和Oracle的Group by行为不同

我多次发现 Mysql group By 功能和 Oracle 的 GroupBy 功能表现不同

很多时候我在Oracle中发现错误(这实际上是错误的查询)但是Mysql会给出结果

那么这个 Mysql 奇怪的行为背后有什么原因吗?


MySQL 设计者将他们的非标准扩展添加到GROUP BY试图使开发更容易并使某些查询更有效。

这是他们的理由。

https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html 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被禁用,MySQL 对标准 SQL 使用的扩展GROUP BY允许选择列表,HAVING条件,或ORDER BY列表引用非聚合列,即使这些列在功能上不依赖于GROUP BY列...在这种情况下,服务器是从每组中自由选择任何值,因此除非它们相同,否则选择的值是不确定性的,这可能不是您想要的。

这里重要的词是不确定的。这意味着什么?它的意思是随机的,但更糟。如果服务器选择随机值,这意味着它将在不同的查询中返回不同的值,因此您在测试软件时有机会发现问题。但不确定性的在这种情况下意味着服务器每次都选择相同的值,直到它不再出现为止。

为什么它会改变它选择的值?服务器升级是原因之一。桌子大小的改变可能是另一个原因。关键是,服务器可以自由地返回它想要的任何值。

我希望新学习 SQL 的人能这样设置ONLY_FULL_GROUP_BY模式;他们将从查询中获得更可预测的结果,并且服务器将拒绝不确定性查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Mysql的Group By和Oracle的Group by行为不同 的相关文章