假设有学生-选课数据库,其中有学生表,课程表,教师表,选课表,其结构如下: 学生(学号,姓名,专业,入学年份),课程(课程号,课程名,学分),选课(学号,课程号,成绩)。一门课程可以被多名学生选修,一名学生可以选修多门课程。请根据以上信息,实现下列功能: 1)任意给定一门课程号,统计其成绩分布,如:最高分,最低分,平均分,各分数段人数;(课程号由用户在程序运行过程中指定,放在主变量中) 2)如果选课表中某位同学某门课程的成绩更新了,系统能自动更新1)中的统计分析数据;(学号和课程号由用户在程序运行过程中指定,放在主变量中) 3)如果学生表中数据有更新,如:有学生退学或插班,请自动更新选课表,并将这两个表中有变化的数据加以保存。
时间: 2023-10-08 12:12:49 浏览: 89
好的,针对您的问题和需求,我可以给您提供以下解决方案:
1)任意给定一门课程号,统计其成绩分布,如:最高分,最低分,平均分,各分数段人数;(课程号由用户在程序运行过程中指定,放在主变量中)
您可以使用以下 SQL 语句实现:
```
SELECT
MAX(选课.成绩) AS 最高分,
MIN(选课.成绩) AS 最低分,
AVG(选课.成绩) AS 平均分,
COUNT(CASE WHEN 选课.成绩 BETWEEN 90 AND 100 THEN 1 END) AS '90-100',
COUNT(CASE WHEN 选课.成绩 BETWEEN 80 AND 89 THEN 1 END) AS '80-89',
COUNT(CASE WHEN 选课.成绩 BETWEEN 70 AND 79 THEN 1 END) AS '70-79',
COUNT(CASE WHEN 选课.成绩 BETWEEN 60 AND 69 THEN 1 END) AS '60-69',
COUNT(CASE WHEN 选课.成绩 < 60 THEN 1 END) AS '不及格'
FROM 选课
WHERE 选课.课程号 = '您输入的课程号';
```
2)如果选课表中某位同学某门课程的成绩更新了,系统能自动更新1)中的统计分析数据;(学号和课程号由用户在程序运行过程中指定,放在主变量中)
您可以使用以下 SQL 语句实现:
```
UPDATE 选课
SET 选课.成绩 = '您输入的成绩'
WHERE 选课.学号 = '您输入的学号' AND 选课.课程号 = '您输入的课程号';
-- 更新1)中的统计分析数据
SELECT
MAX(选课.成绩) AS 最高分,
MIN(选课.成绩) AS 最低分,
AVG(选课.成绩) AS 平均分,
COUNT(CASE WHEN 选课.成绩 BETWEEN 90 AND 100 THEN 1 END) AS '90-100',
COUNT(CASE WHEN 选课.成绩 BETWEEN 80 AND 89 THEN 1 END) AS '80-89',
COUNT(CASE WHEN 选课.成绩 BETWEEN 70 AND 79 THEN 1 END) AS '70-79',
COUNT(CASE WHEN 选课.成绩 BETWEEN 60 AND 69 THEN 1 END) AS '60-69',
COUNT(CASE WHEN 选课.成绩 < 60 THEN 1 END) AS '不及格'
FROM 选课
WHERE 选课.课程号 = '您输入的课程号';
```
3)如果学生表中数据有更新,如:有学生退学或插班,请自动更新选课表,并将这两个表中有变化的数据加以保存。
您可以使用触发器(Trigger)实现学生表更新时自动更新选课表的操作,可以使用以下 SQL 语句实现:
```
CREATE TRIGGER 学生表更新触发器
AFTER UPDATE ON 学生
FOR EACH ROW
BEGIN
-- 如果学生状态变为“退学”,则删除该学生的选课记录
IF NEW.学生状态 = '退学' THEN
DELETE FROM 选课 WHERE 学号 = NEW.学号;
END IF;
-- 如果学生入学年份发生变化,则更新选课表中的学生入学年份
IF NEW.入学年份 <> OLD.入学年份 THEN
UPDATE 选课 SET 入学年份 = NEW.入学年份 WHERE 学号 = NEW.学号;
END IF;
END;
```
至于将有变化的数据加以保存,您可以使用事务(Transaction)来保证操作的原子性,即要么全部操作成功,要么全部操作失败。例如:
```
BEGIN TRANSACTION;
-- 执行学生表更新操作
UPDATE 学生 SET 学生状态 = '退学' WHERE 学号 = '您输入的学号';
-- 执行选课表更新操作
DELETE FROM 选课 WHERE 学号 = '您输入的学号';
-- 提交事务
COMMIT;
```
这样,就可以保证学生表和选课表中的数据是一致的。
阅读全文