繁体   English   中英

在SQL中使用聚合函数时,是否会选择关联的列?

[英]When using an aggregate function in SQL, will the associated columns be selected?

我有以下查询

SELECT
  day,
  category_id,
  name,
  qval
  MIN(CONCAT(category_id, qval))
FROM facts
WHERE
  day = CURDATE()
GROUP BY
  category_id

选择的name将始终是与所标识的MIN记录相关联的name吗?

绝对不。 没有理由期望情况会如此。 这是您的查询:

SELECT day, category_id, name, qval
       MIN(CONCAT(category_id, qval))
FROM facts
WHERE day = CURDATE()
GROUP BY category_id;

尽管没有这样标识,但该语法是MySQL。 您使用的是MySQL扩展,因为select中有一些列不是聚合函数的参数,也不在group by 这些值来自任意行。 以下是有关扩展名使用的一些相关文档

MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。 这意味着前面的查询在MySQL中是合法的。 您可以使用此功能来避免不必要的列排序和分组,从而获得更好的性能。 但是,这主要在每个未聚合列中未在GROUP BY中命名的所有值对于每个组都相同时才有用。 服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。

我相信此问题已在MySQL 5.7中解决,因为5.7检测到功能依赖性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM