求解: sql 数据库 检索各科成绩均大于等于该科平均成绩的学生的学号和姓名

2024-12-06 05:48:36
推荐回答(3个)
回答1:

CREATE TABLE #学生表(
学生号 INT,
姓名 VARCHAR(10),
性别 VARCHAR(2),
年龄 INT
);

CREATE TABLE #课程表 (
课程号 INT,
课程名 VARCHAR(10)
);

CREATE TABLE #成绩表(
学生号 INT,
课程号 INT,
成绩 INT
);

INSERT INTO #学生表
SELECT 1, '张三', '男', 16 UNION ALL
SELECT 2, '李四', '男', 17 UNION ALL
SELECT 3, '王五', '女', 16 UNION ALL
SELECT 4, '赵六', '女', 17 UNION ALL
SELECT 5, '田七', '女', 18
;

INSERT INTO #课程表
SELECT 1, '语文' UNION ALL
SELECT 2, '数学' UNION ALL
SELECT 3, '外语'
;

-- 张三全部 超过平均。
-- 李四全部 低于平均。
-- 王五 赵六 部分高于,部分低于
-- 田七 少考一门,其它超过平均
INSERT INTO #成绩表
SELECT 1, 1, 85 UNION ALL
SELECT 1, 2, 85 UNION ALL
SELECT 1, 3, 85 UNION ALL
SELECT 2, 1, 75 UNION ALL
SELECT 2, 2, 75 UNION ALL
SELECT 2, 3, 75 UNION ALL
SELECT 3, 1, 85 UNION ALL
SELECT 3, 2, 75 UNION ALL
SELECT 3, 3, 85 UNION ALL
SELECT 4, 1, 75 UNION ALL
SELECT 4, 2, 85 UNION ALL
SELECT 4, 3, 75 UNION ALL
SELECT 5, 1, 83 UNION ALL
SELECT 5, 2, 83
;

SELECT
#学生表.学生号,
#学生表.姓名
FROM
#学生表
WHERE
NOT EXISTS(
SELECT
1
FROM
(
SELECT
课程号,
AVG(成绩) AS 平均成绩
FROM
#成绩表 a
GROUP BY
课程号
) AS 平均成绩表
LEFT JOIN #成绩表
ON (平均成绩表.课程号 = #成绩表.课程号
AND 平均成绩表.平均成绩 < #成绩表.成绩
AND #成绩表.学生号 = #学生表.学生号)
WHERE
学生号 IS NULL
);

学生号 姓名
----------- ----------
1 张三

(1 行受影响)

回答2:

select 学生号,姓名 from (
select a.学生号,a.课程号,b.姓名,a.成绩 from 成绩表 a,学生表 b,课程表 c
where a.学生号=b.学生号 and a.课程号=c.课程号
and EXISTS
(select * from 成绩表
where 学生号=a.学生号
and 课程号=a.课程号
and 成绩>(select avg(成绩) from 成绩表 where 课程号=a.课程号
)
)
) t
group by 学生号,姓名
having count(*)=(select count(*) from 成绩表 where 学生号=t.学生号)

回答3:

select 学生号,姓名 from 学生表 as a,课程表 as b,成绩表 as c
where a.学生号= c.学生号 and b.课程号=c.课程号 and c。成绩>= (select avg(成绩) from 成绩表)

不知道看的懂不? 没试,不过应该可以。