Kri*_*ris 3 mysql aggregate-functions
我对 MySQL 中的以下行为有一个非常基本的问题。
假设我们执行以下操作GROUP BY:
SELECT a, b, SUM(c)
FROM table
GROUP BY b;
Run Code Online (Sandbox Code Playgroud)
发生了什么领域a,这既不是聚集也不是包含在GROUP BY字段?
MySQL 是否只是隐式适用FIRST(a)于a?如果是这样,这种行为是一致的还是从 的所有值中获取一个随机值a?
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_by
Run Code Online (Sandbox Code Playgroud)
MySQL 5.7.5 及更高版本实现了功能依赖检测。如果
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 处理 GROUP BY 在标准 SQL 中,包含 GROUP BY 子句的查询不能引用选择列表中未在 GROUP BY 子句中命名的非聚合列。例如,这个查询在标准 SQL 中是非法的,因为 select 列表中的 name 列没有出现在 GROUP BY 中:
Run Code Online (Sandbox Code Playgroud)SELECT o.custid, c.name, MAX(o.payment) FROM orders AS o, customers AS c WHERE o.custid = c.custid GROUP BY o.custid;要使查询合法,名称列必须从选择列表中省略或在 GROUP BY 子句中命名。
MySQL 扩展了 GROUP BY 的使用,以便选择列表可以引用未在 GROUP BY 子句中命名的非聚合列。这意味着前面的查询在 MySQL 中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在未在 GROUP BY 中命名的每个非聚合列中的所有值对于每个组都相同时很有用。服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则选择的值是不确定的。此外,添加 ORDER BY 子句不会影响从每个组中选择值。结果集的排序发生在选择值之后,并且 ORDER BY 不影响服务器选择每个组中的哪些值。
因此无法确定该值是多少(如果该组有更多值)