日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL中变量的定义和变量的赋值使用(转)

發(fā)布時(shí)間:2024/4/18 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL中变量的定义和变量的赋值使用(转) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

說明:現(xiàn)在市面上定義變量的教程和書籍基本都放在存儲(chǔ)過程上說明,但是存儲(chǔ)過程上變量只能作用于begin...end塊中,而普通的變量定義和使用都說的比較少,針對(duì)此類問題只能在官方文檔中才能找到講解。

前言

MySQL存儲(chǔ)過程中,定義變量有兩種方式:?

1、使用set或select直接賦值,變量名以@開頭

例如:

set @var=1;

可以在一個(gè)會(huì)話的任何地方聲明,作用域是整個(gè)會(huì)話,稱為用戶變量。

2、以declare關(guān)鍵字聲明的變量,只能在存儲(chǔ)過程中使用,稱為存儲(chǔ)過程變量,例如:?

declare var1 int default 0;

主要用在存儲(chǔ)過程中,或者是給存儲(chǔ)傳參數(shù)中。

兩者的區(qū)別是:?

在調(diào)用存儲(chǔ)過程時(shí),以declare聲明的變量都會(huì)被初始化為null。而會(huì)話變量(即@開頭的變量)則不會(huì)被再初始化,在一個(gè)會(huì)話內(nèi),只須初始化一次,之后在會(huì)話內(nèi)都是對(duì)上一次計(jì)算的結(jié)果,就相當(dāng)于在是這個(gè)會(huì)話內(nèi)的全局變量。

主體內(nèi)容

  • 局部變量?
  • 用戶變量?
  • 會(huì)話變量?
  • 全局變量?

會(huì)話變量和全局變量叫系統(tǒng)變量。

一、局部變量,只在當(dāng)前begin/end代碼塊中有效

????????局部變量一般用在sql語句塊中,比如存儲(chǔ)過程的begin/end。其作用域僅限于該語句塊,在該語句塊執(zhí)行完畢后,局部變量就消失了。declare語句專門用于定義局部變量,可以使用default來說明默認(rèn)值。set語句是設(shè)置不同類型的變量,包括會(huì)話變量和全局變量。?
局部變量定義語法形式

declare var_name [, var_name]... data_type [ DEFAULT value ];

例如在begin/end語句塊中添加如下一段語句,接受函數(shù)傳進(jìn)來的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;

二、用戶變量,在客戶端鏈接到數(shù)據(jù)庫實(shí)例整個(gè)過程中用戶變量都是有效的。

MySQL中用戶變量不用事前申明,在用的時(shí)候直接用“@變量名”使用就可以了。?

第一種用法:set @num=1; 或set @num:=1;?//這里要使用set語句創(chuàng)建并初始化變量,直接使用@num變量?

第二種用法:select @num:=1; 或 select @num:=字段名 from 表名 where ……,?

select語句一般用來輸出用戶變量,比如select @變量名,用于輸出數(shù)據(jù)源不是表格的數(shù)據(jù)。

注意上面兩種賦值符號(hào),使用set時(shí)可以用“=”或“:=”,但是使用select時(shí)必須用“:=賦值”

用戶變量與數(shù)據(jù)庫連接有關(guān),在連接中聲明的變量,在存儲(chǔ)過程中創(chuàng)建了用戶變量后一直到數(shù)據(jù)庫實(shí)例接斷開的時(shí)候,變量就會(huì)消失。

在此連接中聲明的變量無法在另一連接中使用。

用戶變量的變量名的形式為@varname的形式。

名字必須以@開頭。

聲明變量的時(shí)候需要使用set語句,比如下面的語句聲明了一個(gè)名為@a的變量。

set @a = 1;

聲明一個(gè)名為@a的變量,并將它賦值為1,MySQL里面的變量是不嚴(yán)格限制數(shù)據(jù)類型的,它的數(shù)據(jù)類型根據(jù)你賦給它的值而隨時(shí)變化?。(SQL SERVER中使用declare語句聲明變量,且嚴(yán)格限制數(shù)據(jù)類型。)?

我們還可以使用select語句為變量賦值 。?

比如:

