MySQL中變量的定義和變量的賦值使用(轉)

說明:如今市面上定義變量的教程和書籍基本都放在存儲過程上說明,可是存儲過程上變量只能做用於begin...end塊中,而普通的變量定義和使用都說的比較少,針對此類問題只能在官方文檔中才能找到講解。html

前言mysql

MySQL存儲過程當中,定義變量有兩種方式: sql

一、使用set或select直接賦值,變量名以@開頭數據庫

例如:服務器

set @var=1; 

能夠在一個會話的任何地方聲明,做用域是整個會話,稱爲用戶變量。session

二、以declare關鍵字聲明的變量,只能在存儲過程當中使用,稱爲存儲過程變量,例如: 函數

declare var1 int default 0; 

主要用在存儲過程當中,或者是給存儲傳參數中。ui

二者的區別是: spa

在調用存儲過程時,以declare聲明的變量都會被初始化爲null。而會話變量(即@開頭的變量)則不會被再初始化,在一個會話內,只須初始化一次,以後在會話內都是對上一次計算的結果,就至關於在是這個會話內的全局變量。.net

主體內容

  • 局部變量 
  • 用戶變量 
  • 會話變量 
  • 全局變量 

會話變量和全局變量叫系統變量。

1、局部變量,只在當前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;

2、用戶變量,在客戶端連接到數據庫實例整個過程當中用戶變量都是有效的。

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處理。

3、會話變量

服務器爲每一個鏈接的客戶端維護一系列會話變量。在客戶端鏈接數據庫實例時,使用相應全局變量的當前值對客戶端的會話變量進行初始化。設置會話變量不須要特殊權限,但客戶端只能更改本身的會話變量,而不能更改其它客戶端的會話變量。會話變量的做用域與用戶變量同樣,僅限於當前鏈接。噹噹前鏈接斷開後,其設置的全部會話變量均失效。

設置會話變量有以下三種方式更改會話變量的值:

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的近義詞。

4、全局變量

全局變量影響服務器總體操做。當服務器啓動時,它將全部全局變量初始化爲默認值。這些默認值能夠在選項文件中或在命令行中指定的選項進行更改。要想更改全局變量,必須具備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/ 

相關文章
相關標籤/搜索