-- 这一部分,是查询每一个课程的平均成绩
(SELECT
课程号,
AVG(成绩) AS 平均成绩
FROM
#成绩表 a
GROUP BY
课程号
) AS 平均成绩表
-- 这个是将 平均成绩 与 成绩表 关联.
LEFT JOIN #成绩表
-- 这里是关联条件
-- 课程号匹配. 成绩要大于平均成绩
-- 学生号的条件,是和外面的学生号关联.
ON (平均成绩表.课程号 = #成绩表.课程号
AND 平均成绩表.平均成绩 < #成绩表.成绩
AND #成绩表.学生号 = #学生表.学生号)
这个子查询的结果,就是将每一个学生的成绩,都与平均成绩作比较.
如果成绩 大于 平均成绩,那么 关联结果中,包含 学生号
如果成绩 小于等于平均成绩,那么 关联结果中, 不包含 学生号,也就是那个 学生号的地方,是 NULL
你可以单独执行中间的那段子查询。
SELECT
平均成绩表.课程号,
平均成绩表.平均成绩,
#成绩表.成绩,
#成绩表.学生号
FROM
(SELECT
课程号,
AVG(成绩) AS 平均成绩
FROM
#成绩表 a
GROUP BY
课程号
) AS 平均成绩表
LEFT JOIN #成绩表
ON (平均成绩表.课程号 = #成绩表.课程号
AND 平均成绩表.平均成绩 < #成绩表.成绩
AND #成绩表.学生号 = 1)
当学生号是1,也就是全部都超过平均成绩的,所有数据都显示。
当学生号是其他的数字的时候,不满足条件的,成绩表的部分是 NULL.
那么最后的那个
WHERE
学生号 IS NULL
是和 前面的
NOT EXISTS(
结合起来使用的。
意思就是
不存在有
学生号是 NULL 的数据。
那么就是所有的成绩都超过 平均成绩了。
假如有一门成绩没超过,那么就会存在有 学生号是 NULL 的,那么就不会显示在最后的结果当中。
至于 "难道再没有稍微简单一点的做法吗?"
我想应该是有的,只不过我的水平不高,也就只能写出这个程度的SQL了。