【MySQL】——课程平台的创建设计

💻博主现有专栏:

                C51单片机(STC89C516),c语言,c++,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux,基于HTML5的网页设计及应用,Rust(官方文档重点总结),jQuery,前端vue.js,Javaweb开发,设计模式、Python机器学习等
🥏主页链接:

                Y小夜-CSDN博客

目录

🎯实现的功能

🎯ER图

🎯建立表

课程章节表:

课程题库表:

教师表

班级表

学生表:

作业规则表

实验规则表

试卷规则表:

课程作业总表:

课程作业明细表:

课程实验总表:

课程实验明细表

课程试卷总表:

课程试卷明细表:

🎯建立索引

教师表和学生表的姓名索引:

题库表的试题内容、试题答案、题型、难度索引

班级表的班级名称索引

🎯建立视图

班级学生视图(班级表和学生表)

教师学生视图(教师表和班级学生视图)

🎯 插入记录

插入章节表

插入题库表

插入教师表

插入班级表

插入学生表

插入试卷规则表

插入作业规则表:

🎯编写触发器

(一)章节试题数量触发器

(二)班级学生人数触发器

🎯编写存储过程或函数

写出插入一条学生数据的存储过程

写出一次插入多条学生数据的存储过程

生成学生试卷

生成班级试卷

🎯游标知识扩展


🎯实现的功能

(一)学生用户

  1. 课程作业
  2. 课程实验
  3. 课程考试

(二)教师用户:

  1. 课程的章节管理
  2. 课程的题库管理
  3. 教师管理
  4. 班级管理
  5. 学生管理
  6. 作业管理
  7. 实验管理
  8. 考试管理

🎯ER图

🎯建立表

课程章节表:

CREATE TABLE `chapter` (`chapterId` int(11) NOT NULL AUTO_INCREMENT,`chapterName` varchar(50) DEFAULT NULL,`questionCount` int(10) unsigned zerofill DEFAULT NULL,PRIMARY KEY (`chapterId`)) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

课程题库表:

