第一种解法(关联子查询+查询过程解析)

先上sql,再分析查询过程

select *
from grade g
where score >(
   select avg(score) from grade where job = g.job group by job
)
order by id;

上述查询语句分为以下几步:

1.首先进行主查询 select * from grade g

由于我们使用where job = g.job为子查询的关联语句,所以会从主查询结果的job值中取出第一个值,假设是'java',通过关联查询语句传入子查询

select avg(score) from grade where job = 'java' group by job

主查询就变成了 select * from grade g where job = 'java' and score>avg(score)

对于'c++'、'js'都是以此类推

关键点:关联子查询会先依靠子查询中的关联语句(where job=g.job),从主查询中选取关联属性的第一个值,然后进入子查询中,将子查询的结果返回给主查询,再判断where条件(where score > ...),依次类推,直到主查询中关联属性的值选取完毕。

第二种方式(构建临时表,并进行连接)

select g.*
from grade g
join (
  select job, avg(score) avg_score
  from grade
  group by job
  ) g2
on g.job = g2.job 
and g.score > g2.score  -- 这里用 where g.socre > g2.score也行
order by id;