到表的链接在这里给出: http://sqlzoo.net/wiki/The_JOIN_operation
问题编号:-其中11个
对于每一次涉及“ POL”的比赛,请显示比赛编号,日期和进球数。
当我的查询是:-
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
我的回答是正确的。
问题:-我在堆栈溢出的某个地方读到,按功能分组需要在select语句中编写的所有内容。 但是为什么count(player)没有包含在GROUP BY子句中?
答案 0 :(得分:1)
当您使用GROUP BY时,对于SQL而言意味着您想要的是GROUP BY中列出的字段的唯一组合。
然后您可以选择这些字段,而不必使用它们,例如COUNT,MAX,MIN,SUM,AVG等聚合函数。
但是该规则也可以相反。
例如此查询。
SELECT x, y, MAX(z)
FROM foo
GROUP BY x
查询要根据GROUP BY获得唯一的x。
但是对于x应该显示什么y?值是“ bar1”还是“ bar2”的那个?
MAX(z)
不必在GROUP BY中,因为它是一个聚合函数。
该函数的返回值甚至取决于GROUP BY中的哪些字段。
如果这是SQL,它将确定要为y显示什么
SELECT x, MIN(y), AVG(z)
FROM foo
GROUP BY x
因此,这就是为什么如果您在不使用聚合函数的情况下选择x和y,则至少在大多数数据库中,x和y都必须位于GROUP BY中。这是SQL92标准。
MySql可以更宽容地对待该规则。
如果编码人员知道他们在做什么,那通常很好。但也可能导致误导结果。
但是该测试站点显然不允许其MySql接受GROUP BY中的缺失字段。
答案 1 :(得分:0)
为什么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
如果您未在GROUP BY
子句中指定非聚合列的列名,则聚合函数对于SQL引擎来说是未知的,它将为该类型的列返回哪个值。