mysql中变量分为系统变量
,用户变量
,局部变量
系统变量
又分为全局(global)变量
与会话(session)变量
,全局与会话的区别在于,全局是在服务重启之前的所有连接,而会话作用于当前一次的连接,这里的连接指的是navicate打开的一个查询窗口,或者cmd中一次mysql连接,或者jdbc中的一个connection.
用户变量
与局部变量
作用域只是会话.并且局部变量的只在begin … end中有效.
系统变量
系统变量也就是mysql相关参数,如事务隔离级别,自动提交等
查看所有系统变量:
show variables;
查看特定的变量:
第一种方式:
show [global/session] variables like 'xxx';
中括号中的内容是选填的,如果不写默认为session
第二种方式:
select @@[global/session.]变量名;
中括号中的内容是选填的,如果不写默认为session
一般情况会用第一种方式,因为很少会完全记住变量名,而第一种方式支持模糊查询.
设置系统变量:
set [global/session] 系统变量名=xxxx
或者 set @@global/session.系统变量=xxxx
用户变量
用户变量是个人定义的变量,与系统参数无关
用户变量前要加@
定义(赋值):
set @a=1;
set @a:=2;
select @a:=3; //将查询结果赋值给用户变量
select 4 into @a //将查询结果赋值给用户变量
set 时 =
与:=
都可以,但是select时必须要:=
或者into
的形式
查看:
select @a;
局部变量
局部变量作用于begin ... end
语句中,并且必须紧接着在begin
后面定义
局部变量的定义(用户变量与定义一样,局部变量必须显式定义)
declare a int [default 1]
变量赋值:
set a=1;
set a:=2;
select 3 into a; //将查询结果赋值给局部变量 局部变量不支持select a :=4
select 3,4 into a,b;
下面存储过程中展示局部变量的使用:
delimiter //
drop PROCEDURE if exists test//
create procedure test()
BEGIN
declare a int;
set a=1;
select a;
set a:=2;
select a;
select 4 into a;
select a;
select @a:=5;
select a;
select a+1 into a;
select a;
end //
call test();
如上图所示,5个select a
一共有6个结果,原因在于,begin end中可以操作用户变量,select @a:=5 操作的其实用户变量,并且这种语句会直接返回结果.
如果存储过程中有参数,那么就不需要在存储过程中再去定义了.