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

标签 mysql sql oracle group-by aggregate-functions

为什么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 of GROUP BY permits the select list, HAVING condition, or ORDER BY list to refer to nonaggregated columns even if the columns are not functionally dependent on GROUP 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/

相关文章:

sql - 添加新列到现有表中

sql - 显示最后一天每小时创建的行数,未创建行时计数为 0

javascript - 使用 AJAX 和 ORACLE 和 JSP 填充下拉列表(选择),而不使用 php

mysql - 我的查询重复记录

sql - SQL命令在动态sql查询oracle中未正确结束?

php - 给定尺寸的所有矩形的搜索矩阵(选择座位 block )

sql - 从字符串转换日期和/或时间时转换失败

php - 加入MYSQL和PHP

mysql - 当我克隆一个 mysql 数据库时,在各个表上设置了 data_directory,克隆的表作为文件存储在哪里?

mysql - 最佳 MySQL 表结构 : 2 Parents, 1 Child