我已经创建了一个足球数据库,现在需要进行一些查询,但需要一些建议:
所以4张表:
-
玩家
-
经理
-
匹配
-
团队
需要提取显示的结果:
前100名进球者
球员(姓名(|球队(名称(|比赛(进球(|经理(姓名(
如果:,代码会是什么样子
-
玩家表包含playerid,managerid,teamid
-
管理者包含:managerid,名称
-
Matches包含比赛ID,球员ID,进球
-
团队包含:团队ID,名称
现在我有一些单独的东西,行:
"SELECT players.name, teams.name, matches.goals, managers.name
FROM players
INNER JOIN ????
ORDER BY matches.goals";
那么,假设其他一切都是正确的,我应该在INNER JOIN中放入什么呢?
谢谢!
使用INNER JOIN
连接表ON
匹配键中的行。
- 每个
JOIN
组合两个表的记录 ON
指定应匹配的列INNER
表示,仅在记录匹配的情况下加入
使用GROUP BY
对所选(加入的(记录进行分组(聚合(。
- 列出了应分组的所有列(仅结果中的不同值(
- 在选择列表中,可以使用聚合函数指定可选的聚集列,如
SUM(goals)
将列goals
聚合为总和
具有列(-list(和方向的ORDER BY
对结果集进行排序(在限制之前(。
最后,LIMIT
关键字后面跟着数量的结果会剪切结果集(适用于TOP x查询(。您可能会在下面格式化的SQL代码中发现缺少语法高亮显示。这是因为这个限制性关键字不是ANSI-SQL标准的一部分。
SELECT
player.name as player,
team.name as team,
manager.name as manager,
SUM(match.goals) as scored_goals
FROM Matches match
INNER JOIN Players player ON match.playerid = player.playerid
INNER JOIN Managers manager ON player.managerid = manager.managerid
INNER JOIN Teams team ON player.teamid = team.teamid
ORDER BY match.goals DESC
GROUP BY player.name, team.name, manager.name
LIMIT 100;
注意:总scored_goals
是特定组合的所有进球之和,即给定球员在给定教练的带领下与给定球队一起进球。
我为这些列添加了带有as
的别名(否则,您可能会在输出中看到多个标记不明确的列name
(。
您可以加入、聚合或只是加入,并使用子查询来计算目标:
select p.name as player_name, t.name as team_name, m.name as manager_name,
(select sum(g.goals) from matches g where g.playerid = p.playerid) cnt_goals
from players p
inner join managers m on m.managerid = p.managerid
inner join teams t on t.teamid = p.teamid
order by cnt_goals desc limit 100
SELECT P.name,
T.name,
MA.goals,
M.name
FROM matches MA
INNER JOIN players P
ON MA.playerid = P.playerid
INNER JOIN managers M
ON P.managerid = M.managerid
INNER JOIN teams T
ON P.teamid = T.teamid
ORDER BY MA.goals DESC
LIMIT 100;