set @name = ''; select @name:=password from user limit 0,1; #從數(shù)據(jù)表中獲取一條記錄password字段的值給@name變量。在執(zhí)行后輸出到查詢結(jié)果集上面。

(注意等于號(hào)前面有一個(gè)冒號(hào),后面的limit 0,1是用來限制返回結(jié)果的,表示可以是0或1個(gè)。相當(dāng)于SQL SERVER里面的top 1)?

如果直接寫:select @name:=password from user;

如果這個(gè)查詢返回多個(gè)值的話,那@name變量的值就是最后一條記錄的password字段的值 。?

用戶變量可以作用于當(dāng)前整個(gè)連接,但當(dāng)當(dāng)前連接斷開后,其所定義的用戶變量都會(huì)消失。?

用戶變量使用如下(我們無須使用declare關(guān)鍵字對(duì)用戶變量進(jìn)行定義,可以直接這樣使用)定義,變量名必須以@開始:

#定義 select @變量名 或者 select @變量名:= 字段名 from 表名 where 過濾語句; set @變量名; #賦值 @num為變量名,value為值 set @num=value;或select @num:=value;

對(duì)用戶變量賦值有兩種方式,一種是直接用”=”號(hào),另一種是用”:=”號(hào)。其區(qū)別在于使用set命令對(duì)用戶變量進(jìn)行賦值時(shí),兩種方式都可以使用;當(dāng)使用select語句對(duì)用戶變量進(jìn)行賦值時(shí),只能使用”:=”方式,因?yàn)樵趕elect語句中,”=”號(hào)declare語句專門用于定義局部變量。set語句是設(shè)置不同類型的變量,包括會(huì)話變量和全局變量。

例如:

#在查詢中 begin #Routine body goes here... #select c as c; declare c int default 0; set @var1=143; #定義一個(gè)用戶變量,并初始化為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); #執(zhí)行上面定義的存儲(chǔ)過程 select @var1; #看定義的用戶變量在存儲(chǔ)過程執(zhí)行完后,是否還可以輸出,結(jié)果是可以輸出用戶變量@var1,@var2兩個(gè)變量的。 select @var2;

在執(zhí)行完order存儲(chǔ)過程后,在存儲(chǔ)過程中新建的var1,var2用戶變量還是可以用select語句輸出的,但是存儲(chǔ)過程里面定義的局部變量c不能識(shí)別。

系統(tǒng)變量:

系統(tǒng)變量又分為全局變量與會(huì)話變量。

全局變量在MySQL啟動(dòng)的時(shí)候由服務(wù)器自動(dòng)將它們初始化為默認(rèn)值,這些默認(rèn)值可以通過更改my.ini這個(gè)文件來更改。

會(huì)話變量在每次建立一個(gè)新的連接的時(shí)候,由MySQL來初始化。MySQL會(huì)將當(dāng)前所有全局變量的值復(fù)制一份。來做為會(huì)話變量。

(也就是說,如果在建立會(huì)話以后,沒有手動(dòng)更改過會(huì)話變量與全局變量的值,那所有這些變量的值都是一樣的。)

全局變量與會(huì)話變量的區(qū)別就在于,對(duì)全局變量的修改會(huì)影響到整個(gè)服務(wù)器,但是對(duì)會(huì)話變量的修改,只會(huì)影響到當(dāng)前的會(huì)話(也就是當(dāng)前的數(shù)據(jù)庫連接)。

我們可以利用

show session variables;

語句將所有的會(huì)話變量輸出(可以簡寫為show variables,沒有指定是輸出全局變量還是會(huì)話變量的話,默認(rèn)就輸出會(huì)話變量。)如果想輸出所有全局變量:

show global variables

有些系統(tǒng)變量的值是可以利用語句來動(dòng)態(tài)進(jìn)行更改的,但是有些系統(tǒng)變量的值卻是只讀的。

對(duì)于那些可以更改的系統(tǒng)變量,我們可以利用set語句進(jìn)行更改。

系統(tǒng)變量在變量名前面有兩個(gè)@;?

如果想要更改會(huì)話變量的值,利用語句:

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權(quán)限 。

