数据库您现在的位置是:首页 > 博客日志 > 数据库

MySQL中变量的定义和变量的赋值使用(转)

<a href='mailto:'>微wx笑</a>的头像微wx笑 2022-10-10数据库 7 0关键字: mysql  

说明:现在市面上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作用于begin...end块中,而普通的变量定义和使用都说的比较少,针对此类问题只能在官方文

说明:现在市面上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作用于begin...end块中,而普通的变量定义和使用都说的比较少,针对此类问题只能在官方文档中才能找到讲解。WIM无知

前言WIM无知

MySQL存储过程中,定义变量有两种方式: WIM无知

1、使用set或select直接赋值,变量名以@开头WIM无知

例如:WIM无知

set@var=1;WIM无知

可以在一个会话的任何地方声明,作用域是整个会话,称为用户变量。WIM无知

2、以declare关键字声明的变量,只能在存储过程中使用,称为存储过程变量,例如: WIM无知

declarevar1intdefault0;WIM无知

主要用在存储过程中,或者是给存储传参数中。WIM无知

两者的区别是: WIM无知

在调用存储过程时,以declare声明的变量都会被初始化为null。而会话变量(即@开头的变量)则不会被再初始化,在一个会话内,只须初始化一次,之后在会话内都是对上一次计算的结果,就相当于在是这个会话内的全局变量。WIM无知

主体内容WIM无知

局部变量 WIM无知

用户变量 WIM无知

会话变量 WIM无知

全局变量 WIM无知

会话变量和全局变量叫系统变量。WIM无知

一、局部变量,只在当前begin/end代码块中有效WIM无知

局部变量一般用在sql语句块中,比如存储过程的begin/end。其作用域仅限于该语句块,在该语句块执行完毕后,局部变量就消失了。declare语句专门用于定义局部变量,可以使用default来说明默认值。set语句是设置不同类型的变量,包括会话变量和全局变量。WIM无知

局部变量定义语法形式WIM无知

declarevar_name[, var_name]... data_type[ DEFAULT value ];WIM无知

例如在begin/end语句块中添加如下一段语句,接受函数传进来的a/b变量然后相加,通过set语句赋值给c变量。 WIM无知

set语句语法形式set var_name=expr [, var_name=expr]...;set语句既可以用于局部变量的赋值,也可以用于用户变量的申明并赋值。WIM无知

declarecintdefault0;setc=a+b;selectcasC;WIM无知

或者用select …. into…形式赋值WIM无知

selectinto语句句式:selectcol_name[,...]intovar_name[,...]table_expr[where...];WIM无知

例子:WIM无知

declarev_employee_namevarchar(100);declarev_employee_salarydecimal(8,4);select employee_name, employee_salaryinto v_employee_name, v_employee_salaryfrom employeeswhereemployee_id=1;WIM无知

二、用户变量,在客户端链接到数据库实例整个过程中用户变量都是有效的。WIM无知

MySQL中用户变量不用事前申明,在用的时候直接用“@变量名”使用就可以了。 WIM无知

第一种用法:set @num=1; 或set @num:=1;//这里要使用set语句创建并初始化变量,直接使用@num变量WIM无知

第二种用法:select @num:=1; 或 select @num:=字段名 from 表名 where ……,WIM无知

select语句一般用来输出用户变量,比如select @变量名,用于输出数据源不是表格的数据。WIM无知

注意上面两种赋值符号,使用set时可以用“=”或“:=”,但是使用select时必须用“:=赋值”WIM无知

用户变量与数据库连接有关,在连接中声明的变量,在存储过程中创建了用户变量后一直到数据库实例接断开的时候,变量就会消失。WIM无知

在此连接中声明的变量无法在另一连接中使用。WIM无知

用户变量的变量名的形式为@varname的形式。WIM无知

名字必须以@开头。WIM无知

声明变量的时候需要使用set语句,比如下面的语句声明了一个名为@a的变量。WIM无知

set @a = 1;WIM无知

声明一个名为@a的变量,并将它赋值为1,MySQL里面的变量是不严格限制数据类型的,它的数据类型根据你赋给它的值而随时变化。(SQL SERVER中使用declare语句声明变量,且严格限制数据类型。)WIM无知

我们还可以使用select语句为变量赋值 。 WIM无知

比如:WIM无知

set@name='';select@name:=passwordfromuserlimit0,1;WIM无知

#从数据表中获取一条记录password字段的值给@name变量。在执行后输出到查询结果集上面。WIM无知

(注意等于号前面有一个冒号,后面的limit 0,1是用来限制返回结果的,表示可以是0或1个。相当于SQL SERVER里面的top 1) WIM无知

如果直接写:select @name:=password from user;WIM无知

如果这个查询返回多个值的话,那@name变量的值就是最后一条记录的password字段的值 。 WIM无知

用户变量可以作用于当前整个连接,但当当前连接断开后,其所定义的用户变量都会消失。 WIM无知

用户变量使用如下(我们无须使用declare关键字对用户变量进行定义,可以直接这样使用)定义,变量名必须以@开始:WIM无知

#定义select@变量名或者select@变量名:=字段名from表名where 过滤语句;set@变量名;WIM无知

#赋值 @num为变量名,value为值set@num=value;或select@num:=value;WIM无知

对用户变量赋值有两种方式,一种是直接用”=”号,另一种是用”:=”号。其区别在于使用set命令对用户变量进行赋值时,两种方式都可以使用;当使用select语句对用户变量进行赋值时,只能使用”:=”方式,因为在select语句中,”=”号declare语句专门用于定义局部变量。set语句是设置不同类型的变量,包括会话变量和全局变量。WIM无知

例如:WIM无知

begin#Routine body goes here...WIM无知

#selectcas c;declarecintdefault0;set@var1=143;  #定义一个用户变量,并初始化为143set@var2=34;setc=a+b;set@d=c;select@sum:=(@var1+@var2)assum,@dif:=(@var1-@var2)asdif,@dasC;#使用用户变量。@var1表示变量名setc=100;selectcas CA;end#在查询中执行下面语句段WIM无知

call `order`(12,13);  #执行上面定义的存储过程select@var1;  #看定义的用户变量在存储过程执行完后,是否还可以输出,结果是可以输出用户变量@var1,@var2两个变量的。select@var2;WIM无知

在执行完order存储过程后,在存储过程中新建的var1,var2用户变量还是可以用select语句输出的,但是存储过程里面定义的局部变量c不能识别。WIM无知

系统变量:WIM无知

系统变量又分为全局变量与会话变量。WIM无知

全局变量在MySQL启动的时候由服务器自动将它们初始化为默认值,这些默认值可以通过更改my.ini这个文件来更改。WIM无知

会话变量在每次建立一个新的连接的时候,由MySQL来初始化。MySQL会将当前所有全局变量的值复制一份。来做为会话变量。WIM无知

(也就是说,如果在建立会话以后,没有手动更改过会话变量与全局变量的值,那所有这些变量的值都是一样的。)WIM无知

全局变量与会话变量的区别就在于,对全局变量的修改会影响到整个服务器,但是对会话变量的修改,只会影响到当前的会话(也就是当前的数据库连接)。WIM无知

我们可以利用WIM无知

show session variables;WIM无知

语句将所有的会话变量输出(可以简写为show variables,没有指定是输出全局变量还是会话变量的话,默认就输出会话变量。)如果想输出所有全局变量:WIM无知

show global variablesWIM无知

有些系统变量的值是可以利用语句来动态进行更改的,但是有些系统变量的值却是只读的。WIM无知

对于那些可以更改的系统变量,我们可以利用set语句进行更改。WIM无知

系统变量在变量名前面有两个@;WIM无知

如果想要更改会话变量的值,利用语句:WIM无知

setsession varname= value;WIM无知

或者set@@session.varname=value;WIM无知

比如:WIM无知

mysql>setsession sort_buffer_size=40000;WIM无知

