MySQL基础-22存储过程和函数

声明:此MySQL基础学习源自尚硅谷。(推荐)b站官方链接:https://www.bilibili.com/video/BV1xW411u7ax?p=1

存储过程和函数

存储过程和函数:类似java中的方法
好处:
1.提高代码的重用性
2.简化操作

存储过程

含义:
一组预先编译好的SQL语句的集合,理解成批处理语句。
好处:
1.提高代码的重用性
2.简化操作
3.减少了编译次数,并且减少了和数据库服务器连接次数,提高了效率。

procedure /pr?? si? d??(r)/ 过程,步骤

1.创建语法

create procedure 存储过程名(参数列表)
begin
	存储过程体 (一组合法的SQL语句)
end

注意:

1.参数列表包含三部分
参数模式、参数名、参数类型

举例:
in stuname varchar(20) # 默认是in
-- 参数模式
in:该参数可以作为输入,也就是该参数需要调用方传入值
out:该参数可以作为输出,也就是该参数可以作为返回值
inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
2.如果存储过程体仅仅只有一句话,begin end可以省略
3.存储过程体中每条SQL语句的结尾要求必须加分号
4.存储过程的结尾可以使用DELIMITER重新设置
	语法:
	DELIMITER 结束标记 
	eg:	DELIMITER $ # 不要写分号结束

DELIMITER设置结束标记后,其他语句都要用这个设置的结束标记

2.调用语法

CALL 存储过程名(实参列表);

1.空参列表

案例:插入到admin表中五条记录

-- 设置结束标记,注意:设置结束标记后面不要写分号,设置结束标记是所有语句都要用设置的这个结束标记,并不是只设置给存储过程使用的,其他语句执行也要用这个结束标记,才能结束语句。
DELIMITER $
CREATE PROCEDURE myp1()
begin
	insert into admin(`username`,`password`) values
	(‘zhangsan‘,‘001‘),
	(‘lisi‘,‘002‘),
	(‘wangwu‘,‘003‘),
	(‘zhaoliu‘,‘004‘),
	(‘taoqi‘,‘005‘);
	
end $ # $表示存储过程结束

-- 不能在数据库管理工具中执行,需要cmd连接数据库执行。

2.创建带in模式参数的存储过程

案例1:创建存储过程实现 根据女神名,查询对应的男神信息

delimiter $
create 	procedure myp2(in beautyName varchar(20))
begin 
	select * from boys bo right join beauty b on bo.id = b.boyfriend_id 
	where b.name = beautyName;
end $
call myp2("苍老师")$

MySQL基础-22存储过程和函数

案例2:创建存储过程实现,用户是否登录成功

create procedure myp3(in username varchar(20),in `password` varchar(20))
begin 
	declare result int default 0 ; # 声明变量并初始化
	
	select count(*) into result # 变量赋值
	from admin
	where admin.username = username # 参数名与表字段同名,也遵循就近原则,可以用 表名.字段名 区别
	and admin.`password` = `password`;
	
	select if(result>0,‘成功‘,‘失败‘); # 变量使用
end $

3.创建带out模式的存储过程

案例1:根据女神名,返回对应男神名

create procedure myp5(in beautyName varchar(20), out boyName varchar(20))
begin
	select b.boyName into boyName # 查询得到结果赋值给返回参数boyName
	from beauty be right join boys b on be.boyfriend_id = b.id 
	where be.name = beautyName;
end $
call myp5(‘小昭‘,@bName)$
select @bName$

MySQL基础-22存储过程和函数

案例2:根据女神名,返回对应男神名和男神魅力值

create procedure myp6(in beautyName varchar(20),out boyName varchar(20),out userCP int)
begin
	select b.boyName,b.userCP into boyName,userCP 
	from beauty be right join boys b on b.id = be.boyfriend_id
	where be.name = beautyName;
end $

MySQL基础-22存储过程和函数

4.创建带inout模式参数的存储过程

案例:传入a和b两个值,最终a和b的值都翻倍并返回

create procedure myp7(inout a int,inout b int)
begin
	set a=a*2;
	set b=b*2;
end $
set @m=10$
set @n=20$

call myp7(@m,@n)$
select @m,@n$

3.存储过程删除

语法:
	drop procedure 存储过程名;

-- 不支持一次删除多个存储过程
drop procedure 存储过程1,存储过程2; # 执行错误

4.查看存储过程的信息

show create procedure 存储过程名;

-- 不能修改存储过程内的逻辑语句
-- 可以删除存储过程重新创建

MySQL基础-22存储过程和函数

函数

函数与存储过程的区别:
存储过程:可以有0个返回,也可以有多个返回,适合做批量插入,批量更新。
函数:有且仅有1个返回,适合做处理数据后返回一个结果

1.创建语法

create function 函数名(参数列表) returns 返回类型
begin 
	函数体
end
注意:
1.参数列表包含两部分
参数名 参数类型

2.函数体:肯定会有return语句,如果没有会报错。
如果return语句没有放在函数体的最后也不报错,但不建议。
return 值;

3.函数体中仅有一句话,则可以省略begin end

4.使用delimiter语句设置结束标记

2.调用语法

select 函数名(参数列表)

1.无参有返回

案例:返回公司的员工个数

delimiter $
create function myf1() returns int
begin
	-- 定义一个变量返回
	declare c int default 0; # 定义局部变量
	select count(*) into c # 变量赋值
	from employees;
	retrun c; # 返回
end $
select myf1() $

2.有参有返回

案例1:根据员工名,返回他的工资

create function myf2(empName varchar(20)) returns double
begin
	set @sal=0; # 定义用户变量
	select salary into @sal # 赋值
	from employees
	where last_name = empName;
	
	return @sal;
end $
select myf2(‘kochhar‘) $

MySQL基础-22存储过程和函数

案例2:根据部门名,返回该部门的平均工资

create function myf3(deptName varchar(20)) returns double
begin
	declare sal double;
	select avg(salary) into sal
	from employees e join departments d
	on e.department_id = d.department_id
	where d.department_name = deptName;
	
	return sal;
end $
select myf3(‘IT‘) $

3.查看函数

show create function myf2;

MySQL基础-22存储过程和函数

在数据库的mysql库中的proc表可以看到定义的存储过程和函数

MySQL基础-22存储过程和函数

4.删除函数

drop function myf2;

案例:创建函数,实现传入两个float,返回二者之和

create function myf3(num1 float,num2 float) return float
begin
	declare sum float default 0;
	set sum=num1+num2;
	
	return sum;
end $
select myf3(1.3,4.5)$

MySQL基础-22存储过程和函数

上一篇:C# 以特定字符分割字符串--IP地址分割


下一篇:C# 数据库连接1——Sqlite数据库安装