注:存储过程能在5.0或者更高的版本中使用。
存储过程:
将多个SQL语句组合成一个只需要使用命令"call xx"就能执行的集合,该集合就称作存储过程。
存储表示保存,过程表示步骤。
也就是说存储过程就是将一系列步骤归纳并存储起来的集合。
因为可以自动执行事先准备好的命令,所以处理效率很高。
但是,在存储重要数据中,执行没有经过充分验证的存储过程是非常危险的。
创建存储过程:
create procedure 存储过程名()
begin
SQL语句1
SQL语句2
end
从begin到end的内容是存储过程的主体。
分隔符的问题:
因为存储过程的内容是普通的SQL语句,所以需要在命令的末尾添加分隔符 ;
begin
sql1;
sql2;
end
这样create procedure命令就会在存储过程不完整的状态下执行。因为MYSQL监视器中一旦输入了分隔符,不管是什么内容,都会先执行分隔符之前的部分。
解决方法:修改分割符的设置
在创建存储过程中,需要事先将分隔符从;修改为其他符合,一般使用 //
delimiter //
例:创建一个存储过程执行显示tb和tb1
delimiter //
create procedure pr1()
begin
select * from tb;
select * from tb1;
end
//delimiter ;
执行存储过程:
例:调用上一例的pr1
call pr1;
创建带参数的存储过程:
create procedure 存储过程名(参数名 数据类型);
例:创建一个显示销售额大于等于指定值的记录.并执行存储过程
delimiter //
create procedure pr(d int)
begin
select * from tb where sales>=d;
end
call pr(200);
注:在参数前面加上in也会得到相同的结果(in d int);
显示存储过程的内容:
show create procedure pr;
删除存储过程
drop procedure 存储过程名;
存储函数:存储函数的思考方式和操作方法与存储过程基本相同。与存储过程唯一不同的是,存储函数在执行后会返回一个值。
存储函数可以作为函数工作,可以使用存储函数创建自定义函数。所以存储函数又叫用户自定义函数。
存储函数返回的值可以在select 和update等命令中和普通函数一样使用。
create function 存储函数名(参数 数据类型)returns 返回值的数据类型
begin
SQL语句
return 返回值 表达式
end
声明变量:
declare 变量名 变量类型;
给变量赋值:
a into b;//b=a;
练习:使用存储函数计算标准体重
标准体重=身高*身高(cm)*22/10000
delimiter //
create function fu1(height int) returns double
begin
return height*height*22/10000;
end
//
delimiter;
select fu1(174);
练习:返回sales列的平均值
delimiter //
create function fun2() return double
begin
declare r double;
select avg(sales) into r from tb;
return r;
end
//
delimiter ;
select fun2();
显示存储函数的内容
show create function 存储函数名;
删除存储函数
drop function 存储函数名;
触发器:一种对表执行某操作后会触发执行其他命令的机制。
当执行insert,update,delete等命令时,作为触发器提前设置好的操作也会被执行。
触发器也常作为处理的记录或者处理失败时的备份使用。
触发器被触发的时机:
before:在对表进行处理之前触发
after:在对表进行处理之后触发
获取表处理之前的列值:old. 列名
获取表处理之后的列值: new.列名
但是根据命令的不同,有的列值可以取出来,有的列值取出来
例:创建一个”如果删除表中的记录,被删除的记录就会复制到其他表中“的触发器。
事先创建一个空表tb1用于插入tb中删除的记录
create table tb1 like tb;
创建触发器并删除tb
delimiter //
create trigger tr before delete on tb1 for each row
begin
insert into tb1(old.id,old.name,old.age);
end
//
delimiter ;
delete from tb1;
确认设置的触发器:
show triggers;
删除触发器:
drop trigger 触发器名;