MySQL中變量的定義和變量的賦值使用(轉)
說明:現在市面上定義變量的教程和書籍基本都放在存儲過程上說明,但是存儲過程上變量只能作用於begin...end塊中,而普通的變量定義和使用都說的比較少,針對此類問題只能在官方文檔中才能找到講解。
前言
MySQL存儲過程中,定義變量有兩種方式:
1、使用set或select直接賦值,變量名以@開頭
例如:
set @var=1;
可以在一個會話的任何地方聲明,作用域是整個會話,稱為用戶變量。
2、以declare關鍵字聲明的變量,只能在存儲過程中使用,稱為存儲過程變量,例如:
declare var1 int default 0;
主要用在存儲過程中,或者是給存儲傳參數中。
兩者的區別是:
在調用存儲過程時,以declare聲明的變量都會被初始化為null。而會話變量(即@開頭的變量)則不會被再初始化,在一個會話內,只須初始化一次,之後在會話內都是對上一次計算的結果,就相當於在是這個會話內的全局變量。
主體內容
- 局部變量
- 用戶變量
- 會話變量
- 全局變量
會話變量和全局變量叫系統變量。
一、局部變量,只在當前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;
二、用戶變量,在客戶端鏈接到數據庫實例整個過程中用戶變量都是有效的。
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處理。
三、會話變量
服務器為每個連接的客戶端維護一系列會話變量。在客戶端連接數據庫實例時,使用相應全局變量的當前值對客戶端的會話變量進行初始化。設置會話變量不需要特殊權限,但客戶端只能更改自己的會話變量,而不能更改其它客戶端的會話變量。會話變量的作用域與用戶變量一樣,僅限於當前連接。當當前連接斷開後,其設置的所有會話變量均失效。
設置會話變量有如下三種方式更改會話變量的值:
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的近義詞。
四、全局變量
全局變量影響服務器整體操作。當服務器啟動時,它將所有全局變量初始化為默認值。這些默認值可以在選項文件中或在命令行中指定的選項進行更改。要想更改全局變量,必須具有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/
MySQL中變量的定義和變量的賦值使用(轉)