这道题目要求我们从成绩表中查询出每个用户的分数大于其所在岗位平均分的记录,我们要做的事情如下:
1. 确定总体问题
目标是查询出每个用户的分数大于其所在岗位平均分的记录,并按用户ID升序排序。我们需要从成绩表中提取数据,计算每个岗位的平均分数,然后筛选出分数高于平均分的记录。
2. 分析关键问题
- 计算岗位平均分:使用
AVG
函数计算每个岗位的平均分数。 - 筛选高于平均分的记录:通过
JOIN
和WHERE
子句筛选出分数高于平均分的记录。 - 排序输出:按用户ID升序排列输出结果。
3. 解决每个关键问题的代码及讲解
步骤1:计算岗位平均分
我们使用AVG
函数计算每个岗位的平均分数:
select
job,
avg(score) as score
...
group by
job
AVG(score) AS score
: 计算每个岗位的平均分数。GROUP BY job
: 按岗位分组计算平均分数。
步骤2:筛选高于平均分的记录
我们通过JOIN
和WHERE
子句筛选出分数高于平均分的记录:
select
g.id,
g.job,
g.score
from
grade g
join (
...
) s on s.job = g.job
where
g.score > s.score
JOIN
: 将岗位平均分与成绩表连接。WHERE g.score > s.score
: 筛选出分数高于平均分的记录。
步骤3:排序输出
我们按用户ID升序排列输出结果:
order by
g.id asc
ORDER BY g.id ASC
: 按用户ID升序排列。
完整代码
select
g.id,
g.job,
g.score
from
grade g
join (
select
job,
avg(score) as score
from
grade
group by
job
) s on s.job = g.job
where
g.score > s.score
order by
g.id asc;