GROUP BY 列名而不在 SELECT 列表中选择它

shr*_*e18 5 mysql sql aggregate-functions

SELECT person
FROM person
INNER JOIN collectionmember ON sourceobjectid = personid
GROUP BY sourceobjectid 
HAVING COUNT(sourceobjectid) > 1;
Run Code Online (Sandbox Code Playgroud)

据说如果我们使用GROUP BY子句,GROUP BY列名必须在SELECT column列表中。但上面的查询无需选择即可工作sourceobjectid

这个查询是如何工作的?

Gor*_*off 3

结果不是遇到的第一行。MySQL对于所谓“隐藏列”的使用非常清楚。引用文档

MySQL 扩展了 GROUP BY 的使用,以便选择列表可以引用未在 GROUP BY 子句中命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以使用此功能避免不必要的列排序和分组,从而获得更好的性能。然而,这主要是当每个组中未在 GROUP BY 中命名的每个非聚合列中的所有值对于每个组都相同时非常有用。服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则所选择的值是不确定的。此外,添加 ORDER BY 子句不会影响每个组中值的选择。结果集的排序发生在选择值之后,并且 ORDER BY 不会影响服务器选择每个组中的哪些值。

此扩展的目的是允许对表的主键进行分组查询,而不必放入所有附加列。这种行为实际上符合 ANSI 标准。

在其他情况下使用“隐藏列”是值得怀疑的。所选择的值是任意的。MySQL 甚至不保证它们来自同一行(尽管实际上是这样)。