MySQL中變數的定義和變數的賦值使用

lhrbest發表於2019-07-12

MySQL中變數的定義和變數的賦值使用

前言

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%”;

 








About Me

........................................................................................................................

● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除

● 本文在itpub( http://blog.itpub.net/26736162 )、部落格園( http://www.cnblogs.com/lhrbest )和個人weixin公眾號( xiaomaimiaolhr )上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文部落格園地址: http://www.cnblogs.com/lhrbest

● 本文pdf版、個人簡介及小麥苗雲盤地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

........................................................................................................................

● QQ群號: 230161599 (滿) 、618766405

● weixin群:可加我weixin,我拉大家進群,非誠勿擾

● 聯絡我請加QQ好友 646634621 ,註明新增緣由

● 於 2019-07-01 06:00 ~ 2019-07-31 24:00 在西安完成

● 最新修改時間:2019-07-01 06:00 ~ 2019-07-31 24:00

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

........................................................................................................................

小麥苗的微店 https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麥苗出版的資料庫類叢書 http://blog.itpub.net/26736162/viewspace-2142121/

小麥苗OCP、OCM、高可用網路班 http://blog.itpub.net/26736162/viewspace-2148098/

小麥苗騰訊課堂主頁 https://lhr.ke.qq.com/

........................................................................................................................

使用 weixin客戶端 掃描下面的二維碼來關注小麥苗的weixin公眾號( xiaomaimiaolhr )及QQ群(DBA寶典)、新增小麥苗weixin, 學習最實用的資料庫技術。

........................................................................................................................

歡迎與我聯絡

 

 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2650405/,如需轉載,請註明出處,否則將追究法律責任。

相關文章