数据库综合实验--设计某高校学生选课管理系统
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《数据库综合实验--设计某高校学生选课管理系统》,介绍一下MySQL、数据库、实验记录,希望对大家的知识积累有所帮助,助力实战开发!
数据库综合实验重做
因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下
题目如下:
设计某高校学生选课管理系统
- 实现学生信息、课程学生管理;
- 实现教师及任课信息管理;
- 实现选课登记,要保证学生不能选修重复的课程(实用触发器实现);
- 创建存储过程统计学生指定学期选修课程的总学分数;
- 创建视图查询2006-2007学年,没有被选修的课程;
- 创建存储过程统计各教师任课的学生人数;
- 创建表间关系
前言
这部分说的是我之前的实现,和改进思路,节省时间可跳过。
因为要求对于教师和课程等等的对应关系没有说明,所以可以自由发挥,我能找到 教师和课程之间是一对一关系的 实现,但是因为我想要实现教师课程多对多的数据库,所以就自己发挥了。
当时做实验的时候,对数据的描述如下:
一名学生可以选修多门课程,一门课程可被多个学生选修,每门课程对应一个老师,每门课程有一个成绩,且选修课程名不能重复;一名教师可以任教多门课程,一门课程可由多个老师教授,每个老师所任教的每门课程有一个课程评价;一个老师可教多名学生。
E-R图如下:

用Excel做的表格如下:

这个实现的问题就在于每个学生选的课程,是需要教师号和课程号一起才能共同确定的,这种情况实验要求就会很麻烦(而且E-R图上是三角多对多感觉很难受)改进思路就是将多一个临时班级实体,一个临时班级对应一个教师和一个课程,这样就可以将学生对老师和学生对课程这两个多对多关系化简成临时班级对老师,临时班级对课程这两个一对多的关系。
接下来,正文开始。
数据库描述和E-R图
有要求,可转化成如下数据间关系:
一名学生可以选修多门课程,一门课程可被多个学生选修,学生选修课程的实质是选临时班级。每个临时班级对应一门课程和一个老师,每门课程有一个成绩,且选修课程名不能重复;一名教师可以任教多门课程,一门课程可由多个老师教授。
E-R图如下:

这里临时班级多了一个人数的属性主要是为了接下来统计人数方便。
这里可以先按照E-R图在excel上把表建出来,输一些用于插入数据时做参考和验证。

