首页 MySQL

10-MySQL存储函数触发器实训-题目:

题目1

1创建一个存储函数XXX_1,返回员工的总人数EM_NUM(),调用该函数,显示员工总人数。


题目2

创建一个存储函数XXX_2,判断员工是否在研发部工作,若是则返回其学历,若不是则返回“NO”,使用该函数查询员工“李玉珉”和“李丽”的情况


题目3

创建触发器XXX_3,在Employees表中当删除员工信息的同时将Salary表中与该员工有关的数据全部删除,删除员工“叶凡”的信息,验证该触发器是否执行。


题目4

创建触发器XXX_4,实现当向Employees表插入一行数据时,对Salary表也插入一行,插入到salary表的数据中的“员工编号”与插入Employees表中的相同,收入和支出均为0


题目4

创建触发器XXX_5,实现若将Employees表中员工的工作年限增加n年,收入增加n*500,将员工“王林”的工作年限增加2年,验证该触发器是否执行

10-MySQL存储函数触发器实训-代码:

/*1.创建一个存储函数XXX_1,返回员工的总人数EM_NUM()
调用该函数,显示员工总人数。
*/
#创建存储函数(存储过程(函数)开始结束符号可以省略)
create function test_1 ()
returns integer #指定返回值类型
#返回查询employees的行数
return (select count(*) from employees);

#调用函数,使用as重命名列名(表名),为了方便理解
select test_2() as '数量';


/*2.创建一个存储函数XXX_2,判断员工是否在研发部工作
若是则返回其学历,若不是则返回“NO”
使用该函数查询员工“李玉珉”和“李丽”的情况
*/
#创建存储函数
delimiter $$  #声明语句结束符
create function test_2(name char(4))  #声明存储过程(函数) 
Returns char(20) #指定返回值类型
begin  #存储过程(函数)开始符号
declare d_id char(3); #局部变量定义(局部变量定义一定要放在存储过程(函数)体的开始)
declare d_name char(20); #局部变量定义(局部变量定义一定要放在存储过程(函数)体的开始)
#查询该名员工的员工部门号,将结果存储在变量d_id中
select 员工部门号 into d_id from employees where 姓名 = name;
#查询员工部门编号为 d_id 的部门名称
select 部门名称 into d_name from departments where 部门编号 = d_id;
#if-else语句(if-then-else语句) d_name是否为研发部,是就查询这个人学习,否就返回NO
if d_name = '研发部' then return(select 学历 from employees where 姓名 = name);
else return 'NO';
end if; #注意分号,表明语句结束
end $$ #存储过程(函数)结束符号
delimiter ; 
#声明语句结束符

#调用函数查询员工
select test_2 ('李丽'), test_2 ('李玉珉');


/*3.创建触发器XXX_3,在Employees表中当删除员工信息的同时将Salary表中与该员工有关的数据全部删除
删除员工“叶凡”的信息,验证该触发器是否执行。
这个思路是因为删除的是一整行数据,而其中就有员工编号,所以可以直接拿来用
https://www.cnblogs.com/geaozhang/p/6819648.html#chuangjian
*/ 
delimiter $$ #声明语句结束符
#创建名为test_3的触发器,事件之后删除,在employees表
create trigger test_3 after delete on employees
#频率:每行数据触发一次
for each row
begin #触发器开始符
delete from Salary where 员工编号 = old.员工编号;
#触发器结束符,语句结束符
end $$
#声明语句结束符
delimiter ;

#验证触发器是否正确执行
#删除employees表叶凡(如果删除成功,查询一下Salary表是否还有他的数据)
delete from employees where 姓名 = '叶凡';
#查询Salary表所有内容
select * from Salary;


/*4.创建触发器XXX_4
实现当向Employees表插入一行数据时,对Salary表也插入一行,插入到salary表的数据中的“员工编号”与插入Employees表中的相同,收入和支出均为0
插入数据验证触发器是否被执行(员工编号为123456)*/
#声明语句结束符
delimiter $$
#创建触发器test_4,事件之后插入,在employees表中
create trigger test_4 after insert on employees
#频率:每行数据触发一次
for each row
#触发器开始符
begin
#向Salary表插入数据员工编号与employees表添加相同,收入支出为零
insert into Salary values(new.员工编号,0,0);
#触发器结束符
end $$
#声明语句结束符
delimiter ; 

#验证触发器是否正确执行
#向employees表插入数据:编号为123456,其余任意(可使用values,简化流程),注意语法
insert into employees values('123456','张三','1','1','1','1','1','1','1');
#查询employees表全部数据
select * from employees;
#查询Slary表全部数据
select * from Salary;


/*5.创建触发器XXX_5
实现若将Employees表中员工的工作年限增加n年,收入增加n*500
将员工“王林”的工作年限增加2年,验证该触发器是否执行*/
#声明语句结束符
delimiter $$
#创建触发器test_5,事件之后更新数据,在employees中
create trigger test_5 after update on employees 
#频率:每行数据触发一次
for each row
#触发器开始符
begin
#更新Salary表,收入增加
update Salary set 收入 = 收入 + (new.工作年限 - old.工作年限)*500 where 员工编号 = new.员工编号;
#触发器结束符,语句结束符
end $$
#声明语句结束符
delimiter ;


#更新employees表王林工作年限
update employees set 工作年限 = 10 where 姓名='王林'; 
#查询empolyees表全部内容
select * from employees;
#查询Salary表全部内容
select * from Salary;



文章评论