(注意,root只是一個(gè)內(nèi)置的賬號(hào),而不是一種權(quán)限 ,這個(gè)賬號(hào)擁有了MySQL數(shù)據(jù)庫里的所有權(quán)限。任何賬號(hào)只要它擁有了名為super的這個(gè)權(quán)限,就可以更改全局變量的值,正如任何用戶只要擁有file權(quán)限就可以調(diào)用load_file或者into outfile,into dumpfile,load data infile一樣。)

利用select語句我們可以查詢單個(gè)會(huì)話變量或者全局變量的值:

select @@session.sort_buffer_size select @@global.sort_buffer_size select @@global.tmpdir

凡是上面提到的session,都可以用local這個(gè)關(guān)鍵字來代替。

比如:  

select @@local.sort_buffer_size local是session的近義詞。

無論是在設(shè)置系統(tǒng)變量還是查詢系統(tǒng)變量值的時(shí)候,只要沒有指定到底是全局變量還是會(huì)話變量。都當(dāng)做會(huì)話變量來處理。?

比如:?

set @@sort_buffer_size = 50000; select @@sort_buffer_size;

上面都沒有指定是blobal還是session,所以全部當(dāng)做session處理。

三、會(huì)話變量

服務(wù)器為每個(gè)連接的客戶端維護(hù)一系列會(huì)話變量。在客戶端連接數(shù)據(jù)庫實(shí)例時(shí),使用相應(yīng)全局變量的當(dāng)前值對(duì)客戶端的會(huì)話變量進(jìn)行初始化。設(shè)置會(huì)話變量不需要特殊權(quán)限,但客戶端只能更改自己的會(huì)話變量,而不能更改其它客戶端的會(huì)話變量。會(huì)話變量的作用域與用戶變量一樣,僅限于當(dāng)前連接。當(dāng)當(dāng)前連接斷開后,其設(shè)置的所有會(huì)話變量均失效。

設(shè)置會(huì)話變量有如下三種方式更改會(huì)話變量的值:

set session var_name = value; set @@session.var_name = value; set var_name = value; #缺省session關(guān)鍵字默認(rèn)認(rèn)為是session查看所有的會(huì)話變量 show session variables;

查看一個(gè)會(huì)話變量也有如下三種方式:

select @@var_name; select @@session.var_name; show session variables like "%var%";

凡是上面提到的session,都可以用local這個(gè)關(guān)鍵字來代替。?

比如:?

select @@local.sort_buffer_size local是session的近義詞。

四、全局變量

全局變量影響服務(wù)器整體操作。當(dāng)服務(wù)器啟動(dòng)時(shí),它將所有全局變量初始化為默認(rèn)值。這些默認(rèn)值可以在選項(xiàng)文件中或在命令行中指定的選項(xiàng)進(jìn)行更改。要想更改全局變量,必須具有super權(quán)限。全局變量作用于server的整個(gè)生命周期,但是不能跨重啟。即重啟后所有設(shè)置的全局變量均失效。要想讓全局變量重啟后繼續(xù)生效,需要更改相應(yīng)的配置文件。

要設(shè)置一個(gè)全局變量,有如下兩種方式:

set global var_name = value; //注意:此處的global不能省略。根據(jù)手冊(cè),set命令設(shè)置變量時(shí)若不指定GLOBAL、SESSION或者LOCAL,默認(rèn)使用SESSION set @@global.var_name = value; //同上

查看所有的全局變量?

show global variables;

要想查看一個(gè)全局變量,有如下兩種方式:

select @@global.var_name; show global variables like “%var%”;

參考:

mysql中各種類型變量的定義以及賦值使用_JQ_AK47的博客-CSDN博客_mysql定義變量(以上內(nèi)容轉(zhuǎn)自此篇文章)

mysql存儲(chǔ)過程中 declare 和 set 定義變量的區(qū)別_seteor的博客-CSDN博客_mysql set和declare

MySQL變量的定義與賦值_mrdavidtian的博客-CSDN博客_mysql定義變量并賦值

MySql 申明變量以及賦值 - Cat Qi - 博客園

http://blog.163.com/longsu2010@yeah/blog/static/173612348201162595425697/

總結(jié)

以上是生活随笔為你收集整理的MySQL中变量的定义和变量的赋值使用(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。