首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:组上的非聚合字段会发生什么情况呢?

问MySQL:组上的非聚合字段会发生什么情况呢?
EN

Stack Overflow用户
提问于 2015-07-29 10:11:36
回答 2查看 1.4K关注 0票数 3

关于MySQL中的以下行为,我有一个非常基本的问题。

假设我们执行以下GROUP BY

代码语言:javascript
复制
SELECT a, b, SUM(c)
FROM table
GROUP BY b;

字段a发生了什么,它既不是聚合的,也不是包含在GROUP BY字段中的?

MySQL只是隐式地将FIRST(a)应用于a吗?如果是,这种行为是一致的还是从a的所有值中获取一个随机值?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-29 10:17:32

它是查询处理器从存储介质获得的第一个结果值,取决于所选的查询策略。从技术上讲,这是未定义的,但您的表除了它的关键之外没有其他指示符,这是合理的确定性,但您将受优化器的支配。

依靠这个就会有危险。这就是为什么窗口功能被发明的原因。

票数 2
EN

Stack Overflow用户

发布于 2015-07-29 10:23:03

MySQL > 5.7.5

这是非法查询。

您将收到如下错误:

代码语言:javascript
复制
ERROR 1055 (42000): Expression #1 of SELECT list is not in 
GROUP BY clause and contains nonaggregated column 'a' 
which is not functionally dependent on columns in 
GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

MySQL 5.7.5和up实现了功能依赖的检测。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下是这种模式),则MySQL拒绝选择列表、HAVING条件或ORDER BY列表引用非聚合列的查询,这些列既不是在GROUP BY子句中命名,也不是在功能上依赖于它们。

关于https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html的更多细节

MySQL < 5.7.5

这是一个有效的查询,但是服务器可以自由地返回任何值

阅读此https://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html显示:

12.16.3 MySQL在标准SQL中处理GROUP BY,包含GROUP子句的查询不能引用select列表中未在GROUP子句中命名的非聚合列。例如,此查询在标准SQL中是非法的,因为“选择列表”中的“名称”列不显示在组中: 从订单中选择o.custid、c.name、MAX(o.payment)为o,客户为c,其中o.custid =o.custid的c.custid组; 要使查询合法,必须从select列表中省略name列或在GROUP BY子句中命名。 MySQL扩展了GROUP BY的用法,以便select列表可以引用GROUP BY子句中未命名的非聚合列。这意味着前面的查询在MySQL中是合法的。通过避免不必要的列排序和分组,您可以使用此特性获得更好的性能。但是,当组中未命名的每个非聚合列中的所有值对于每个组都相同时,这主要是有用的。服务器可以自由地从每个组中选择任何值,因此,除非它们是相同的,否则所选择的值是不确定的。此外,添加ORDER子句不会影响每个组的值选择。结果集的排序是在选择了值之后进行的,而ORDER并不影响服务器选择的每个组中的值。

因此,无法确定该值是什么(如果该组有更多的值)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31697469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档