有三个表:学生表(学生号,姓名,性别,年龄)
课程表(课程号,课程名,)
成绩表(学生号,课程号,成绩)
要检索各科成绩均大于等于该科平均成绩的学生的学号和姓名
感觉比较难,希望您可以帮到我!分不多,别见外哦,呵呵呵
求甚解,我只能“谨慎”的说您这个在我的表中是正确的,因为我看不怎么懂这个:
WHERE 学生号 IS NULL
难道再没有稍微简单一点的做法吗?
-- 这一部分,是查询每一个课程的平均成绩
(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了。