数据库建立
需要建立的东西如下(加粗为主码):
-
实体
学生(学号,姓名,性别,生日,专业)
教师(职工号,姓名,性别)
课程(课程号,课程名,学分,开课学期)
临时班级(班级号,课程号,教师号,人数)
-
关系
选课(学号,班级号,成绩)
-
视图
未选修06-07(班级号,课程名,教师名)
-
Trigger
学生不能选择课程号相同的课程。
-
存储过程
查看指定学期的学生学分
各教师任课的学生人数
下面是实现过程:
-
建立选课模式
CREATE SCHEMA select_courses;
-
建立实体表
-- student table CREATE TABLE students( stu_id INT PRIMARY KEY, name VARCHAR(40), birth_day DATE, sex VARCHAR(1), major VARCHAR(40) ); -- teacher table CREATE TABLE teathers( tea_id INT PRIMARY KEY, name VARCHAR(40), sex VARCHAR(1) ); -- courses table CREATE TABLE courses( course_id INT PRIMARY KEY, course_name VARCHAR(40), credit INT, open_time VARCHAR(20) ); -- temp class table CREATE TABLE classes( class_id INT PRIMARY KEY, course_id INT, tea_id INT, number INT DEFAULT 0, FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE CASCADE, FOREIGN KEY (tea_id) REFERENCES teathers(tea_id) ON DELETE CASCADE ); -
建立多对多关系表
CREATE TABLE select_courses( stu_id INT, class_id INT, grade INT, PRIMARY KEY (stu_id, class_id), FOREIGN KEY (stu_id) REFERENCES students(stu_id) ON DELETE CASCADE, FOREIGN KEY (class_id) REFERENCES classes(class_id) ON DELETE CASCADE ); -
插入除
-- insert data into students INSERT INTO students VALUES(101, 'Guanyu', '1996-10-01', 'M', 'physical'); INSERT INTO students VALUES(102, 'Zhangfei', '1997-01-03', 'M', 'physical'); INSERT INTO students VALUES(103, 'Liubei', '1995-9-18', 'M', 'politics'); INSERT INTO students VALUES(104, 'Sunquan', '1998-08-30', 'M', 'politics'); INSERT INTO students VALUES(105, 'Xiaoqiao', '1999-4-21', 'F', 'art'); -- insert data into teachers INSERT INTO teathers VALUES(201, 'Zhugeliang','M'); INSERT INTO teathers VALUES(202, 'Zhouyu','M'); INSERT INTO teathers VALUES(203, 'Huangzhong','M'); INSERT INTO teathers VALUES(204, 'Caocao','M'); INSERT INTO teathers VALUES(205, 'Daqiao','F'); -- insert data into courses INSERT INTO courses VALUES(3001, 'history', 2, '2006-2007-1'); INSERT INTO courses VALUES(3002, 'art of war', 3, '2006-2007-1'); INSERT INTO courses VALUES(3003, 'archery', 3, '2006-2007-2'); INSERT INTO courses VALUES(3004, 'stitchwork', 2, '2006-2007-2'); INSERT INTO courses VALUES(3005, 'appreciate poetry', 3, '2007-2008-1'); INSERT INTO courses VALUES(3006, 'language art', 2, '2007-2008-1'); -- insert data into classes INSERT INTO classes(class_id, course_id, tea_id) VALUES(6001, 3001, 201); INSERT INTO classes(class_id, course_id, tea_id) VALUES(6002, 3001, 204); INSERT INTO classes(class_id, course_id, tea_id) VALUES(6003, 3002, 201); INSERT INTO classes(class_id, course_id, tea_id) VALUES(6004, 3002, 202); INSERT INTO classes(class_id, course_id, tea_id) VALUES(6005, 3003, 203); INSERT INTO classes(class_id, course_id, tea_id) VALUES(6006, 3004, 205); INSERT INTO classes(class_id, course_id, tea_id) VALUES(6007, 3005, 202); INSERT INTO classes(class_id, course_id, tea_id) VALUES(6008, 3005, 204); INSERT INTO classes(class_id, course_id, tea_id) VALUES(6009, 3006, 201); INSERT INTO classes(class_id, course_id, tea_id) VALUES(6010, 3006, 202);
-
建立改变班级人数的辅助触发器
因为用的是datagrip,所以就没有在头尾加CREATE TRIGGER class_number_insert AFTER INSERT ON select_courses FOR EACH ROW BEGIN IF NEW.class_id IN (SELECT class_id FROM classes) THEN UPDATE classes SET number = number + 1 WHERE class_id = NEW.class_id; END IF; END; CREATE TRIGGER class_number_delete AFTER DELETE ON select_courses FOR EACH ROW BEGIN IF OLD.class_id IN (SELECT class_id FROM classes) THEN UPDATE classes SET number = number - 1 WHERE class_id = OLD.class_id; END IF; END; -
向
INSERT INTO select_courses VALUES(101,6001,90); INSERT INTO select_courses VALUES(101,6003,87); INSERT INTO select_courses VALUES(101,6008,80); INSERT INTO select_courses VALUES(102,6001,75); INSERT INTO select_courses VALUES(102,6002,60); INSERT INTO select_courses VALUES(103,6001,93); INSERT INTO select_courses VALUES(103,6010,85); INSERT INTO select_courses VALUES(103,6008,70); INSERT INTO select_courses VALUES(104,6004,87); INSERT INTO select_courses VALUES(104,6007,85); INSERT INTO select_courses VALUES(104,6010,80); INSERT INTO select_courses VALUES(105,6006,90);
-
建立触发器,实现学生不能选择课程号相同的课程。
若选择学生选择已选的课程,会抛出CREATE TRIGGER non_repetition BEFORE INSERT ON select_courses FOR EACH ROW BEGIN IF (SELECT course_id FROM classes WHERE NEW.class_id = class_id) IN (SELECT classes.course_id FROM select_courses JOIN classes ON classes.class_id = select_courses.class_id WHERE stu_id = NEW.stu_id) THEN SIGNAL SQLSTATE 'HX000' SET MESSAGE_TEXT = 'course was selected'; END IF; END;可以尝试插入一个错误数据,看看结果是否正确。
6002班级的课程为3001,而101学生已选的6001班级也是教3001课程的,所以理论上这个数据不应该被插入。INSERT INTO select_courses VALUES(101,6002,90);
-
创建视图,查询2006-2007学年没有被选修的课程
这里“未选修”对应到表上就是,课程人数为0。2006-2007学年即CREATE VIEW not_selected_2006_2007 AS SELECT class_id, course_name, name FROM classes JOIN courses c on classes.course_id = c.course_id JOIN teathers t on classes.tea_id = t.tea_id WHERE number = 0 AND open_time in ('2006-2007-1','2006-2007-2'); -
创建存储过程,查看指定学期的学生学分
CREATE PROCEDURE get_total_credit(IN term VARCHAR(20)) BEGIN SELECT students.stu_id, students.name, SUM(courses.credit) FROM select_courses JOIN classes ON classes.class_id = select_courses.class_id JOIN students ON select_courses.stu_id = students.stu_id JOIN courses ON classes.course_id = courses.course_id WHERE courses.open_time = term GROUP BY students.stu_id, name; END; -
创建存储过程,各教师任课的学生人数
CREATE PROCEDURE num_of_students() BEGIN SELECT t.name, c.course_name, SUM(number) num_of_stu FROM classes JOIN courses c on classes.course_id = c.course_id JOIN teathers t on classes.tea_id = t.tea_id GROUP BY c.course_id, t.tea_id; END;这里会发现,结果和
classes
表一样,只有当你允许一个老师开好几个班上同一门课时(即班级号不同但教师号和课程号不同),才会不同。
至此,数据库建立完毕。
结语
这里的设计和原来相比,取巧的地方在于,多加了一个临时班级实体,不仅将学生对课程、学生对老师、老师对课程的三角多对多关系,转化成课程对班级、老师对班级的一对多关系和学生对班级的多对多关系;而且临时班级实体中加入的班级人数属性,可以被查询没有被选修的课程、统计教师任课的学生人数的实现加以利用,代码更简洁。
今天关于《数据库综合实验--设计某高校学生选课管理系统》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
安装mysql问题汇总
- 上一篇
- 安装mysql问题汇总
- 下一篇
- 一次线上Mysql死锁分析
-
- 数据库 · MySQL | 1天前 |
- MySQL数值函数大全及使用技巧
- 117浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- 三种登录MySQL方法详解
- 411浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL数据备份方法与工具推荐
- 420浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL数据备份方法与工具推荐
- 264浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL索引的作用是什么?
- 266浏览 收藏
-
- 数据库 · MySQL | 5天前 |
- MySQL排序原理与实战应用
- 392浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQLwhere条件查询技巧
- 333浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用数据类型有哪些?怎么选更合适?
- 234浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用命令大全管理员必学30条
- 448浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL高效批量插入数据方法大全
- 416浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL性能优化技巧大全
- 225浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL数据备份4种方法保障安全
- 145浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3166次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3378次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3407次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4511次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3787次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览
-
- mysql面试题
- 2023-01-17 157浏览
-
- MySQL数据表简单查询
- 2023-01-10 101浏览

