ToB企服应用市场:ToB评测及商务社交产业平台

标题: MySql-学天生绩管理系统 [打印本页]

作者: 刘俊凯    时间: 2024-6-14 23:34
标题: MySql-学天生绩管理系统
前言

   暑假的时间学习过这个 MySql 数据库,然后学校这个学期居然开了这门课程,那就做一个学天生绩管理系统来练一练手吧。在这里做一个简单的训练记录。
  需求分析

SQL 编写

新建数据库

为该数据库建表

INSERT INTO 数据

创建索引

创建视图

创建触发器

创建存储过程

SQL 查询进行调试

结语

   完备代码如下
  1. -- 1. 新建数据库
  2. drop database studentManage;
  3. CREATE DATABASE studentManage;
  4. use studentManage;
  5. -- 2. 创建表
  6. -- 创建班级表
  7. CREATE TABLE classes (
  8. class_id INT PRIMARY KEY,  -- 班级ID,作为主键
  9. class_name VARCHAR(50)  -- 班级名称,最大长度为50个字符
  10. );
  11. -- 插入班级数据
  12. INSERT INTO classes (class_id, class_name) VALUES (0, '尖子班');
  13. INSERT INTO classes (class_id, class_name) VALUES (1, '垃圾班');
  14. INSERT INTO classes (class_id, class_name) VALUES (2, '垃圾班');
  15. INSERT INTO classes (class_id, class_name) VALUES (3, '废物班');
  16. INSERT INTO classes (class_id, class_name) VALUES (4, '废物班');
  17. INSERT INTO classes (class_id, class_name) VALUES (5, '脑残班');
  18. -- 创建学生表
  19. CREATE TABLE students (
  20. student_id INT PRIMARY KEY NOT NULL,  -- 学生ID,作为主键,不允许为空
  21. name VARCHAR(50),  -- 姓名,最大长度为50个字符
  22. class_id INT,  -- 班级ID
  23. age INT,  -- 年龄
  24. FOREIGN KEY (class_id) REFERENCES classes(class_id)  -- 外键关联到班级表的班级ID
  25. );
  26. -- 插入学生数据
  27. INSERT INTO students (student_id, name, class_id, age) VALUES (1, '王八', 5, 19);
  28. INSERT INTO students (student_id, name, class_id, age) VALUES (2, '王一', 1, 20);
  29. INSERT INTO students (student_id, name, class_id, age) VALUES (3, '小六', 0, 18);
  30. INSERT INTO students (student_id, name, class_id, age) VALUES (4, '王五', 2, 19);
  31. INSERT INTO students (student_id, name, class_id, age) VALUES (5, '赵六', 3, 20);
  32. INSERT INTO students (student_id, name, class_id, age) VALUES (6, '小七', 4, 18);
  33. -- 创建教师表
  34. CREATE TABLE teachers (
  35. teacher_id INT PRIMARY KEY NOT NULL,  -- 教师ID,作为主键,不允许为空
  36. teacher_name VARCHAR(50)  -- 教师姓名,最大长度为50个字符
  37. );
  38. -- 插入教师数据
  39. INSERT INTO teachers (teacher_id, teacher_name) VALUES (1, '陈老师');
  40. INSERT INTO teachers (teacher_id, teacher_name) VALUES (2, '杨老师');
  41. INSERT INTO teachers (teacher_id, teacher_name) VALUES (4, '何老师');
  42. INSERT INTO teachers (teacher_id, teacher_name) VALUES (4, '刘老师');
  43. INSERT INTO teachers (teacher_id, teacher_name) VALUES (5, '陈老师');
  44. INSERT INTO teachers (teacher_id, teacher_name) VALUES (6, '周老师');
  45. -- 创建课程表
  46. CREATE TABLE courses (
  47. course_id INT PRIMARY KEY NOT NULL,  -- 课程ID,作为主键,不允许为空
  48. course_name VARCHAR(50),  -- 课程名称,最大长度为50个字符
  49. teacher_id INT,  -- 教师ID
  50. FOREIGN KEY (teacher_id) REFERENCES teachers(teacher_id)  -- 外键关联到教师表的教师ID
  51. );
  52. -- 插入课程数据
  53. INSERT INTO courses (course_id, course_name, teacher_id) VALUES (100, '英语', 1);
  54. INSERT INTO courses (course_id, course_name, teacher_id) VALUES (101, '语文', 2);
  55. INSERT INTO courses (course_id, course_name, teacher_id) VALUES (102, '数学', 3);
  56. INSERT INTO courses (course_id, course_name, teacher_id) VALUES (103, '生物', 4);
  57. INSERT INTO courses (course_id, course_name, teacher_id) VALUES (104, '物理', 5);
  58. INSERT INTO courses (course_id, course_name, teacher_id) VALUES (105, '化学', 6);
  59. -- 创建成绩表
  60. CREATE TABLE scores (
  61. student_id INT,  -- 学生ID
  62. course_id INT,  -- 课程ID
  63. score INT,  -- 分数
  64. FOREIGN KEY (student_id) REFERENCES students(student_id),  -- 外键关联到学生表的学生ID
  65. FOREIGN KEY (course_id) REFERENCES courses(course_id)  -- 外键关联到课程表的课程ID
  66. );
  67. -- 插入成绩数据
  68. INSERT INTO scores (student_id, course_id, score) VALUES (1, 1, 92);
  69. INSERT INTO scores (student_id, course_id, score) VALUES (2, 1, 8);
  70. INSERT INTO scores (student_id, course_id, score) VALUES (3, 1, 5);
  71. INSERT INTO scores (student_id, course_id, score) VALUES (4, 1, 0);
  72. INSERT INTO scores (student_id, course_id, score) VALUES (5, 1, 8);
  73. INSERT INTO scores (student_id, course_id, score) VALUES (6, 1, 7);
  74. INSERT INTO scores (student_id, course_id, score) VALUES (1, 2, 100);
  75. INSERT INTO scores (student_id, course_id, score) VALUES (2, 2, 8);
  76. INSERT INTO scores (student_id, course_id, score) VALUES (3, 2, 5);
  77. INSERT INTO scores (student_id, course_id, score) VALUES (4, 2, 2);
  78. INSERT INTO scores (student_id, course_id, score) VALUES (5, 2, 8);
  79. INSERT INTO scores (student_id, course_id, score) VALUES (6, 2, 7);
  80. INSERT INTO scores (student_id, course_id, score) VALUES (1, 1, 100);
  81. INSERT INTO scores (student_id, course_id, score) VALUES (2, 2, 1);
  82. INSERT INTO scores (student_id, course_id, score) VALUES (3, 3, 7);
  83. INSERT INTO scores (student_id, course_id, score) VALUES (4, 4, 10);
  84. INSERT INTO scores (student_id, course_id, score) VALUES (5, 5, 10);
  85. INSERT INTO scores (student_id, course_id, score) VALUES (6, 6, 60);
  86. INSERT INTO scores (student_id, course_id, score) VALUES (1, 1, 100);
  87. INSERT INTO scores (student_id, course_id, score) VALUES (2, 2, 22);
  88. INSERT INTO scores (student_id, course_id, score) VALUES (3, 3, 71);
  89. INSERT INTO scores (student_id, course_id, score) VALUES (4, 4, 20);
  90. INSERT INTO scores (student_id, course_id, score) VALUES (5, 5, 30);
  91. INSERT INTO scores (student_id, course_id, score) VALUES (6, 6, 40);
  92. INSERT INTO scores (student_id, course_id, score) VALUES (1, 1, 100);
  93. INSERT INTO scores (student_id, course_id, score) VALUES (2, 2, 14);
  94. INSERT INTO scores (student_id, course_id, score) VALUES (3, 3, 72);
  95. INSERT INTO scores (student_id, course_id, score) VALUES (4, 4, 11);
  96. INSERT INTO scores (student_id, course_id, score) VALUES (5, 5, 11);
  97. INSERT INTO scores (student_id, course_id, score) VALUES (6, 6, 62);
  98. INSERT INTO scores (student_id, course_id, score) VALUES (1, 1, 100);
  99. INSERT INTO scores (student_id, course_id, score) VALUES (2, 2, 12);
  100. INSERT INTO scores (student_id, course_id, score) VALUES (3, 3, 73);
  101. INSERT INTO scores (student_id, course_id, score) VALUES (4, 4, 14);
  102. INSERT INTO scores (student_id, course_id, score) VALUES (5, 5, 15);
  103. INSERT INTO scores (student_id, course_id, score) VALUES (6, 6, 66);
  104. -- 3. 创建索引
  105. -- 为学生表的学生ID创建索引
  106. CREATE INDEX idx_student_id ON students (student_id);
  107. -- 为课程表的课程ID创建索引
  108. CREATE INDEX idx_course_id ON courses (course_id);
  109. -- 为成绩表的学生ID和课程ID创建联合索引
  110. CREATE INDEX idx_student_course ON scores (student_id, course_id);
  111. -- 4. 创建视图
  112. CREATE VIEW class_scores AS   
  113. SELECT     
  114.     c.class_id,     
  115.     c.class_name,     
  116.     COUNT(s.student_id) AS student_count,     
  117.     AVG(sc.score) AS average_score   
  118. FROM     
  119.     classes c   
  120. JOIN     
  121.     students s ON c.class_id = s.class_id   
  122. JOIN
  123.     scores sc ON s.student_id = sc.student_id
  124. GROUP BY     
  125.     c.class_id, c.class_name;
  126. CREATE VIEW teacher_courses AS  
  127. SELECT   
  128.     t.teacher_id,   
  129.     t.teacher_name,   
  130.     COUNT(c.course_id) AS course_count  
  131. FROM   
  132.     teachers t  
  133. JOIN   
  134.     courses c ON t.teacher_id = c.teacher_id  
  135. GROUP BY   
  136.     t.teacher_id, t.teacher_name;
  137. -- 5. 创建触发器
  138. DELIMITER //  
  139. CREATE TRIGGER check_student_class_id_after_insert  
  140. AFTER INSERT ON students  
  141. FOR EACH ROW  
  142. BEGIN  
  143.     IF NEW.class_id IS NULL OR NEW.class_id = 0 THEN  
  144.         SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '必须为新学生分配班级ID';  
  145.     END IF;  
  146. END;  
  147. //  
  148. DELIMITER ;
  149. DELIMITER //  
  150. CREATE TRIGGER check_course_name_length_before_update  
  151. BEFORE UPDATE ON courses  
  152. FOR EACH ROW  
  153. BEGIN  
  154.     IF NEW.course_name IS NOT NULL AND LENGTH(NEW.course_name) > 50 THEN  
  155.         SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '课程名称长度不能超过50个字符';  
  156.     END IF;  
  157. END;  
  158. //  
  159. DELIMITER ;
  160. DELIMITER //  
  161. CREATE TRIGGER check_student_scores_after_delete  
  162. AFTER DELETE ON students  
  163. FOR EACH ROW  
  164. BEGIN  
  165.     DECLARE score_count INT;  
  166.     SELECT COUNT(*) INTO score_count FROM scores WHERE student_id = OLD.student_id;  
  167.     IF score_count > 0 THEN  
  168.         SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '不能删除有分数记录的学生';  
  169.     END IF;  
  170. END;  
  171. //  
  172. DELIMITER ;
  173. -- 6. 创建存储函数
  174. -- 存储过程1 - 添加学生
  175. DELIMITER //
  176. CREATE PROCEDURE add_student (
  177.     IN p_student_id INT,
  178.     IN p_name VARCHAR(50),
  179.     IN p_class_id INT,
  180.     IN p_age INT
  181. )
  182. BEGIN
  183.     INSERT INTO students (student_id, name, class_id, age) VALUES (p_student_id, p_name, p_class_id, p_age);
  184. END //
  185. DELIMITER ;
  186. -- 存储过程2 - 添加课程
  187. DELIMITER //
  188. CREATE PROCEDURE add_course (
  189.     IN p_course_id INT,
  190.     IN p_course_name VARCHAR(50),
  191.     IN p_teacher_id INT
  192. )
  193. BEGIN
  194.     INSERT INTO courses (course_id, course_name, teacher_id) VALUES (p_course_id, p_course_name, p_teacher_id);
  195. END //
  196. DELIMITER ;
  197. -- 存储过程3 - 添加成绩
  198. DELIMITER //
  199. CREATE PROCEDURE add_score (
  200.     IN p_student_id INT,
  201.     IN p_course_id INT,
  202.     IN p_score INT
  203. )
  204. BEGIN
  205.     INSERT INTO scores (student_id, course_id, score) VALUES (p_student_id, p_course_id, p_score);
  206. END //
  207. DELIMITER ;
  208. -- 数据更新
  209. -- 更新学生的姓名
  210. UPDATE students SET name = '新名字' WHERE student_id = 1;
  211. -- 更新学生的班级
  212. UPDATE students SET class_id = 1 WHERE student_id = 2;
  213. -- 更新学生的年龄
  214. UPDATE students SET age = 21 WHERE student_id = 3;
  215. -- 更新课程的名称
  216. UPDATE courses SET course_name = '历史' WHERE course_id = 100;
  217. -- 更新课程的教师
  218. UPDATE courses SET teacher_id = 2 WHERE course_id = 101;
  219. -- 更新成绩
  220. UPDATE scores SET score = 90 WHERE student_id = 1 AND course_id = 100;
  221. -- 查询特定学生的信息:
  222. SELECT * FROM students WHERE student_id = 1;
  223. --  查询特定课程的信息:
  224. SELECT * FROM courses WHERE course_id = 5;
  225. -- 查询特定学生在特定课程上的成绩:
  226. SELECT scores.score   
  227. FROM scores   
  228. JOIN students ON scores.student_id = students.student_id   
  229. JOIN courses ON scores.course_id = courses.course_id   
  230. WHERE students.student_id = 1 AND courses.course_id = 5;
  231. -- 查询某个班级的所有学生信息:
  232. SELECT * FROM students WHERE class_id = 1;
  233. -- 查询某个教师的所有课程信息:
  234. SELECT courses.* FROM courses JOIN teachers ON courses.teacher_id = teachers.teacher_id WHERE teachers.teacher_name = '刘老师';
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4