为什么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(使用前将#替换为@)