今天发现mysql还是很强大的么,可以设置变量,可以进行运算,等等,
这篇文章我们主要了解mysql 变量的相关知识:
设置变量
一、通过set语句设置
set @变量名称 = 整数、实数、字符串或NULL值,支持,分割同时设置多个变量
set @age = 22;
set @num = ‘li’,@age = 22;
mysql> set @da=1,@db=2;
Query OK, 0 rows affected (0.00 sec)
二、通过select语句设置
select设置变量时使用的分配符号是 := 因为select = 符号被当做对比来使用,同时支持设置多个变量
select @age := 22;
select @num := ‘li’,@age := 22;
mysql> select @dc:=1,@dl=2;
+————+———-+
| @dc:=1 | @dl=2 |
+————+———-+
| 1 | NULL |
+————+———-+
1 row in set (0.00 sec)
select @dc = 1; 当做对比符号来使用
mysql> select @dc = 1;
+————-+
| @dc = 1 |
+————-+
| 1 |
+————-+
1 row in set (0.00 sec)
select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; 设置中还可以进行运算等操作
mysql> select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+———————————+———+———+———+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+———————————+———+———+———+
| 5 | 5 | 1 | 4 |
+———————————+———+———+———+
1 row in set (0.00 sec)
设置全局变量
set GLOBAL 全局变量 = value;
或
set @@.global.全局变量 = value;
设置session变量
set SESSION 全局变量 = 22;
或
set @@.session.全局变量 = 22;
或
set 全局变量 = 22;
LOCAL 是SESSION 的同义词 如果设置变量时不指定GLOBAL SESSION 和LOCAL 默认的是LOCAL
检索GLOBAL变量
select @@global.变量;
或
show GLOBAL VARIABLES like ‘变量’;
检索SESSION变量
select @@变量;
或
select @@session.变量;
或
show SESSION VARIABLES like ‘变量’;
LOCAL 是SESSION 的同义词,select @@变量;默认检索的SESSION变量,如果不存在则检索的是GLOBAL变量
show VARIABLES不指定时默认返回的是SESSION值;
mysql服务器维护两种变量,全局变量影响服务器整体操作,会话变量影响具体客户端连接的操作
服务器启动时。将所有的全局变量初始化为默认值。这些默认值可以在选项文件中或在命令行中指定的选项进行更改。通过连接服务器并执行 SET GLOBAL var_name语句来更改这些全局变量。更改全局变量必须具有super权限。
服务器还为每个连接客户端维护的一系列的会话变量。设置会话变量不需要特殊权限,但客户端只能更改自己的会话变量,二不能更改其他客户端的会话变量。
全局变量修改可以被访问该全局变量的任何客户端看见,但是他只对更改后连接服务器的客户从该全局变量初始化的相应的会话变量。不影响已经连接的客户端的会话变量
以下摘自:http://www.cnblogs.com/wangtao_20/archive/2011/02/21/1959734.html
笔记部分:mysql变量的术语分类:
1.用户变量:以”@”开始,形式为”@变量名”
用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效
2.全局变量:定义时,以如下两种形式出现,set GLOBAL 变量名 或者 set @@global.变量名
对所有客户端生效。只有具有super权限才可以设置全局变量
3.会话变量:只对连接的客户端有效。
4.局部变量:作用范围在begin到end语句块之间。在该语句块里设置的变量
declare语句专门用于定义局部变量。set语句是设置不同类型的变量,包括会话变量和全局变量
通俗理解术语之间的区别:
用户定义的变量就叫用户变量。这样理解的话,会话变量和全局变量都可以是用户定义的变量。只是他们是对当前客户端生效还是对所有客户端生效的区别了。所以,用户变量包括了会话变量和全局变量
局部变量与用户变量的区分在于两点:1.用户变量是以”@”开头的。局部变量没有这个符号。2.定义变量不同。用户变量使用set语句,局部变量使用declare语句定义 3.作用范围。局部变量只在begin-end语句块之间有效。在begin-end语句块运行完之后,局部变量就消失了。
所以,最后它们之间的层次关系是:变量包括局部变量和用户变量。用户变量包括会话变量和全局变量。
未定义的变量初始化是null
mysql中变量的层次关系是:大体包括用户变量和系统变量。系统变量包括系统会话变量和系统全局变量。
我是这样理解相互之间的区别:
因为用户变量就是用户定义的变量,系统变量就是mysql定义和维护的变量。所以,用户变量与系统变量的区别在于,是谁在管理这些变量。mysql一启动的时候就会读取系统变量(这样做目的是可以确定mysql的以何种机制或模式运行)。 系统会话变量与用户变量都是在当前客户端退出后消失。他们之间的区别可以这样理解,虽然常常看到”set @@varible”的形式去改变系统变量的值,但是并不涉及到定义系统变量。用户变量是可以自己定义(初始化)。系统变量按照只是在改变值。
局部变量只在begin-end语句块中定义并有效。执行到该语句块之后就消失了。定义的方式有明显的特点,使用declare语句。
为什么看到使用系统变量以”@@变量名”和”变量名”的形式出现,怎么理解两者形式的区别?
使用系统变量理论上是可以使用两种形式:1.前面带有符号”@@” 2.符号省略。比如我会看的如下形式:CURRENT_USER。但是,约定系统变量要使用”@@变量名”的形式,就是在前面加上符号”@@”。
