1.自定義變量分類:
- 局部變量
- 用戶變量
- 會話變量
- 全局變量
2.局部變量
局部變量一般用在sql語句塊中,比如存儲過程的begin/end。其作用域僅限于該語句塊,在該語句塊執行完畢后,局部變量就消失了。
局部變量一般用declare來聲明,可以使用default來說明默認值。
#在存儲過程中定義局部變量
drop procedure if exists add;
create procedure add
( in a int,
in b int
)
begin
declare c int default 0;
set c = a + b;
select c as c;
end;
在上述存儲過程中定義的變量c就是局部變量
declare定義的變量名不能帶‘@’符號,mysql在這點做的確實不夠直觀,往往變量名會被錯成參數或者字段名。
3.用戶變量
用戶變量的作用域要比局部變量要廣。用戶變量可以作用于當前整個連接,但是當當前連接斷開后,其所定義的用戶變量都會消失。
用戶變量使用如下(這里我們無須使用declare關鍵字進行定義,可以直接這樣使用):
select @變量名
對用戶變量賦值有兩種方式,一種是直接用"="號,另一種是用":="號。其區別在于使用set命令對用戶變量進行賦值時,兩種方式都可以使用;當使用select語句對用戶變量進行賦值時,只能使用":="方式,因為在select語句中,"="號被看作是比較操作符。
drop procedure if exists math;
create procedure math
(
in a int,
in b int
)
begin
set @var1 = 1;
set @var2 = 2;
select @sum:=(a + b) as sum, @dif:=(a - b) as dif;
end;
mysql> call math(3, 4);
+------+------+
| sum | dif |
+------+------+
| 7 | -1 |
+------+------+
1 row in set (0.00 sec)
mysql> select @var1; //var1為用戶變量
+-------+
| @var1 |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
mysql> select @var2; //var2為用戶變量
+-------+
| @var2 |
+-------+
| 2 |
+-------+
1 row in set (0.00 sec)
4.會話變量
服務器為每個連接的客戶端維護一系列會話變量。在客戶端連接時,使用相應全局變量的當前值對客戶端的會話變量進行初始化。設置會話變量不需要特殊權限,但客戶端只能更改自己的會話變量,而不能更改其它客戶端的會話變量。會話變量的作用域與用戶變量一樣,僅限于當前連接。當當前連接斷開后,其設置的所有會話變量均失效。
設置會話變量有如下三種方式:
set session var_name = value;
set @@session.var_name = value;
set var_name = value;
查看一個會話變量也有如下三種方式:
select @@var_name;
select @@session.var_name;
show session variables like "%var%";
5.全局變量
全局變量影響服務器整體操作。當服務器啟動時,它將所有全局變量初始化為默認值。這些默認值可以在選項文件中或在命令行中指定的選項進行更改。要想更改全局變量,必須具有SUPER權限。全局變量作用于server的整個生命周期,但是不能跨重啟。即重啟后所有設置的全局變量均失效。要想讓全局變量重啟后繼續生效,需要更改相應的配置文件。
要設置一個全局變量,有如下兩種方式:
set global var_name = value;
#注意:此處的global不能省略。根據手冊,set命令設置變量時若不指定GLOBAL、SESSION或者LOCAL,默認使用SESSION
set @@global.var_name = value; //同上
要想查看一個全局變量,有如下兩種方式:
select @@global.var_name;
show global variables like "%var%";
6. mysql declare和set定義變量的區別
mysql declare和set定義變量,除了一個不加@和一個加@這個區別之外,還有以下區別:
declare用來定義局部變量
@用來定義會話變量
declare變量的作用范圍同編程里面類似,在這里一般是在對應的begin和end之間。在end之后這個變量就沒有作用了,不能使用了。這個同編程一樣。
reference:
http://www.lxweimin.com/p/357a02fb2d64
https://www.cnblogs.com/zhuawang/p/4090916.html
http://www.manongjc.com/article/1441.html
http://www.manongjc.com/article/1441.html