定義變數
語法如下
declare var_name[,...] type [default value];複製程式碼
MYSQL 變數定義只能在儲存過程或函式裡面定義,不像 Oracle / SQL Server。該變數的作用範圍只能在begin...end塊中。變數定義必須寫在複合語句的開頭,並且在任何其他語句的前面。可以一次宣告多個相同型別的變數。可以使用default賦預設值。declare只能用在區域性變數定義中。
#舉例
declare v_test int default 10;複製程式碼
設定變數
方式一
set var_name=expr,[,var_name2=expr ...];
#舉例
set v_test=15;複製程式碼
方式二
select col_name[,...] into var_name[,...] table_expr;
#舉例
select sid into @a from test1;複製程式碼
如果col_name(如sid)返回多行值,@a最後只會去最後一行值。
變數分類
區域性變數(不需要加@)
區域性變數一般用在sql語句塊中,比如儲存過程的begin/end。其作用域僅限於該語句塊,在該語句塊執行完畢後,區域性變數就消失了。區域性變數一般用declare來宣告,可以使用default來說明預設值。
create procedure add(in a int,in b int)
begin
declare c int default 0;#c定義的區域性變數
set c = a + b;
select c as c;
end;複製程式碼
使用者變數(一個@)
使用者變數的作用域要比區域性變數要廣。使用者變數可以作用於當前整個連線,但是噹噹前連線斷開後,其所定義的使用者變數都會消失。
使用者變數使用如下的方式定義:@變數名
#舉例
set @a = 1;
set @b = 2;
select @sum:=(@a + @b), @dif:=(@a - @b);複製程式碼
結果
會話變數(兩個@@)
伺服器為每個連線的客戶端維護一系列會話變數。在客戶端連線時,使用相應全域性變數的當前值對客戶端的會話變數進行初始化。設定會話變數不需要特殊許可權,但客戶端只能更改自己的會話變數,而不能更改其它客戶端的會話變數。會話變數的作用域與使用者變數一樣,僅限於當前連線
。噹噹前連線斷開後,其設定的所有會話變數均失效。
#設定會話變數有如下三種方式:
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%";複製程式碼
全域性變數(兩個@@)
全域性變數影響伺服器整體操作。當伺服器啟動時,它將所有全域性變數初始化為預設值。這些預設值可以在選項檔案中或在命令列中指定的選項進行更改。要想更改全域性變數,必須具有SUPER許可權。全域性變數作用於server的整個生命週期,但是不能跨重啟。即重啟後所有設定的全域性變數均失效。要想讓全域性變數重啟後繼續生效,需要更改相應的配置檔案。
#要設定一個全域性變數,有如下兩種方式:
set global var_name = value;
set @@global.var_name = value; //同上
#要想檢視一個全域性變數,有如下兩種方式:
select @@global.var_name;
show global variables like "%var%";複製程式碼
注意:此處的global不能省略。根據手冊,set命令設定變數時若不指定GLOBAL、SESSION或者LOCAL,預設使用SESSION。