溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL的變量類別及作用

發(fā)布時(shí)間:2020-05-09 10:15:37 來(lái)源:億速云 閱讀:176 作者:三月 欄目:MySQL數(shù)據(jù)庫(kù)

下面跟著筆者一起來(lái)了解下MySQL的變量類別及作用,相信大家看完肯定會(huì)受益匪淺,文字在精不在多,希望MySQL的變量類別及作用這篇短內(nèi)容是你想要的。                                                             

MySQL 的變量分為四種: 局部變量 、 用戶變量 、 會(huì)話變量 和 全局變量 ,其中局部變量只存在于函數(shù)和存儲(chǔ)過(guò)程,這里不多了解。其中 會(huì)話變量 和 全局變量 在 MySQL 中統(tǒng)稱為 系統(tǒng)變量 。

用戶變量

基本

顧名思義,就是用戶定義的變量。如何定義變量呢?有兩種方法:

SET 方式

# 兩種方式都可以
SET @variable = expr
SET @variable := expr

SELECT 方式

# 必須 :=
SELECT @variable := expr

用戶變量定義備注:

  1. 未定義變量的初始值為 null(可不定義變量直接使用,不會(huì)報(bào)錯(cuò))

  2. 變量名對(duì)大小寫(xiě)不敏感

  3. 變量不能在要求字面值的地方使用,比如 select 中的 limit 語(yǔ)句等。

  4. 調(diào)用用戶變量的表達(dá)式的計(jì)算順序?qū)嶋H上是未定義的,如 SELECT @a = 0, @a := @a + 1;,兩列都可能是 0 。

  5. 為用戶變量賦值時(shí),會(huì)先確定表達(dá)式的值。如何理解,請(qǐng)看如下代碼:

    SET @m = 0;
    SET @m = 3, @n = @m;
    SELECT @n; # 0
  6. 雖然用戶變量的類型可以動(dòng)態(tài)修改,但不建議這么操作,因?yàn)樵诮唤哟a的時(shí)候你可能會(huì)有生命危險(xiǎn):p。

作為變量,都是有作用域的,用戶變量的作用是整個(gè)會(huì)話,即整個(gè)會(huì)話間都是有效的。這看起來(lái)不錯(cuò),但要注意,當(dāng)使用了連接池,自定義的用戶變量又沒(méi)有正確初始化,容易出現(xiàn)意想不到的問(wèn)題。因?yàn)樗鼘?shí)際上并沒(méi)有被銷(xiāo)毀,依舊記錄者上一次的結(jié)果。

示例

我們來(lái)一個(gè)簡(jiǎn)單的示例,實(shí)現(xiàn)一個(gè)序號(hào)的功能,表和數(shù)據(jù)如下:

CREATE TABLE employee (
   id int primary key,
   salary int not null
);

INSERT INTO employee VALUES(1, 100);
INSERT INTO employee VALUES(2, 200);
INSERT INTO employee VALUES(3, 300);

根據(jù)之前學(xué)習(xí)的內(nèi)容,我們可以很快的寫(xiě)出如下 SQL:

SELECT salary, (@rowno := @rowno + 1) AS 'rowno'
FROM employee, (SELECT @rowno := 0) r;

沒(méi)有問(wèn)題,一切都和預(yù)期一樣,然后我們加一個(gè) WHERE 條件試試:

SELECT salary, (@rowno := @rowno + 1) AS 'rowno'
FROM employee, (SELECT @rowno := 0) r
WHERE @rowno = 0;

理論上來(lái)說(shuō),這是不應(yīng)該返回?cái)?shù)據(jù)的,但是它還就是返回了一條數(shù)據(jù),就是 id 為 1 的那條。
為什么呢? WHERE 條件使用的 @rowno 一直都是同一個(gè)值 0 ,它不會(huì)因?yàn)?SELECT 上修改了就實(shí)時(shí)響應(yīng) 。要實(shí)現(xiàn)
WHERE 的功能需要改寫(xiě)成如下:

SELECT salary, rowno
FROM (
    SELECT salary, (@rowno := @rowno + 1) AS 'rowno'
    FROM employee, (SELECT @rowno := 0) r
) m
WHERE rowno = 2;

實(shí)際上在 SELECT 的 WHERE 、 GROUP BY 和 ORDER BY 中用戶變量都不會(huì)按預(yù)期操作,它使用的是舊值,不會(huì)實(shí)時(shí)修改。

系統(tǒng)變量

會(huì)話變量

會(huì)話變量為云服務(wù)器為每個(gè)客戶端連接維護(hù)的變量。在客戶端連接時(shí),使用相應(yīng)全局變量的當(dāng)前值對(duì)客戶端的會(huì)話變量進(jìn)行初始化。

顧名思義,會(huì)話變量的作用域就是一個(gè)會(huì)話 Session 咯。如何為會(huì)話變量設(shè)置值呢?如下:

set session var_name = value;
set @@session.var_name = value;
set var_name = value;

注意,只能為現(xiàn)有的會(huì)話變量設(shè)置值,不能創(chuàng)建新的會(huì)話變量。那如何獲取會(huì)話變量呢?如下:

show session variables;
# 以上代碼會(huì)把所有會(huì)話變量羅列出來(lái),可通過(guò) like 進(jìn)行過(guò)濾
show session variables LIKE "%var%";

全局變量

全局變量會(huì)影響云服務(wù)器整體操作。但是一旦重啟,這些設(shè)置會(huì)被重置。注意要想更改全局變量,必須具有SUPER權(quán)限。

它的設(shè)置和會(huì)話變量的設(shè)置是類似的:

set global var_name = value;
set @@global.var_name = value;

全局變量也不能新增變量,只能修改已有的。而獲取全局變量的操作也是和會(huì)話變量類似:

show session variables;
show global variables like "%var%";

看完MySQL的變量類別及作用這篇文章后,很多讀者朋友肯定會(huì)想要了解更多的相關(guān)內(nèi)容,如需獲取更多的行業(yè)信息,可以關(guān)注我們的行業(yè)資訊欄目。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI