MySQL中的变量定义与赋值(⼲货)
说明:现在市⾯上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作⽤于begin…end块中,⽽普通的变量定义和使⽤都说的⽐较少,针对此类问题只能在官⽅⽂档中才能到讲解。
前⾔
MySQL存储过程中,定义变量有两种⽅式:
1、使⽤set或select直接赋值,变量名以@开头
例如:
set @var=1;
可以在⼀个会话的任何地⽅声明,作⽤域是整个会话,称为⽤户变量。
2、以declare关键字声明的变量,只能在存储过程中使⽤,称为存储过程变量,例如:
declare var1 int default 0;
主要⽤在存储过程中,或者是给存储传参数中。
rownum函数两者的区别是:
在调⽤存储过程时,以declare声明的变量都会被初始化为null。⽽会话变量(即@开头的变量)则不会被再初始化,在⼀个会话内,只须初始化⼀次,之后在会话内都是对上⼀次计算的结果,就相当于在是这个会话内的全局变量。
主体内容
局部变量
⽤户变量
会话变量
全局变量
会话变量和全局变量叫系统变量。
⼀、局部变量,只在当前begin/end代码块中有效
局部变量⼀般⽤在sql语句块中,⽐如存储过程的begin/end。其作⽤域仅限于该语句块,在该语句块执⾏完毕后,局部变量就消失了。declare语句专门⽤于定义局部变量,可以使⽤default来说明默认值。set语句是设置不同类型的变量,包括会话变量和全局变量。
insert语句返回值局部变量定义语法形式
declare var_name [, var_name]... data_type [ DEFAULT value ];
例如在begin/end语句块中添加如下⼀段语句,接受函数传进来的a/b变量然后相加,通过set语句赋值给c变量。
set语句语法形式set var_name=expr [, var_name=expr]…; set语句既可以⽤于局部变量的赋值,也可以⽤于⽤户变量的申明并赋值。
declare c int default 0;
set c=a+b;
select c as C;
或者⽤select …. into…形式赋值
select into 语句句式:select col_name[,...] into var_name[,...] table_expr [];
例⼦:
例⼦:
declare v_employee_name varchar(100);
declare v_employee_salary decimal(8,4);
select employee_name, employee_salary
into v_employee_name, v_employee_salary
from employees
where employee_id=1;
⼆、⽤户变量,在客户端链接到数据库实例整个过程中⽤户变量都是有效的。
MySQL中⽤户变量不⽤事前申明,在⽤的时候直接⽤“@变量名”使⽤就可以了。
第⼀种⽤法:set @num=1; 或set @num:=1; //这⾥要使⽤set语句创建并初始化变量,直接使⽤@num变量
第⼆种⽤法:select @num:=1; 或 select @num:=字段名 from 表名 where ……,
select语句⼀般⽤来输出⽤户变量,⽐如select @变量名,⽤于输出数据源不是表格的数据。
注意上⾯两种赋值符号,使⽤set时可以⽤“=”或“:=”,但是使⽤select时必须⽤“:=赋值”
⽤户变量与数据库连接有关,在连接中声明的变量,在存储过程中创建了⽤户变量后⼀直到数据库实例接断开的时候,变量就会消失。
在此连接中声明的变量⽆法在另⼀连接中使⽤。
⽤户变量的变量名的形式为@varname的形式。
名字必须以@开头。
声明变量的时候需要使⽤set语句,⽐如下⾯的语句声明了⼀个名为@a的变量。
set @a = 1;
声明⼀个名为@a的变量,并将它赋值为1,MySQL⾥⾯的变量是不严格限制数据类型的,它的数据类型根据你赋给它的值⽽随时变化 。(SQL SERVER中使⽤declare语句声明变量,且严格限制数据类型。)
我们还可以使⽤select语句为变量赋值 。
⽐如:
set @name = '';
select @name:=password from user limit 0,1;
#从数据表中获取⼀条记录password字段的值给@name变量。在执⾏后输出到查询结果集上⾯
(注意等于号前⾯有⼀个冒号,后⾯的limit 0,1是⽤来限制返回结果的,表⽰可以是0或1个。相当于SQL SERVER⾥⾯的top 1)
如果直接写:select @name:=password from user;
如果这个查询返回多个值的话,那@name变量的值就是最后⼀条记录的password字段的值 。
⽤户变量可以作⽤于当前整个连接,但当当前连接断开后,其所定义的⽤户变量都会消失。
⽤户变量使⽤如下(我们⽆须使⽤declare关键字对⽤户变量进⾏定义,可以直接这样使⽤)定义,变量名必须以@开始:
#定义
数据结构与算法推荐书select @变量名或者 select @变量名:= 字段名 from 表名 where 过滤语句;
set @变量名;
#赋值 @num为变量名,value为值
clicking是什么意思set @num=value;或select @num:=value;
对⽤户变量赋值有两种⽅式,⼀种是直接⽤”=”号,另⼀种是⽤”:=”号。其区别在于使⽤set命令对⽤户变量进⾏赋值时,两种⽅式都可以使⽤;当使⽤select语句对⽤户变量进⾏赋值时,只能使⽤”:=”⽅式,因为在select语句中,”=”号declare语句专门⽤于定义局部变量。set语句是设置不同类型的变量,包括会话变量和全局变量。
例如:
begin
#Routine body
#select c as c;
declare c int default 0;
set @var1=143; #定义⼀个⽤户变量,并初始化为143
set @var2=34;
set c=a+b;
set @d=c;
select @sum:=(@var1+@var2) as sum, @dif:=(@var1-@var2) as dif, @d as C;#使⽤⽤户变量。@var1表⽰变量名
set c=100;
select c as CA;
end
#在查询中执⾏下⾯语句段
call `order`(12,13); #执⾏上⾯定义的存储过程
select @var1; #看定义的⽤户变量在存储过程执⾏完后,是否还可以输出,结果是可以输出⽤户变量@var1,@var2两个变量的。
select @var2;
在执⾏完order存储过程后,在存储过程中新建的var1,var2⽤户变量还是可以⽤select语句输出的,但是存储过程⾥⾯定义的局部变量c 不能识别。
系统变量:
系统变量⼜分为全局变量与会话变量。
全局变量在MySQL启动的时候由服务器⾃动将它们初始化为默认值,这些默认值可以通过更改my.ini这个⽂件来更改。
mysql查看所有存储过程
会话变量在每次建⽴⼀个新的连接的时候,由MySQL来初始化。MySQL会将当前所有全局变量的值复制⼀份。来做为会话变量。
(也就是说,如果在建⽴会话以后,没有⼿动更改过会话变量与全局变量的值,那所有这些变量的值都是⼀样的。)
全局变量与会话变量的区别就在于,对全局变量的修改会影响到整个服务器,但是对会话变量的修改,只会影响到当前的会话(也就是当前的数据库连接)。
我们可以利⽤
show session variables;
语句将所有的会话变量输出(可以简写为show variables,没有指定是输出全局变量还是会话变量的话,默认就输出会话变量。)如果想输出所有全局变量:
show global variables
有些系统变量的值是可以利⽤语句来动态进⾏更改的,但是有些系统变量的值却是只读的。
对于那些可以更改的系统变量,我们可以利⽤set语句进⾏更改。
系统变量在变量名前⾯有两个@;
如果想要更改会话变量的值,利⽤语句:
set session varname = value;
或者
set @@session.varname = value;
⽐如:
mysql> set session sort_buffer_size = 40000;
Query OK, 0 rows affected(0.00 sec)
⽤select @@sort_buffer_size;输出看更改后的值是什么。
如果想要更改全局变量的值,将session改成global:
set global sort_buffer_size = 40000;
set @@global.sort_buffer_size = 40000;
不过要想更改全局变量的值,需要拥有super权限 。
(注意,root只是⼀个内置的账号,⽽不是⼀种权限 ,这个账号拥有了MySQL数据库⾥的所有权限。任何账号只要它拥有了名为super的这个权限,就可以更改全局变量的值,正如任何⽤户只要拥有file权限就可以调⽤load_file或者into outfile,into dumpfile,load data infile⼀样。)
利⽤select语句我们可以查询单个会话变量或者全局变量的值:
select @@session.sort_buffer_size
select @@global.sort_buffer_size
select @@pdir
凡是上⾯提到的session,都可以⽤local这个关键字来代替。
⽐如:
select @@local.sort_buffer_size
local是session的近义词。
⽆论是在设置系统变量还是查询系统变量值的时候,只要没有指定到底是全局变量还是会话变量。都当做会话变量来处理。
⽐如:
set @@sort_buffer_size = 50000;
select @@sort_buffer_size;
上⾯都没有指定是blobal还是session,所以全部当做session处理。
三、会话变量
服务器为每个连接的客户端维护⼀系列会话变量。在客户端连接数据库实例时,使⽤相应全局变量的当前值对客户端的会话变量进⾏初始化。设置会话变量不需要特殊权限,但客户端只能更改⾃⼰的会话变量,⽽不能更改其它客户端的会话变量。会话变量的作⽤域与⽤户变量⼀样,仅限于当前连接。当当前连接断开后,其设置的所有会话变量均失效。
设置会话变量有如下三种⽅式更改会话变量的值:
set session var_name = value;
set @@session.var_name = value;
set var_name = value; #缺省session关键字默认认为是session
查看所有的会话变量
show session variables;
查看⼀个会话变量也有如下三种⽅式:
select @@var_name;
select @@session.var_name;
show session variables like "%var%";
凡是上⾯提到的session,都可以⽤local这个关键字来代替。
⽐如:
select @@local.sort_buffer_size
local是session的近义词。
四、全局变量
最火的网页游戏全局变量影响服务器整体操作。当服务器启动时,它将所有全局变量初始化为默认值。这些默认值可以在选项⽂件中或在命令⾏中指定的选项进⾏更改。要想更改全局变量,必须具有super权限。全局变量作⽤于server的整个⽣命周期,但是不能跨重启。即重启后所有设置的全局变量均失效。要想让全局变量重启后继续⽣效,需要更改相应的配置⽂件。
要设置⼀个全局变量,有如下两种⽅式:
set global var_name = value; //注意:此处的global不能省略。根据⼿册,set命令设置变量时若不指定GLOBAL、SESSION或者LOCAL,默认使⽤SESSION set @@global.var_name = value; //同上
查看所有的全局变量
show global variables;
要想查看⼀个全局变量,有如下两种⽅式:
select @@global.var_name;
show global variables like “%var%”;
关于mysql中下标的问题limit 是从0开始的,substring是从1开始的
参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论