Query OK, 0rows affected(0.00 sec)WIM无知

用select @@sort_buffer_size;输出看更改后的值是什么。WIM无知

如果想要更改全局变量的值,将session改成global:setglobal sort_buffer_size=40000;set@@global.sort_buffer_size=40000;WIM无知

不过要想更改全局变量的值,需要拥有super权限 。WIM无知

(注意,root只是一个内置的账号,而不是一种权限 ,这个账号拥有了MySQL数据库里的所有权限。任何账号只要它拥有了名为super的这个权限,就可以更改全局变量的值,正如任何用户只要拥有file权限就可以调用load_file或者into outfile,into dumpfile,load data infile一样。)WIM无知

利用select语句我们可以查询单个会话变量或者全局变量的值:WIM无知

select@@session.sort_buffer_sizeselect@@global.sort_buffer_sizeselect@@global.tmpdirWIM无知

凡是上面提到的session,都可以用local这个关键字来代替。WIM无知

比如:WIM无知

select@@local.sort_buffer_sizeWIM无知

local是session的近义词。WIM无知

无论是在设置系统变量还是查询系统变量值的时候,只要没有指定到底是全局变量还是会话变量。都当做会话变量来处理。 WIM无知

比如: WIM无知

set@@sort_buffer_size=50000; select@@sort_buffer_size;WIM无知

上面都没有指定是blobal还是session,所以全部当做session处理。WIM无知

三、会话变量WIM无知

服务器为每个连接的客户端维护一系列会话变量。在客户端连接数据库实例时,使用相应全局变量的当前值对客户端的会话变量进行初始化。设置会话变量不需要特殊权限,但客户端只能更改自己的会话变量,而不能更改其它客户端的会话变量。会话变量的作用域与用户变量一样,仅限于当前连接。当当前连接断开后,其设置的所有会话变量均失效。WIM无知

设置会话变量有如下三种方式更改会话变量的值:WIM无知

setsession var_name= value;set@@session.var_name= value;setvar_name= value;  #缺省session关键字默认认为是sessionWIM无知

查看所有的会话变量WIM无知

show session variables;WIM无知

查看一个会话变量也有如下三种方式:WIM无知

select@@var_name;select@@session.var_name;WIM无知

show session variables like"%var%";WIM无知

凡是上面提到的session,都可以用local这个关键字来代替。 WIM无知

比如: WIM无知

select@@local.sort_buffer_sizeWIM无知

local是session的近义词。WIM无知

四、全局变量WIM无知

全局变量影响服务器整体操作。当服务器启动时,它将所有全局变量初始化为默认值。这些默认值可以在选项文件中或在命令行中指定的选项进行更改。要想更改全局变量,必须具有super权限。全局变量作用于server的整个生命周期,但是不能跨重启。即重启后所有设置的全局变量均失效。要想让全局变量重启后继续生效,需要更改相应的配置文件。WIM无知

要设置一个全局变量,有如下两种方式:WIM无知

setglobal var_name=value;//注意:此处的global不能省略。根据手册,set命令设置变量时若不指定GLOBAL、SESSION或者LOCAL,默认使用SESSIONset@@global.var_name=value;//同上WIM无知

查看所有的全局变量 WIM无知

show global variables;WIM无知

要想查看一个全局变量,有如下两种方式:WIM无知

select@@global.var_name;WIM无知

show global variables like“%var%”;WIM无知

参考:WIM无知

http://blog.csdn.net/JQ_AK47/article/details/52087484(以上内容转自此篇文章)WIM无知

http://blog.csdn.net/seteor/article/details/17682551WIM无知

http://blog.csdn.net/jssg_tzw/article/details/39703889?utm_source=tuicool&utm_medium=referralWIM无知

http://www.cnblogs.com/qixuejia/archive/2010/12/21/1913203.htmlWIM无知

http://blog.163.com/longsu2010@yeah/blog/static/173612348201162595425697/WIM无知

本文为转载文章,版权归原作者所有,不代表本站立场和观点。

很赞哦! () 有话说 ()