MySQL数据库学习笔记(九)实验课六之触发器和存储过程

没想到这就是最后一次实验了。

一点知识:

道具 – delimiter / DELIMITER

这是用于指定语句分隔符的特殊命令
默认情况下,MySQL使用分号(;)作为语句的结束符。然而,当我们需要定义存储过程、触发器或函数等包含多条SQL语句的对象时,分号会被误认为语句结束,导致出现语法错误。
为了解决这个问题,可以使用DELIMITER命令将分号(;)替换为其他字符作为语句分隔符,以便在创建存储过程、触发器或函数等对象时,正确处理多条SQL语句。
用法:

DELIMITER //
内容
DELIMITER ;

主动技能 – 存储过程

因为要调用,所以类似于英雄主动技能
创建存储过程:

create procedure 名字()
begin
	具体内容
end;

有参数:

create procedure 名字(
in 参数1 int,
in 参数2 int
)
begin
	具体内容
end;

删除存储过程:

drop procedure 名字;

调用存储过程

call 名字

被动技能 – 触发器

不需要调用,类似于被动技能
推荐文章:文章
不得不说,你如果想要狠狠搞清楚触发器怎么用的话,我还是推荐你看推荐文章
创建触发器:

create trigger 名字
前/后 触发方式 表名
for each row
begin
··········
end;

删除触发器:

drop trigger 名字;

实验:

实验数据:

student表:
在这里插入图片描述
student1表:
在这里插入图片描述
course表:
在这里插入图片描述
sc表:
在这里插入图片描述
teacher表:
在这里插入图片描述

实验开始:

1,创建存储过程,使用 student 表中的学生人数来初始化一个局部变量, 并调用这个存储过程:

DELIMITER //
create procedure GetStudentCount()
begin
    declare studentCount int;	#定义局部变量

    select count(*) into studentCount from student; #数行数
    # select count(*) into a 的意思是将count(*)的值赋给a

    select studentCount AS StudentCount;

end //
DELIMITER ;

调用:

call GetStudentCount();

2,创建存储过程,比较两学生的年龄,若前者比后者大就输出 0,否则输 出 1:

delimiter //
create procedure CompareStudentAge(
    in student1_num int,
    in student2_num int
)	#我使用的参数是学生编号,你也可以尝试不同的写法
begin
    declare result int;
    declare age1 int;
    declare age2 int;
    select Sage into age1 from student where Sno = student1_num;
    select Sage into age2 from student where Sno = student2_num; #进行查询操作

    if age1 > age2 then
        set result = 1;
    else
        set result = 0;
    end if;

    select result as CompareResult;

end //
delimiter ;

调用:

call CompareStudentAge(2008001,2008003);

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

delimiter //
create trigger delete_student_sc
before delete on student
for each row
begin
    delete from sc where Sno = OLD.Sno;
end;
delimiter ;

触发:

delete from student where Sno = 2008002;

4,假设 student1 表和 student 表的结构和内容都相同,在 student 上创建 一个触发器,如果添加一个学生的信息,该信息也会被添加到 student1 表中:

delimiter //
create trigger add_student_st1
after insert on student
for each row
begin
    insert into student1 (Sno, Sname, Ssex, Sage, Sdept)
    VALUES (new.Sno, new.Sname, new.Ssex, new.Sage, new.Sdept);
end;
delimiter ;

触发:

insert into student(sno, sname, ssex, sage, sdept) VALUES ('2008006','杨过','男','19','IS');

5,定义一个 BEFORE 行级触发器,为 teacher 表定义完整性规则“插入教 授的信息时,工资不得低于 4000 元,如果低于 4000 元,则自动改为 4000 元”:

delimiter //
create trigger teacher_income
before insert on teacher
for each row
begin
    if new.Income < 4000 then
        set new.Income = 4000;
    end if;
end;
delimiter ;

6,删除 teacher 表上的触发器 teacher_Income :

drop trigger teacher_income;

结束~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实验四 存储过程触发器与索引 一、实验目的 1.熟悉大型数据库实验环境,以MS SQL SERVER为例; 2.掌握视图; 3.掌握存储过程触发器; 4.掌握MS SQL SERVER的导入和导出; 5.掌握MS SQL SERVER的索引。 二、实验内容 (1)使用“实验一”中的数据库“abc”,创建一个视图,生产厂家为“北京”且价格低于北京生产的产品的平均价格,输出产品的名称、价格和生产厂家。 (2)使用“实验一”中的数据库“abc”,创建一个带有输入参数的存储过程proc_abc,查询指定职工的销售记录,用户输入职工编号,存储过程返回职工名称、产品名称、销售日期、销售数量,假如执行存储过程时所提供的“职工编号”不存在,存储过程应给予一定的提示。 (3)使用“实验一”中的数据库“abc”,练习使用游标, 写出按如下报表形式显示结果的SQL语句,该报表查询每年每种产品总销售金额,(总销售金额=价格*销量),报表显示格式如下所示: 年 产品号 产品名 销售总量 总销售金额(万元) 2001年 2 AAA 590 3.2 2001年 5 BBB 644 23.3 2002年 1 CCC 32 0.2 (4)使用“实验一”中的数据库“abc”,练习使用触发器,在销售表上创建触发器tr_updateprice,每次新增销售记录时,自动更新产品表的单价,更新方法是:每增加一笔销售记录,就将该产品的单价减去1块钱。 (5)将100万行网络连接监控数据Netflow导入数据库,创建多个索引,观察创建索引对数据库文件大小的影响;并设计不同的查询语句来观察索引对查询效率的影响;可以尝试将100万行记录扩展为1000万行,然后再做索引和查询的实验?文件见附件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

泉绮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值