表格链接如下:http://sqlzoo.net/wiki/the_join_operation
第11题
对于每场涉及“pol”的比赛,显示比赛ID、日期和进球数。
当我的查询是:-
SELECT matchid, mdate, count(player)
FROM game join goal on id = matchid
WHERE (team1 = 'POL' or team2 = 'POL')
GROUP BY matchid
本例中的错误。
但当我的问题是:-
SELECT matchid, mdate, count(player)
FROM game join goal on id = matchid
WHERE (team1 = 'POL' or team2 = 'POL')
GROUP BY matchid, mdate
我的回答是对的。
问题:-我在堆栈溢出的某个地方读到,groupby函数需要select语句中写入的所有内容。但是为什么count(player)不包含在groupby子句中呢?
2条答案
按热度按时间xwbd5t1u1#
为什么count(player)不包含在group by子句中?
因为
count(player)
聚合函数不需要添加吗group by
使用聚合函数时,需要在中添加非聚合列GROUP BY
条款。在这个例子中
count
是聚合函数。您需要添加matchid
以及mdate
中的列GROUP BY
```SELECT matchid, mdate, count(player)
FROM game join goal on id = matchid
WHERE (team1 = 'POL' or team2 = 'POL')
GROUP BY matchid, mdate
h7appiyu2#
当您按分组时,它对sql的意义是您需要分组方式中列出的字段的唯一组合。
然后您可以选择这些字段,而不必使用诸如count、max、min、sum、avg等聚合函数。。。
但这一规则也起相反的作用。
例如,此查询。
查询需要根据groupby得到唯一的x。
但是对于x,y应该显示什么呢?值为“bar1”或“bar2”的那个?
这个
MAX(z)
不必在groupby中,因为它是一个聚合函数。这种函数的返回值甚至取决于groupby中的字段。
如果这是sql,它肯定知道要为y显示什么
所以这就是为什么至少在大多数数据库中,如果不使用聚合函数选择x和y,它们就必须在group by中。这是sql92标准。
mysql可以更宽容地对待这个规则。
如果编码人员知道他们在做什么,这是很好的。但也可能导致误导性结果。
但是这个测试站点显然不允许mysql接受groupby中缺少的字段。