Mysql数据库实验报告--实验五 存储过程和触发器

在这个系列会更新一些最近老师要求写的实验报告~
大家尽量对着我的文章做一个参考,不要盲目的cv,毕竟这个对于我们以后的工作学习还是十分重要的。

从这个实验开始,就不在cmd命令行里面进行mysql数据库的操作,因为代码长度和代码的复杂性,需使用 MySQL Workbench:
在这里插入图片描述
双击数据库(密码还是启动cmd命令行的密码)
在这里插入图片描述
使用示例:
查询databases

show databases;

运行当前行:ctrl+enter
在这里插入图片描述
其他常用快捷方式:
1、执行整篇sql脚本:【Ctrl】+【Shift】+【Enter】

2、执行当前行:【Ctrl】+【Enter】

3、注释/取消注释:【Ctrl】+【/】

4、格式化sql语句(美化sql语句):【Ctrl】+【B】

5、自动补全:【Ctrl】+【Space】


事不宜迟,贴上本次实验的题目:

创建学生表,课程表,选课表。

#创建学生表:包括学号,姓名,年龄,性别,院系
CREATE TABLE student
(
Sno VARCHAR(7)PRIMARY KEY,
Sname VARCHAR(10)NOT NULL,
Sage INT,
Ssex VARCHAR(2),
Sdept VARCHAR(20) DEFAULT '计算机系'
);

#创建课程表:包括课程号,课程名,选修课课程号,学分
CREATE TABLE course
(
Cno VARCHAR(10)PRIMARY KEY,
Cname VARCHAR (20)NOT NULL,
Cpno VARCHAR(10),
Ccredit INT
);


#创建选课表
CREATE TABLE sc
(
Sno VARCHAR(7),
Cno VARCHAR(10),
grade INT,
FOREIGN KEY (sno) REFERENCES student(Sno),
FOREIGN KEY (cno) REFERENCES course(cno)
);

向表中插入数据:

#  向学生表S中插入数据
INSERT INTO student
   (Sno,Sname,Sage,Ssex,Sdept)
VALUE
   ("10001","张三",20,'男','计算机'),
   ("10002","李梅",19,'女','计算机'),
   ("10003","王五",18,'男','CS'),
   ("10004","小明",21,'男','计算机'),
   ("10006","黎明",18,'男','艺术表演'),
   ("10008","杰克",21,'男','计算机'),
   ("10005","小红",22,'女','CS');

#  向课程表C中插入数据   
INSERT INTO course
   (Cno,Cname,Cpno,Ccredit)
VALUE
   ("1","离散数学",NULL,5),
   ("2","线性代数",'3',6),
   ("3","高等数学",NULL,4),
   ("4","数据结构",'3',6),
   ("5","操作系统",'1',4),
   ("6","数据库",'4',5);



#  向选课表SC中插入数据  
INSERT INTO sc
  (Sno,Cno,grade)
VALUE
  ("10001","1",70),
  ("10001","6",56),
  ("10003","4",90),
  ("10003","5",83),
  ("10004","1",75),
  ("10004","3",90),
  ("10008","1",70),
  ("10008","5",70),
  ("10008","6",88),
  ("10002","1",85),
  ("10002","6",89);

一、创建并调用如下的存储过程。

1、 定义一个存储函数,按性别计算所有学生的平均年龄。

delimiter //
create procedure avg_age_sex(in stu_sex varchar(30))
begin
select avg(Sage) from student where Ssex=stu_sex;
end//
delimiter ;
call avg_age_sex('女');

2、 编写存储过程,根据给定的学生学号,计算该生的平均成绩

delimiter //
create procedure avg_grade_cno1(in stu_cno int)
begin
select avg(grade) as '平均成绩' from sc where Cno=stu_cno;
end//
delimiter ;

call avg_grade_cno1(1);

3、 创建存储过程,能够查询出指定课程(课程名)的平均成绩,并用OUT参数返回结果。

delimiter //
create procedure avg_grade7(in stu_cno varchar(30),out avgsc1 decimal(6,4))
begin
select avg(grade) as '平均成绩' from sc,course where course.Cname=stu_cno and course.Cno=sc.Cno;
end//
delimiter ;
set @avgsc1 = 60;
call avg_grade7('高等数学',@avgsc1);
select @avgsc1;

4、创建存储过程p_Insertstu,实现向学生数据表中插入一个新同学,并提供相应的实参值(实参值由用户自定)。

