关于MySQL中的以下行为,我有一个非常基本的问题。
假设我们执行以下GROUP BY
SELECT a, b, SUM(c)
FROM table
GROUP BY b;字段a发生了什么,它既不是聚合的,也不是包含在GROUP BY字段中的?
MySQL只是隐式地将FIRST(a)应用于a吗?如果是,这种行为是一致的还是从a的所有值中获取一个随机值?
发布于 2015-07-29 10:17:32
它是查询处理器从存储介质获得的第一个结果值,取决于所选的查询策略。从技术上讲,这是未定义的,但您的表除了它的关键之外没有其他指示符,这是合理的确定性,但您将受优化器的支配。
依靠这个就会有危险。这就是为什么窗口功能被发明的原因。
发布于 2015-07-29 10:23:03
MySQL > 5.7.5
这是非法查询。
您将收到如下错误:
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_byMySQL 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并不影响服务器选择的每个组中的值。
因此,无法确定该值是什么(如果该组有更多的值)。
https://stackoverflow.com/questions/31697469
复制相似问题