CREATE TABLE `questionbank` (`questionId` int(11) NOT NULL AUTO_INCREMENT,`questionContent` text,`questionAnswer` varchar(2000) DEFAULT NULL,`type` tinyint(3) unsigned zerofill DEFAULT NULL,`difficulty` tinyint(3) unsigned zerofill DEFAULT NULL,`chapterId` int(11) DEFAULT NULL,PRIMARY KEY (`questionId`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

教师表

CREATE TABLE `teacher` (`teacherId` int(11) NOT NULL AUTO_INCREMENT,`teacherNUM` varchar(20) DEFAULT NULL,`teacherName` varchar(50) DEFAULT NULL,`teacherPW` varchar(20) DEFAULT NULL,KEY `teacherId` (`teacherId`),KEY `teachername` (`teacherName`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

班级表

CREATE TABLE `class` (`classid` int(11) NOT NULL AUTO_INCREMENT COMMENT '班级ID',`classname` varchar(20) DEFAULT NULL,`classsize` int(11) DEFAULT '0',`teacherid` int(11) DEFAULT '0',PRIMARY KEY (`classid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

学生表:

CREATE TABLE `student` (`studentid` int(11) NOT NULL AUTO_INCREMENT,`studentnum` varchar(20) DEFAULT NULL,`studentname` varchar(20) DEFAULT NULL,`studentpw` varchar(20) DEFAULT NULL,`classid` int(11) DEFAULT '0',PRIMARY KEY (`studentid`),KEY `student456` (`studentname`)
) ENGINE=InnoDB AUTO_INCREMENT=122 DEFAULT CHARSET=utf8;

作业规则表

CREATE TABLE `word_rule` (`work_ruleid` int(11) NOT NULL AUTO_INCREMENT,`chapterid` int(11) DEFAULT NULL,`type` int(11) DEFAULT NULL,`difficulty` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL,PRIMARY KEY (`work_ruleid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

实验规则表

CREATE TABLE `experiment_rule` (`experiment_ruleid` int(11) NOT NULL AUTO_INCREMENT,`chapterid` int(11) DEFAULT NULL,`type` int(11) DEFAULT NULL,`difficulty` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL,PRIMARY KEY (`experiment_ruleid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

试卷规则表:

CREATE TABLE `exam_rule` (`exam_ruleid` int(11) NOT NULL AUTO_INCREMENT,`fromchapterid` int(11) DEFAULT NULL,`tochapterid` int(11) DEFAULT NULL,`type` int(11) DEFAULT NULL,`difficulty` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL,PRIMARY KEY (`exam_ruleid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

课程作业总表:

CREATE TABLE `work` (`workid` int(11) NOT NULL AUTO_INCREMENT,`chpaterid` int(11) DEFAULT NULL,`studentid` int(11) DEFAULT NULL,`fromtime` datetime DEFAULT NULL,`totime` datetime DEFAULT NULL,`score` int(11) DEFAULT NULL,PRIMARY KEY (`workid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

课程作业明细表:

CREATE TABLE `work_detail` (`work_detailid` int(11) NOT NULL AUTO_INCREMENT,`workid` int(11) DEFAULT NULL,`questionid` int(11) DEFAULT NULL,`answer` varchar(2000) DEFAULT NULL,`grade` int(11) DEFAULT NULL,PRIMARY KEY (`work_detailid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

课程实验总表:

CREATE TABLE `experiment` (`experimentid` int(11) NOT NULL AUTO_INCREMENT,`chapterid` int(11) DEFAULT NULL,`studentid` int(11) DEFAULT NULL,`fromtime` datetime DEFAULT NULL,`totime` datetime DEFAULT NULL,`score` int(11) DEFAULT NULL,PRIMARY KEY (`experimentid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

课程实验明细表

CREATE TABLE `experiment_detail` (`experiment_detailid` int(11) NOT NULL AUTO_INCREMENT,`experimentid` int(11) DEFAULT NULL,`questionid` int(11) DEFAULT NULL,`answer` varchar(2000) DEFAULT NULL,`grade` int(11) DEFAULT NULL,PRIMARY KEY (`experiment_detailid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

课程试卷总表:

CREATE TABLE `exam` (`examid` int(11) NOT NULL AUTO_INCREMENT,`studentid` int(11) DEFAULT NULL,`fromtime` datetime DEFAULT NULL,`totime` datetime DEFAULT NULL,`state` int(11) DEFAULT NULL,`score` int(11) DEFAULT NULL,PRIMARY KEY (`examid`)
) ENGINE=InnoDB AUTO_INCREMENT=122 DEFAULT CHARSET=utf8;

课程试卷明细表:

CREATE TABLE `exam_detail` (`exam_detailid` int(11) NOT NULL AUTO_INCREMENT,`examid` int(11) DEFAULT NULL,`questionid` int(11) DEFAULT NULL,`answer` varchar(2000) DEFAULT NULL,`grade` int(11) DEFAULT NULL,PRIMARY KEY (`exam_detailid`)
) ENGINE=InnoDB AUTO_INCREMENT=1681 DEFAULT CHARSET=utf8;

🎯建立索引

教师表和学生表的姓名索引:

create index idx_teacher_name on teacher(teachername);create index idx_student_name on student(studentname);

题库表的试题内容、试题答案、题型、难度索引

CREATE INDEX idx_question_content ON questionbank(questionContent);CREATE INDEX idx_question_answer ON questionbank(questionAnswer);CREATE INDEX idx_question_type ON questionbank(`type`);CREATE INDEX idx_question_difficulty ON questionbank(difficulty);

班级表的班级名称索引

CREATE INDEX idx_class_name ON class(className);

🎯建立视图

班级学生视图(班级表和学生表)

CREATE VIEW class_student_view ASSELECT c.classId, c.className, c.classSize, c.teacherId, s.studentId, s.studentNUM, s.studentName, s.studentPWFROM class cJOIN student s ON c.classId = s.classId;

教师学生视图(教师表和班级学生视图)

CREATE VIEW teacher_student_view AS
SELECT t.teacherId AS teacherId_t, t.teacherNUM AS teacherNUM_t, t.teacherName AS teacherName_t, t.teacherPW AS teacherPW_t, csv.*
FROM teacher t
JOIN class_student_view csv ON t.teacherId = csv.teacherId;

🎯 插入记录

  • 插入章节表

insert  into `chapter`(`chapterId`,`chapterName`,`questionCount`) values (1,'第一章MySQL概述',0000000000),(2,'第二章数据类型',0000000000),(3,'第三章MySQL常用操作',0000000000),(4,'第四章MySQL查询',0000000000),(5,'第五章MySQL函数和存储过程',0000000000),(6,'第六章MySQL高级特性',0000000000),(7,'第七章索引',0000000000),(8,'第八章综合案例',0000000000);
  • 插入题库表

insert  into `questionbank`(`questionId`,`questionContent`,`questionAnswer`,`type`,`difficulty`,`chapterId`) values (1,'______表示一个新的事务处理块的开始 \nA、 START TRANSACTION \nB、 BEGIN TRANSACTION \nC、 BEGIN COMMIT \nD、 START COMMIT ','A',001,001,1),(2,'______表示一个新的事务处理块的开始 \nA、 START TRANSACTION \nB、 BEGIN TRANSACTION \nC、 BEGIN COMMIT \nD、 START COMMIT ','A',001,001,1),(3,'______表示一个新的事务处理块的开始 \r\nA、 START TRANSACTION \r\nB、 BEGIN TRANSACTION \r\nC、 BEGIN COMMIT \r\nD、 START COMMIT ','A',001,001,1),(4,'______表示一个新的事务处理块的开始 \nA、 START TRANSACTION \nB、 BEGIN TRANSACTION \nC、 BEGIN COMMIT \nD、 START COMMIT ','A',001,001,1),(5,'______表示一个新的事务处理块的开始 A、 START TRANSACTION B、 BEGIN TRANSACTION C、 BEGIN COMMIT D、 START COMMIT ','A',001,001,1),(6,'______表示一个新的事务处理块的开始 \r\nA、 START TRANSACTION \r\nB、 BEGIN TRANSACTION \r\nC、 BEGIN COMMIT \r\nD、 START COMMIT \r\n','A',001,001,1),(7,'______函数通常用来计算累计排名、移动平均数和报表聚合等。 \r\nA、 汇总 \r\nB、 分析 \r\nC、 分组 \r\nD、 单行','A',001,001,1),(8,'查询数据表的内容,需要用到的sql命令为:____。(字母小写)','select',002,001,1),(9,'在MySQL中,可以使用____(要求小写)语句来修改、更新一个表或多个表中的数据。','update',002,001,1),(10,'SQL语言是______的语言,轻易学习。','非过程',002,001,1),(11,'SQL语言中,删除一个视图的命令是_____。','drop',002,001,1),(12,'ORDER BY NAME DESC是指按照姓名______。','降序',002,001,1),(13,'UNIQUE惟一索引的作用是______。','不重复',002,001,1);
  • 插入教师表

insert  into `teacher`(`teacherId`,`teacherNUM`,`teacherName`,`teacherPW`) values (1,'1001','刘老师','1001'),(2,'1002','王老师','1002'),(3,'1003','李老师','25654');
  • 插入班级表

insert  into `class`(`classid`,`classname`,`classsize`,`teacherid`) values (1,'软工2001-2003班',121,1);
  • 插入学生表

  • 插入试卷规则表

insert  into `exam_rule`(`exam_ruleid`,`fromchapterid`,`tochapterid`,`type`,`difficulty`,`count`) values (1,1,1,1,1,6),(2,1,1,2,1,4);
  • 插入作业规则表:

INSERT INTO`word_rule`(`work_ruleid`,`chapterid`,`type`,`difficulty`,`count`) VALUES(1,1,1,1,10);

🎯编写触发器

(一)章节试题数量触发器

当插入、删除试题时,修改章节表的试题数量

插入时:

DELIMITER $$CREATETRIGGER `network_course`.`insert_chapter_question_count` AFTER INSERTON `network_course`.`questionbank`FOR EACH ROW BEGINupdate `chapter` set`questionCount`=`questionCount`+1where `chapter`.`chapterId`=new.`chapterId`;END$$DELIMITER ;

删除时:

DELIMITER $$CREATETRIGGER `network_course`.`delete_chaper_question_count` BEFORE DELETEON `network_course`.`questionbank`FOR EACH ROW BEGINupdate `chapter` set`questionCount`=`questionCount`-1where `chapter`.`chapterId`=old.`chapterId`;END$$DELIMITER ;

        这段代码是一个MySQL触发器的定义。触发器是数据库中的一种对象,当某个事件(如插入、更新或删除)发生时,它会自动执行一段预定义的SQL语句。

以下是对这段代码的详细解释:

1. `DELIMITER $$`:这是MySQL的语法,用于改变默认的命令结束符。在这里,它将命令结束符从分号(`;`)改为两个美元符号(`$$`)。这是因为在触发器的SQL语句中,我们需要使用分号来结束每个语句,而触发器的SQL语句本身又需要用分号来结束,所以为了避免混淆,我们使用两个美元符号作为结束符。

2. `CREATE TRIGGER`:这是创建触发器的关键字。

3. `network_course.delete_chaper_question_count`:这是触发器的名称。

4. `BEFORE DELETE ON network_course.questionbank FOR EACH ROW`:这是触发器的定义部分。`BEFORE DELETE`表示这个触发器将在删除操作之前执行。`ON network_course.questionbank`表示这个触发器将作用于`network_course`数据库中的`questionbank`表。`FOR EACH ROW`表示这个触发器将对每一行数据都执行一次。

5. `BEGIN ... END$$`:这是触发器的SQL语句部分。在这个部分中,我们定义了当触发器被触发时要执行的操作。

6. `update chapter set questionCount=questionCount-1 where chapter.chapterId=old.chapterId;`:这是触发器要执行的SQL语句。这条语句的作用是将`chapter`表中与被删除的`questionbank`记录相关联的章节的`questionCount`字段减1。`old`关键字表示被删除的记录。

7. `DELIMITER ;`:这是MySQL的语法,用于将命令结束符改回默认的分号(`;`)。

        总的来说,这段代码定义了一个触发器,当从`questionbank`表中删除一行数据时,它会将相关联的`chapter`表中的`questionCount`字段减1。

(二)班级学生人数触发器

当插入、删除学生时,修改班级表的学生人数

插入时

DELIMITER $$CREATETRIGGER `network_course`.`insert_class_student_count` AFTER INSERTON `network_course`.`student`FOR EACH ROW BEGINUPDATE classSET `classsize`=`classsize` + 1WHERE `classid`= new.classid;END$$
DELIMITER ;

删除时:

DELIMITER $$CREATETRIGGER `network_course`.`delete_class_student_count` BEFORE DELETEON `network_course`.`student`FOR EACH ROW BEGINUPDATE classSET `classsize`=`classsize`-1WHERE `classid`= old.classid;END$$DELIMITER ;

        这段代码是用于在数据库中创建两个触发器,分别用于处理学生表(student)的插入和删除操作。这两个触发器的目的是更新班级表(class)中的班级人数(classsize)。

1. 插入时触发器:`insert_class_student_count`
   - 当在`network_course`数据库的`student`表中插入一条新记录时,这个触发器会被激活。
   - 触发器的功能是在`class`表中,将对应班级的`classsize`字段值加1,表示有新学生加入该班级。
   - 触发器的执行逻辑是:通过`new.classid`获取新插入的学生记录的班级ID,然后在`class`表中查找对应的班级记录,并将其`classsize`字段值加1。

2. 删除时触发器:`delete_class_student_count`
           - 当在`network_course`数据库的`student`表中删除一条记录时,这个触发器会被激活。
   - 触发器的功能是在`class`表中,将对应班级的`classsize`字段值减1,表示有学生离开该班级。
           - 触发器的执行逻辑是:通过`old.classid`获取被删除的学生记录的班级ID,然后在`class`表中查找对应的班级记录,并将其`classsize`字段值减1。

这段代码使用了MySQL数据库的触发器功能,通过定义触发器,可以在数据表的插入和删除操作后自动执行一些额外的逻辑,从而实现对数据的实时更新和管理。

🎯编写存储过程或函数

  • 写出插入一条学生数据的存储过程

DELIMITER $$
CREATEPROCEDURE `network_course`.`insert_student`(in num0 varchar(20),in name0 varchar(20),in pw0 varchar(20),in classid0 varchar(20))BEGINdeclare count1 int;select count(*) into count1 from student where studentnum=num0;if count1=0 theninsert into student(`studentnum`,`studentname`,`studentpw`,`classid`)value(num0 ,name0,pw0,classid0);end if;END$$DELIMITER ;
执行:call `insert_student`("aaaaa",'张三',NULL,1);

        这段代码是一个MySQL存储过程,用于向数据库中的"student"表插入一条新的学生记录。下面是对这段代码的详细解释:

1. 首先,定义了一个名为`insert_student`的存储过程,它接受四个输入参数:`num0`(学生编号),`name0`(学生姓名),`pw0`(学生密码)和`classid0`(班级ID)。

2. 在存储过程内部,首先声明了一个名为`count1`的整型变量,用于存储查询结果。

3. 使用`select count(*) into count1 from student where studentnum=num0;`语句查询"student"表中是否已经存在具有相同学生编号的记录。如果存在,则将查询结果(即记录数)赋值给`count1`。

4. 接下来,使用`if count1=0 then`判断`count1`的值是否为0。如果为0,表示"student"表中不存在具有相同学生编号的记录,可以执行插入操作。

5. 在`if`语句的代码块中,使用`insert into student(`studentnum`,`studentname`,`studentpw`,`classid`) value(num0 ,name0,pw0,classid0);`语句向"student"表中插入一条新的记录。其中,`num0`、`name0`、`pw0`和`classid0`分别对应输入参数的学生编号、姓名、密码和班级ID。

6. 最后,使用`end if;`结束`if`语句,然后使用`END$$`结束存储过程的定义。

7. 在存储过程定义完成后,使用`DELIMITER ;`将分隔符设置回分号(默认值),以便后续的SQL语句可以正常执行。

8. 最后,执行`call `insert_student`("aaaaa",'张三',NULL,1);`语句调用刚刚定义的存储过程,传入学生编号为"aaaaa",姓名为"张三",密码为NULL,班级ID为1的参数。这将向"student"表中插入一条新的学生记录。

class表:

Student表:

  • 写出一次插入多条学生数据的存储过程

学生数据的格式为:“学号1,姓名1,密码1,班级号1;学号2,姓名2,密码2,班级号2;”

DELIMITER $$
CREATEPROCEDURE `network_course`.`insert_student1`(in stustr varchar(5000))BEGINdeclare str1 varchar(200);declare num0 varchar(20);declare	name0 varchar(20);declare pw0 varchar(20);declare classid0 int;declare flag int;while stustr >'' doset str1=mid(stustr,1,locate(';',stustr)-1);set num0=mid(str1,1,locate(',',str1)-1);set str1=mid(str1,locate(',',str1)+1);set name0=mid(str1,1,locate(',',str1)-1);set str1=mid(str1,locate(',',str1)+1);set pw0=mid(str1,1,locate(',',str1)-1);set classid0=cast(mid(str1,locate(',',str1)+1) as signed);call `insert_student`(num0,name0,pw0,classid0);set stustr=mid(stustr,locate(';',stustr)+1);end while;END$$DELIMITER ;
执行call `insert_student1`("123,bbbb,Null,2;1234,cccc,Null,2;");

        这段代码是一个存储过程,用于在数据库中插入一个考试记录和相关的考试细节。下面是对代码的详细解释:

1. 首先,使用`USE`语句选择要操作的数据库,这里是`network_course`。

2. 然后,使用`DROP PROCEDURE IF EXISTS`语句删除名为`inset_exam`的存储过程(如果存在)。

3. 接下来,使用`CREATE DEFINER`语句创建一个新的存储过程`inset_exam`,并指定定义者为`root`@`localhost`。

4. 在存储过程的定义中,声明了一些变量,包括`examid0`、`fromc0`、`toc0`、`type0`、`diff0`、`c0`和`done`。其中,`done`变量用于控制循环结束的条件。

5. 使用`DECLARE cur CURSOR FOR`语句创建一个游标`cur`,用于从`exam_rule`表中检索数据。查询结果按照`exam_ruleid`排序。

6. 使用`DECLARE continue HANDLER FOR not found set done=true;`语句定义了一个处理程序,当游标没有找到数据时,将`done`变量设置为`true`,以结束循环。

7. 使用`select count(*) into c0 from exam where studentid=studentid0;`语句查询`exam`表中与给定学生ID匹配的记录数,并将结果存储在变量`c0`中。

8. 如果`c0`等于0,表示该学生尚未参加过考试,那么执行以下操作:
   - 使用`insert into`语句向`exam`表中插入一条新的记录,设置学生ID、状态和分数。
   - 使用`select @@identity into examid0;`语句获取刚刚插入的记录的ID,并将其存储在变量`examid0`中。
   - 打开游标`cur`。
   - 使用`FETCH cur INTO fromc0, toc0 ,type0,diff0,c0;`语句从游标中获取一行数据,并将其分别存储在变量`fromc0`、`toc0`、`type0`、`diff0`和`c0`中。
   - 进入循环,执行以下操作:
     - 使用`insert into`语句向`exam_detail`表中插入多条记录,每条记录包含考试ID、问题ID、答案和成绩。这些记录是根据条件从`questionbank`表中随机选择的,条件包括章节ID范围、类型和难度等。
     - 使用`FETCH cur INTO fromc0, toc0 ,type0,diff0,c0;`语句获取下一行数据,并重复循环直到游标遍历完所有数据。
   - 关闭游标`cur`。

9. 最后,使用`END`语句结束存储过程的定义。

10. 使用`DELIMITER ;`语句将分隔符设置回分号。

11. 运行`call inset_exam(1)`语句调用存储过程,并传入参数1作为学生ID。

class表:

student表:

CAST( 字符串 AS SIGNED);  将字符串类型的数字转化为数字类型的数字

生成学生试卷

输入参数:学生帐号,按照规则生成学生试卷总表以及试卷明细表

DELIMITER $$USE `network_course`$$DROP PROCEDURE IF EXISTS `inset_exam`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `inset_exam`(in studentid0 int)
BEGINdeclare examid0 int;declare fromc0 int;declare toc0 int;declare type0 int;declare diff0 int;declare c0 int;declare done int Default false;DECLARE cur CURSOR FOR select `fromchapterid`,`tochapterid`,`type`,`difficulty`,`count` from `exam_rule` order by `exam_ruleid`;DECLARE continue HANDLER FOR not found set done=true;select count(*) into c0 from exam where studentid=studentid0;if c0=0 theninsert into `exam`(`studentid`,`state`,`score`)values(studentid0,0,0);select @@identity into examid0;OPEN cur ;FETCH cur INTO fromc0, toc0 ,type0,diff0,c0;while(not done) doinsert into `exam_detail`(`examid`,`questionid`,`answer`,`grade`) select examid0 AS examid,`questionid`,'' as answer,0 as gradefrom questionbank where `chapterId`>=fromc0 and chapterid<=toc0and `type`=type0 and `difficulty`=diff0 order by rand() limit c0;FETCH cur INTO fromc0, toc0 ,type0,diff0,c0;end while;CLOSE cur;end if;END$$DELIMITER ;
运行call `inset_exam`(1)

exam表:

exam_detail表

生成班级试卷

输入参数:班级ID,按照规则生成班级所有学生的试卷总表以及试卷明细表

DELIMITER $$CREATEPROCEDURE `network_course`.`insert_exam0`(in classid0 int)BEGINdeclare examid0 int;declare stuid0 int;declare done int default false;DECLARE cur CURSOR FOR select studentid from student where classid=classid0;DECLARE continue HANDLER FOR not found set done=true;OPEN cur ;FETCH cur INTO stuid0;while(not done) docall `inset_exam`(stuid0);FETCH cur INTO stuid0;end while;CLOSE cur ;END$$DELIMITER ;
执行:call `insert_exam0`(2)

        这段代码是一个MySQL存储过程,用于为特定班级的所有学生插入考试记录。下面是对这段代码的详细解释:

1. 首先,定义了一个名为`insert_exam0`的存储过程,它接受一个输入参数`classid0`,表示班级ID。

2. 在存储过程内部,声明了三个变量:`examid0`、`stuid0`和`done`。其中,`examid0`用于存储考试ID,`stuid0`用于存储学生ID,`done`用于控制循环结束的条件,默认值为`false`。

3. 使用`DECLARE cur CURSOR FOR`语句创建了一个游标`cur`,用于从`student`表中查询指定班级ID的学生ID。

4. 使用`DECLARE continue HANDLER FOR not found set done=true;`语句定义了一个处理程序,当游标没有找到任何记录时,将`done`设置为`true`,以结束循环。

5. 使用`OPEN cur;`语句打开游标。

6. 使用`FETCH cur INTO stuid0;`语句从游标中获取第一个学生ID,并将其赋值给`stuid0`。

7. 使用`while(not done) do`循环遍历所有学生ID。在循环内部,调用`inset_exam`存储过程为当前学生ID插入考试记录。然后再次使用`FETCH cur INTO stuid0;`获取下一个学生ID。当游标没有更多记录时,循环结束。

8. 使用`CLOSE cur;`语句关闭游标。

9. 最后,使用`END$$`结束存储过程的定义。

10. 设置分隔符为`;`,以便在执行完存储过程后可以继续编写其他SQL语句。

11. 使用`call `insert_exam0`(2);`语句调用存储过程,传入班级ID为2。

        这段代码的主要功能是为班级ID为2的所有学生插入考试记录。通过游标遍历学生表,并为每个学生调用`inset_exam`存储过程插入考试记录。

exam表:

exam_detail表

🎯游标知识扩展

1、游标的概念

使用SQL语句查询,结果将返回很多记录,存储过程中,如果要对每一条查询记录做一些处理,需要使用游标来对查询结果集中的记录进行逐条读取,以便于逐条处理。

例如:

  1. 学生帐号,按照规则生成学生试卷总表以及试卷明细表。

规则表中存储了多条生成规则,要逐条处理。

(2)要根据班级ID,按照规则生成班级所有学生的试卷总表以及试卷明细表。

学生表中存在多条该班级的学生记录,需要逐个学生处理。

  1. 游标的语法

使用游标一般需要下面几个步骤

  1. 声明游标
  2. 异常处理
  3. 打开光标
  4. 通过游标获取一条记录(要循环)
  5. 关闭光标

具体格式如下:

DECLARE cursor_name CURSOR FOR select_statement;DECLARE{ EXIT | CONTINUE|UNDO }HANDLER FOR{ error-number | { SQLSTATE error-string } | condition }SQL statement;OPEN cursor_name ;FETCH cursor_name INTO var_name[,var_name…] ;CLOSE cursor_name ;

说明:

(1)其中cursor_name表示光标的名字,select_statement代表SELECT语句的内容,返回一个用于创建光标的结果集。

(2)当程序出错后自动触发的代码。MySQL允许三种处理器,一种是EXIT处理,遇到错误马上退出。另一种CONTINUE是遇到错误主程序仍然继续运行,第三种是UNDO 遇到错误撤销之前的操作。

(3){ error-number | { SQLSTATE error-string } | condition }:触发条件,主要有

  1. MYSQL错误代码
  2. ANSI-standard SQLSTATE code
  3. 命名条件。可使用系统内置的SQLEXCEPTION,SQLWARNING和NOT FOUND

3、随机查找表中的n条数据

Select *  FROM 表ORDER BY RAND() LIMIT n;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/10057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element-plus表单上传,唯一替换文件校验,封装方法统一管理

<el-formref"ruleFormRef":model"ruleForm":rules"rules"label-width"110px" ><el-form-item label"语言成绩材料" prop"languageList"><div class"dis-flex w100"><el-uploadref…

什么是Meme币?——区块链技术的加密货币

Meme代币是一种基于区块链技术的加密货币&#xff0c;旨在为用户提供一种简单、有趣且易于传播的方式来进行数字资产交易和投资。Meme代币通常与特定的主题或故事相关联&#xff0c;通过社交媒体等渠道进行传播和推广&#xff0c;吸引更多的用户参与并增加其价值。 Meme代币的…

英语学习笔记4——Is this your ...?

Is this your …? 词汇 Vocabulary suit /sut/ n. 西装&#xff0c;正装 suit 的配套&#xff1a; shirt n. 衬衫tie n. 领带&#xff0c;领结belt n. 腰带trousers n. 裤子shoes n. 鞋子 school /skuːl/ n. 学校 所有学校 搭配&#xff1a;middle school 初中    hig…

浅谈现代消息队列与云存储

一、前言 1970 年代末&#xff0c;消息系统用于管理多主机的打印作业&#xff0c;这种削峰解耦的能力逐渐被标准化为“点对点模型”和稍复杂的“发布订阅模型”&#xff0c;实现了数据处理的分布式协同。随着时代的发展&#xff0c;Kafka&#xff0c;Amazon SQS&#xff0c;Ro…

C++牛客小白月赛题目分享(1)生不逢七,交换数字,幻兽帕鲁

目录 1.前言 2.三道题目 1.生不逢七 1.题目描述 2.输入描述: 3.输出描述: 4.示例&#xff1a; 5.题解&#xff1a; 2.交换数字 1.题目描述&#xff1a; 2.输入描述&#xff1a; ​编辑 3.输出描述&#xff1a; 4.示例&#xff1a; 5.题解&#xff1a; 3.幻兽帕…

探索震坤行API:一键解锁高效工业用品采购新纪元!

震坤行是一家专注于工业用品的B2B电商平台&#xff0c;为企业客户提供一站式的工业用品采购服务。虽然震坤行没有直接公开通用的API接口供开发者调用&#xff0c;但通常大型企业或合作伙伴之间可以通过API进行系统集成和数据交互。以下是一个假设性的震坤行API接口调用示例与代…

STM32_HAL_RTC_中断实现闹钟

1STM32设置 在STM32Cude中设置RTC//具体设置看先前发的文章 再打开闹钟中断&#xff08;如下图&#xff09; 2代码思路 2.1启动闹钟&#xff08;HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,FORMAT_BCD)&#xff09; 2.2设置回调函数&#xff08;void HAL_RTC_AlarmAEventC…

ICRA 2024 成果介绍:基于 RRT* 的连续体机器人高效轨迹规划方法

近来&#xff0c;连续体机器人研究受到越来越多的关注。其灵活度高&#xff0c;可以调整形状适应动态环境&#xff0c;特别适合于微创手术、工业⽣产以及危险环境探索等应用。 连续体机器人拥有无限自由度&#xff08;DoF&#xff09;&#xff0c;为执行空间探索等任务提供了灵…

YOLOv8火焰与烟雾智能检测系统

项目概述&#xff1a; 本项目旨在开发一款高效、实时的火焰与烟雾检测系统&#xff0c;利用先进的深度学习技术——YOLOv8&#xff0c;为安全监控领域提供智能化解决方案。系统不仅能够准确识别视频流或静态图像中的火焰与烟雾&#xff0c;还配备了用户友好的图形界面&#xff…

Spring框架中常见注解

Spring&#xff1a; SpringMVC&#xff1a; RequestMapping用在类上表示所有该类下方法的父路径 RequestParam 做映射&#xff0c;前端请求的参数映射到控制器Controller的处理方法上的参数上。 【当参数需要设置默认值&#xff08;前端没有发送这个参数&#xff09;、参数名…

机器人种类分析

2000年前&#xff0c;机器人主要应用于工业生产&#xff0c;俗称工业机器人&#xff0c;由示教器操控&#xff0c;帮助工厂释放劳动力&#xff0c;此时的机器人并没有太多智能而言&#xff0c;完全按照人类的命令执行动作&#xff0c;更加关注电气层面的驱动器、伺服电机、减速…

mysql中sql语句 exists 判断子句的用法

如果子查询成立才执行父查询 exists判断子查询的使用例子&#xff1a; 张三不存在所以前面的父查询不执行 后面的子句结果存在&#xff0c;所以前面的父查询被执行 where条件所连接的嵌套子查询都是&#xff0c;条件子查询 ———————————————————————…

STL——deque容器【双端动态数组】

deque容器的基本概念&#xff1a; 功能&#xff1a;双端数组&#xff0c;可以对头端进行插入删除操作 deque与vector的区别&#xff1a; vector队友头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低deque相对而言&#xff0c;对头部的插入删除速度会比vecto…

QT+多线程TCP服务器+进阶版

针对之前的服务器&#xff0c;如果子线程工作类里面需要使用socket发送消息&#xff0c;必须要使用信号与槽的方法&#xff0c; 先发送一个信号给父进程&#xff0c;父进程调用socket发送消息&#xff08;原因是QT防止父子进程抢夺同一资源&#xff0c;因此直接规定父子进程不能…

C脚本实现WIncc模拟量趋势窗口弹出

文章目录 前言一、步骤及解析二、运行画面演示三、总结 前言 本文给出了一种基于C脚本实现点击输入输出域对象&#xff0c;弹出对应模拟量趋势窗口的方法。 一、步骤及解析 在Wincc变量管理中&#xff0c;添加两个变量&#xff1b; 示例如下&#xff1a; 将以上两个变量添加到…

在新页面中跳转到指定 div容器位置

要在打开新的页面时跳转到指定 div&#xff0c;我们需要结合 HTML、JavaScript 和后端技术来实现。以下是两种常见的方法&#xff1a; 使用 URL 参数传递目标 div 信息 HTML (新页面): 在新页面的链接中&#xff0c;添加参数来指示目标 div 的 id&#xff0c;例如&#xff1a;…

测试docker GPU性能损失

NVIDIA 3090 利用HSOpticalFlow代码测试docker GPU性能损失 docker介绍图如下&#xff1a; 形象生动展示了他们之间的关系 今天要测试docker容器运行HSOpticalFlow算法的性能损失&#xff0c;包括CPU和GPU 上一篇博客 http://t.csdnimg.cn/YW5kE 我已经介绍了使用docker和nvid…

[Linux_IMX6ULL驱动开发]-GPIO子系统和Pinctrl子系统

目录 Pinctrl子系统的概念 GPIO子系统的概念 定义自己的GPIO节点 GPIO子系统的函数 引脚号的确定 基于GPIO子系统的驱动程序 驱动程序 设备树修改 之前我们进行驱动开发的时候&#xff0c;对于硬件的操作是依赖于ioremap对寄存器的物理地址进行映射&#xff0c;以此来达…

【020】基于JavaWeb实现的批报管理系统

项目介绍 基于jspservlet实现的批报管理系统采用B/S架构,该项目设计了一个角色管理员&#xff0c;管理员实现了我的案件、查询统计、项目维护等三大功能模块 技术栈 开发工具&#xff1a;Idea2020.3 运行环境&#xff1a;jdk1.8tomcat9.0mysql5.7 服务端技术&#xff1a;j…

麦肯锡专访 Mistral AI CEO:三五年后的工作,要比现在更有意义

【编者按】总部位于巴黎的人工智能初创公司 Mistral AI 成立仅一年&#xff0c;就被誉为现有大模型巨头的有力挑战者。 今年 2 月&#xff0c;Mistral AI 正式发布了旗舰级大模型 Mistral Large&#xff0c;直接对标 OpenAI 的 GPT-4&#xff1b;几周前&#xff0c;Mistral AI…