变量、存储过程、函数
变量
分类
-
系统变量
变量由系统提供,不是用户定义,属于服务器层面
-
全局变量 global
服务器每次启动将为所有全局变量赋初值,针对于所有会话,不能跨重启
-
会话变量 session
不写默认为session
-
使用
查看所有系统变量
SHOW global /SESSION VARIABLES;
查看部分变量
SHOW GLOBAL /SESSION VARIABLES LIKE '%char%';
查看指定变量
SELECT @@global /SESSION .系统变量名;
SELECT @@global.autocommit;
SELECT @@tx_isolation;
为某个系统变量赋值
方式1 =
Set global /SESSION 系统变量名 = 值;
Set session tx_isolation=’read-committed’;
方式2 @@ .
Set @@global /SESSION .系统变量名= 值;
set @@global.autocommit=0;
自定义变量
步骤
- 声明
- 赋值
- 使用
用户变量
针对当前会话有效,应用在任何地方
声明
- Set @用户变量名 =值;
- Set @用户变量名 :=值;
- Select @用户变量名:=值;
赋值
方式1 set select
Set @用户变量名 =值;
Set @用户变量名 :=值;
Select @用户变量名:=值;
方式2 select into
Select 字段 into 变量 from 表;
使用
Select @用户变量名;
Set @name = 100;
Set @count = 1;
Select count(*) into @count from book;
局部变量
仅仅在定义它的begin end中有效,应用在begin end第一句话
声明
Declare 变量名 类型 【default 值】;
赋值
同用户变量
使用
Select 局部变量名;
存储过程
一组预先编译好的sql语句的集合,理解成批处理语句
优点
- 提高了代码的重用性
- 简化此操作
- 减少了编译次数减少了和数据库服务器的连接次数,提高了效率
创建
Create procedure 存储过程名(参数列表)
Begin
过程
End
参数列表:(参数模式 参数名 参数类型)
参数模式
In:参数作为输入
Out:参数作为输出
Inout:参数可以作为输入和输出
In name varchar(20)
-
如果存储过程体只有一句话,begin end可以省略
-
过程体中每条sql后必须加分号
-
使用delimiter重新设置结尾标志
Delimiter 结束标记;
调用
Call 存储过程名(参数);
delimiter $
CREATE PROCEDURE tst1(IN gname varchar(50),out aname varchar(50))
BEGIN
SELECT DISTINCT a.`name`
FROM games g
INNER JOIN authorss a
ON g.author_id = a.id
WHERE g.`name`=gname
INTO aname;
END $
set @n = ''$
call tst1('rim',@n)$
create procedure tt1(inout a int, inout b int)
begin
set a = a+a;
set b = b*4;
end $
set @m=10$
set@n = 20$
call tt1(@n,@m)$
删除
Drop procedure 存储过程名;
drop procedure tst$
查看存储过程的结构
- Desc 存储过程名;
- Show create procedure 存储过程名;
Desc tst;
Show create procedure myp1;
函数
一组预先编译好的sql语句集合,理解成批处理语句
存储过程和函数的区别
- 存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新
- 函数:有且仅有1个返回,适合处理数据后有一个返回结果。
创建
Create function 函数名(参数列表) returns 返回类型
Begin
函数体
End
注意
- 参数列表 包括 参数名 参数类型
- 函数体必须要有return语句,放在最后不报错但不建议
调用函数
Select 函数名(参数列表)
mysql> CREATE FUNCTION mf2(gname VARCHAR(20)) RETURNS INT
-> BEGIN
-> SET @age = 0;
-> SELECT a.age INTO @age
-> FROM games g
-> JOIN authorss a
-> ON g.author_id = a.id
-> WHERE g.`name` = gname;
-> RETURN @age ;
-> END $
select mf1('rimworld5')$
查看函数
Show create function 函数名;
Show create function my1;
删除
Drop function 函数名;
drop function my1;