设计一个学生选课系统的数据库系统并完成后台数据库的实现;实现任意给定一门课程号,统计其成绩分布,如:最高分,最低分,平均分,各分数段人数; (尽量用上索引,视图,触发器,存储过程,安全性和完整性也要有所体现)
时间: 2023-12-06 22:03:23 浏览: 78
好的,我可以帮你完成这个更完整的任务。首先,让我们继续之前的设计,添加一些必要的索引和完整性约束。
1. 在学生表中添加唯一索引,以便保证学生的唯一性
```
ALTER TABLE Student ADD UNIQUE INDEX idx_student_name_age (name, age);
```
2. 在课程表中添加唯一索引,以便保证课程的唯一性
```
ALTER TABLE Course ADD UNIQUE INDEX idx_course_name_teacher (name, teacher);
```
3. 在选课表中添加联合索引,以便加快课程分数统计的查询速度
```
ALTER TABLE CourseSelection ADD INDEX idx_course_selection_course_score (course_id, score);
```
4. 在选课表中添加外键约束,以便保证选课信息的完整性
```
ALTER TABLE CourseSelection ADD CONSTRAINT fk_course_selection_student
FOREIGN KEY (student_id) REFERENCES Student(id)
ON DELETE CASCADE
ON UPDATE CASCADE;
ALTER TABLE CourseSelection ADD CONSTRAINT fk_course_selection_course
FOREIGN KEY (course_id) REFERENCES Course(id)
ON DELETE CASCADE
ON UPDATE CASCADE;
```
接下来,我们可以使用视图、触发器和存储过程来实现更多的功能。
1. 创建一个视图,以便快速查询学生的选课情况
```
CREATE VIEW StudentCourse AS
SELECT s.id AS student_id, s.name AS student_name, s.major, c.id AS course_id, c.name AS course_name, c.teacher, c.credit, cs.score
FROM Student s
JOIN CourseSelection cs ON s.id = cs.student_id
JOIN Course c ON cs.course_id = c.id;
```
2. 创建一个触发器,以便在插入选课成绩时自动更新学生的平均成绩
```
CREATE TRIGGER trg_course_selection_insert AFTER INSERT ON CourseSelection
FOR EACH ROW
BEGIN
UPDATE Student
SET avg_score = (SELECT AVG(score) FROM CourseSelection WHERE student_id = NEW.student_id)
WHERE id = NEW.student_id;
END;
```
3. 创建一个存储过程,以便统计课程成绩分布
```
CREATE PROCEDURE sp_course_score_distribution(IN p_course_id INT)
BEGIN
SELECT MAX(score) AS '最高分',
MIN(score) AS '最低分',
AVG(score) AS '平均分',
COUNT(CASE WHEN score >= 90 THEN 1 END) AS '90分以上',
COUNT(CASE WHEN score >= 80 AND score < 90 THEN 1 END) AS '80-89分',
COUNT(CASE WHEN score >= 70 AND score < 80 THEN 1 END) AS '70-79分',
COUNT(CASE WHEN score >= 60 AND score < 70 THEN 1 END) AS '60-69分',
COUNT(CASE WHEN score < 60 THEN 1 END) AS '60分以下'
FROM CourseSelection
WHERE course_id = p_course_id;
END;
```
以上代码中,我们添加了视图、触发器和存储过程来实现更多的功能。视图可以快速查询学生的选课情况,触发器可以在插入选课成绩时自动更新学生的平均成绩,存储过程可以统计课程成绩分布。
注意,为了保证安全性,我们在视图中只查询了必要的字段,并且在存储过程中使用了参数化查询。同时,我们在外键约束中添加了级联删除和级联更新操作,以便保证数据的完整性。
希望这个更完整的解决方案能够帮助到你。
阅读全文