group by子句列名,而不在选择列表中选择它

时间:2013-08-27 11:46:27

标签: mysql sql

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

据说如果我们使用group by子句,按列名称的组必须在选择列列表中,但上面的查询无需选择sourceobjectid。这个查询是否有效?

2 个答案:

答案 0 :(得分:2)

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

  

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

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

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

答案 1 :(得分:1)

MySQL数据库需要此行为。它允许在select子句中放入任何列。您的示例的结果将为每个组提供第一个*。

*什么是拳排取决于很多事情。