delimiter //
create  procedure p_Insertstu(in Sno varchar(7),in Sname varchar(10),in Sage int,in Ssex varchar(2),in Sdept varchar(20))
reads sql data
begin
insert into student values(Sno,Sname,Sage,Ssex,Sdept);
end//
delimiter ;
call p_Insertstu('10009','紫涵','20','女','计算机');
select  * from student;

二、创建触发器。

1、创建触发器,在学生表中删除学生信息的同时将选课信息表中该学生的选课信息删除,以确保数据的完整性;

#关闭安全模式
show variables like 'SQL_SAFE_UPDATES';
SET SQL_SAFE_UPDATES = 0;
drop trigger if exists delete_stu;
#题目代码
delimiter //
create trigger delete_stu1
after delete on student
for each row
begin 
	delete from sc where sc.Sno=@Sno;
end //

2、创建触发器,在选课信息表中添加学生选课信息的同时,增加学生表中该学生的选课数量信息,以确保数据的完整性;

delimiter //
create trigger update_stu1
after insert on sc
for each row
begin 
	set @csum=0;
    select count(Sno) into @csum from sc where Sno=@Sno;
	update student set csum=@csum where Sno=@sno;
end //

完整sql文件:
链接:https://pan.baidu.com/s/1PD_mD9Q-uCNQPANq2TmFew?pwd=69ev
提取码:69ev

推荐一个b站讲的不错的视频:
mysql数据库高级篇

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实验的目的是掌握数据库存储过程触发器创建和应用,以及了解它们在实际应用中的作用。本实验使用的数据库MySQL。 一、实验环境 1. MySQL数据库 2. Navicat数据管理工具 二、实验步骤 1. 数据库建立 本实验中使用的数据库为sdut,可以通过Navicat工具新建一个MySQL数据库。 2. 学生创建 学生包含学号、姓名、性别、年龄、所在班级等字段,可以通过下面的SQL语句创建: ```sql CREATE TABLE student ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20), sex CHAR(2), age INT, class_id INT ); ``` 3. 学生的数据插入 可以使用下面的SQL语句向学生中插入一些数据: ```sql INSERT INTO student (name, sex, age, class_id) VALUES ('张三', '男', 18, 1), ('李四', '女', 19, 2), ('王', '男', 20, 3), ('赵六', '女', 21, 1), ('钱七', '男', 22, 2); ``` 4. 存储过程创建 存储过程是一段预定义好的SQL语句集合,可以在需要时直接调用,可以减少数据库服务器的负担和网络传输的时间。本实验创建一个存储过程,用于统计每个班级的学生总数。 ```sql CREATE PROCEDURE count_student() BEGIN SELECT class_id, COUNT(*) AS total FROM student GROUP BY class_id; END; ``` 上面的存储过程会查询学生中的数据,并按照班级进行分组,然后统计每个班级的学生总数。 5. 触发器创建 触发器是一段SQL语句,可以在数据库的某个操作(如插入、更新、删除)发生时自动触发执行。本实验创建一个触发器,用于在学生中插入数据时自动更新班级中的学生总数。 ```sql CREATE TRIGGER update_class AFTER INSERT ON student FOR EACH ROW BEGIN UPDATE class SET total = total + 1 WHERE id = NEW.class_id; END; ``` 上面的触发器会在学生中插入数据时自动执行,将对应班级的学生总数加1。 6. 实验结果 可以通过以下两种方式验证存储过程触发器的正确性: (1)调用存储过程 可以使用下面的SQL语句调用存储过程: ```sql CALL count_student(); ``` 调用结果如下: ``` class_id | total ---------|------ 1 | 2 2 | 2 3 | 1 ``` 可以看到存储过程成功统计了每个班级的学生总数。 (2)插入数据 可以使用下面的SQL语句向学生中插入一条数据: ```sql INSERT INTO student (name, sex, age, class_id) VALUES ('孙八', '女', 23, 3); ``` 插入数据后,可以查询班级的数据,验证触发器是否成功更新了学生总数: ```sql SELECT * FROM class; ``` 查询结果如下: ``` id | name | total ---|------|------ 1 | 一班 | 2 2 | 二班 | 2 3 | 三班 | 2 ``` 可以看到触发器成功将三班的学生总数从1更新为2。 三、实验总结 本实验通过创建存储过程触发器,成功实现了统计班级学生总数和自动更新班级学生总数功能。存储过程触发器可以大大减少数据库服务器的负担和网络传输的时间,提高了数据库的性能和响应速度,是数据库管理中常用的技术手段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码堆里上蹿下跳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值