说明:如今市面上定义变量的教程和书籍基本都放在存储过程上说明,可是存储过程上变量只能做用于begin...end块中,而普通的变量定义和使用都说的比较少,针对此类问题只能在官方文档中才能找到讲解。html
前言mysql
MySQL存储过程当中,定义变量有两种方式: sql
一、使用set或select直接赋值,变量名以@开头数据库
例如:服务器
set @var=1;
能够在一个会话的任何地方声明,做用域是整个会话,称为用户变量。session
二、以declare关键字声明的变量,只能在存储过程当中使用,称为存储过程变量,例如: 函数
declare var1 int default 0;
主要用在存储过程当中,或者是给存储传参数中。ui
二者的区别是: spa
在调用存储过程时,以declare声明的变量都会被初始化为null。而会话变量(即@开头的变量)则不会被再初始化,在一个会话内,只须初始化一次,以后在会话内都是对上一次计算的结果,就至关于在是这个会话内的全局变量。.net
主体内容
会话变量和全局变量叫系统变量。
1、局部变量,只在当前begin/end代码块中有效
局部变量通常用在sql语句块中,好比存储过程的begin/end。其做用域仅限于该语句块,在该语句块执行完毕后,局部变量就消失了。declare语句专门用于定义局部变量,可使用default来讲明默认值。set语句是设置不一样类型的变量,包括会话变量和全局变量。
局部变量定义语法形式
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 [where...];
例子:
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;
2、用户变量,在客户端连接到数据库实例整个过程当中用户变量都是有效的。
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为值 set @num=value;或select @num:=value;
对用户变量赋值有两种方式,一种是直接用”=”号,另外一种是用”:=”号。其区别在于使用set命令对用户变量进行赋值时,两种方式均可以使用;当使用select语句对用户变量进行赋值时,只能使用”:=”方式,由于在select语句中,”=”号declare语句专门用于定义局部变量。set语句是设置不一样类型的变量,包括会话变量和全局变量。
例如:
begin #Routine body goes here... #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会将当前全部全局变量的值复制一份。来作为会话变量。
(也就是说,若是在创建会话之后,没有手动更改过会话变量与全局变量的值,那全部这些变量的值都是同样的。)
全局变量与会话变量的区别就在于,对全局变量的修改会影响到整个服务器,可是对会话变量的修改,只会影响到当前的会话(也就是当前的数据库链接)。
咱们能够利用
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 @@global.tmpdir
凡是上面提到的session,均可以用local这个关键字来代替。
好比:
select @@local.sort_buffer_size local是session的近义词。
不管是在设置系统变量仍是查询系统变量值的时候,只要没有指定究竟是全局变量仍是会话变量。都当作会话变量来处理。
好比:
set @@sort_buffer_size = 50000; select @@sort_buffer_size;
上面都没有指定是blobal仍是session,因此所有当作session处理。
3、会话变量
服务器为每一个链接的客户端维护一系列会话变量。在客户端链接数据库实例时,使用相应全局变量的当前值对客户端的会话变量进行初始化。设置会话变量不须要特殊权限,但客户端只能更改本身的会话变量,而不能更改其它客户端的会话变量。会话变量的做用域与用户变量同样,仅限于当前链接。当当前链接断开后,其设置的全部会话变量均失效。
设置会话变量有以下三种方式更改会话变量的值:
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的近义词。
4、全局变量
全局变量影响服务器总体操做。当服务器启动时,它将全部全局变量初始化为默认值。这些默认值能够在选项文件中或在命令行中指定的选项进行更改。要想更改全局变量,必须具备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%”;
参考:
http://blog.csdn.net/JQ_AK47/article/details/52087484(以上内容转自此篇文章)
http://blog.csdn.net/seteor/article/details/17682551
http://blog.csdn.net/jssg_tzw/article/details/39703889?utm_source=tuicool&utm_medium=referral
http://www.cnblogs.com/qixuejia/archive/2010/12/21/1913203.html
http://blog.163.com/longsu2010@yeah/blog/static/173612348201162595425697/