標籤:color 就是 medium tar local str 地方 ssi global
說明:現在市面上定義變數的教程和書籍基本都放在預存程序上說明,但是預存程序上變數只能作用於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_salaryinto v_employee_name, v_employee_salaryfrom employeeswhere 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; #定義一個使用者變數,並初始化為143set @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_sizeselect @@global.sort_buffer_sizeselect @@global.tmpdir
凡是上面提到的session,都可以用local這個關鍵字來代替。
比如:
select @@local.sort_buffer_sizelocal是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,預設使用SESSIONset @@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/[email protected]/blog/static/173612348201162595425697/
MySQL中變數的定義和變數的賦值使用(轉)