这道题目要求我们从成绩表中查询出每个用户的分数大于其所在岗位平均分的记录,我们要做的事情如下:

1. 确定总体问题

目标是查询出每个用户的分数大于其所在岗位平均分的记录,并按用户ID升序排序。我们需要从成绩表中提取数据,计算每个岗位的平均分数,然后筛选出分数高于平均分的记录。

2. 分析关键问题

  • 计算岗位平均分:使用AVG函数计算每个岗位的平均分数。
  • 筛选高于平均分的记录:通过JOINWHERE子句筛选出分数高于平均分的记录。
  • 排序输出:按用户ID升序排列输出结果。

3. 解决每个关键问题的代码及讲解

步骤1:计算岗位平均分

我们使用AVG函数计算每个岗位的平均分数:

select
    job,
    avg(score) as score
...
group by
    job
  • AVG(score) AS score: 计算每个岗位的平均分数。
  • GROUP BY job: 按岗位分组计算平均分数。
步骤2:筛选高于平均分的记录

我们通过JOINWHERE子句筛选出分数高于平均分的记录:

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;