一尘不染

按子句列名分组,而不在选择列表中选择

sql

select person
from person
inner join collectionmember
    on sourceobjectid=personid
group by sourceobjectid 
having count(sourceobjectid)>1;

据说如果使用group by子句,则select列列表中必须存在group by列名,但是上面的查询不需要选择sourceobjectid。


阅读 168

收藏
2021-03-08

共1个答案

一尘不染

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

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

此扩展的目的是允许查询在表的主键上进行分组的位置,而不必放在所有其他列中。此行为实际上与ANSI标准一致。

在其他情况下,可能会使用“隐藏列”。选择的值是 任意的 。MySQL甚至不保证它们来自同一行(尽管实际上,它们确实来自同一行)。

2021-03-08