首页 > 数据库 > mysql教程 > 为什么 MySQL 允许选择不在 GROUP BY 子句中的列?

为什么 MySQL 允许选择不在 GROUP BY 子句中的列?

Susan Sarandon
发布: 2024-12-23 08:40:17
原创
376 人浏览过

Why Does MySQL Allow Selecting Columns Not in the GROUP BY Clause?

选择不包含在 GROUP BY 子句中的列:MySQL 的不明确行为

在 MySQL 中,可以选择不包含在聚合函数或 GROUP BY 中的列子句,这可能会让来自其他 SQL 数据库的程序员感到困惑。此行为偏离 ANSI SQL 标准,该标准要求所有选定的列都成为分组的一部分或出现在聚合函数中。

不明确的查询和任意值选择

当MySQL遇到这样的查询时,它会默默地从每个组的列中返回一个任意值,通常是组中第一行或最后一行的值。此行为可能会导致不明确的结果,特别是当非分组列中的值在每个组内不一致时。

示例查询

考虑以下 MySQL 查询:

SELECT
     AVG(table_name.col1),
     AVG(table_name.col2),
     AVG(table_name.col3),
     table_name.personID,
     table_name.col4
FROM table_name
GROUP BY table_name.personID;
登录后复制

在此查询中,col4 不是 GROUP BY 子句或聚合函数的一部分。 MySQL 将为每个组任意选择一个 col4 值。如果组中的不同行具有不同的 col4 值,这可能会出现问题。

函数依赖性和确定性结果

MySQL 允许在功能正常时选择非分组列取决于 GROUP BY 子句中的列。这意味着对于分组列的每个值,非分组列只有一个可能的值。在这种情况下,查询将返回确定性结果。

但是,需要注意的是,MySQL 对于模糊查询的行为可能会在未来版本中发生变化。因此,建议避免在 SELECT 子句中使用非分组列,除非它们显式包含在 GROUP BY 子句或聚合函数中。

"ONLY_FULL_GROUP_BY" SQL 模式

MySQL 5.7 引入了“ONLY_FULL_GROUP_BY”SQL 模式,该模式强制执行GROUP BY 查询的 ANSI SQL 标准。启用此模式后,选择没有聚合函数的非分组列将导致错误。

以上是为什么 MySQL 允许选择不在 GROUP BY 子句中的列?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板