MySQL的變數有哪些?怎麼用?

不言
發布: 2018-12-30 09:19:19
轉載
7140 人瀏覽過

這篇文章帶給大家的內容是關於MySQL的變數有哪些?怎麼用?有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

MySQL 的變數分為四種: 局部變數 、 使用者變數 、 會話變數 和 全域變數 ,其中局部變數只存在於函數和儲存過程,這裡不多了解。其中 會話變數 和 全域變數 在 MySQL 中統稱為 系統變數 。

使用者變數

基本

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

SET 方式

# 两种方式都可以
SET @variable = expr
SET @variable := expr
登入後複製

SELECT 方式

# 必须 :=
SELECT @variable := expr
登入後複製

使用者變數定義備註:

  1. ##未定義變數的初始值為

    null(可不定義變數直接使用,不會報錯)

  2. #變數名稱對大小寫不敏感

  3. 變數不能在要求字面值的地方使用,例如

    select 中的limit 語句等。

  4. 呼叫使用者變數的表達式的計算順序其實是未定義的,如

    SELECT @a = 0, @a := @a 1;,兩列都可能是0 。

  5. 為使用者變數賦值時,會先確定表達式的值。如何理解,請看如下程式碼:

    SET @m = 0;
    SET @m = 3, @n = @m;
    SELECT @n; # 0
    登入後複製
  6. 雖然使用者變數的型別可以動態修改,但不建議這麼操作,因為在交接程式碼的時候你可能會有生命危險:p 。

作為變量,都是有作用域的,使用者變數的作用是整個會話,即整個會話間都是有效的。這看起來不錯,但要注意,當使用了連接池,自訂的使用者變數又沒有正確初始化,容易出現意想不到的問題。因為它實際上並沒有被銷毀,依舊記錄者上一次的結果。

範例

我們來一個簡單的範例,實作一個序號的功能,表格和資料如下:

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);
登入後複製
根據先前學習的內容,我們可以很快的寫出如下SQL:

SELECT salary, (@rowno := @rowno + 1) AS 'rowno'
FROM employee, (SELECT @rowno := 0) r;
登入後複製
沒有問題,一切都和預期一樣,然後我們加一個WHERE 條件試試:

SELECT salary, (@rowno := @rowno + 1) AS 'rowno'
FROM employee, (SELECT @rowno := 0) r
WHERE @rowno = 0;
登入後複製
理論上,這是不應該回傳資料的,但它還就是回傳了一條數據,就是id 為1 的那條。

為什麼呢? WHERE 條件使用的 @rowno 一直都是同一個值 0 ,它不會因為 SELECT 上修改了就即時回應 。要實現
WHERE 的功能需要改寫成如下:

SELECT salary, rowno
FROM (
    SELECT salary, (@rowno := @rowno + 1) AS 'rowno'
    FROM employee, (SELECT @rowno := 0) r
) m
WHERE rowno = 2;
登入後複製
實際上在SELECT 的WHERE 、 GROUP BY 和ORDER BY 中使用者變數都不會如預期操作,它使用的是舊值,不會即時修改。

系統變數

會話變數

會話變數為伺服器為每個客戶端連線維護的變數。在客戶端連線時,使用對應全域變數的目前值對客戶端的會話變數進行初始化。

顧名思義,會話變數的作用域就是一個會話 Session 咯。如何為會話變數設定值呢?如下:

set session var_name = value;
set @@session.var_name = value;
set var_name = value;
登入後複製
注意,只能為現有的會話變數設定值,不能建立新的會話變數。那如何取得會話變數呢?如下:

show session variables;
# 以上代码会把所有会话变量罗列出来,可通过 like 进行过滤
show session variables LIKE "%var%";
登入後複製
全域變數

全域變數會影響伺服器整體操作。但是一旦重啟,這些設定會被重置。注意要想更改全域變量,必須具有SUPER權限。

它的設定和會話變數的設定是類似的:

set global var_name = value;
set @@global.var_name = value;
登入後複製
全域變數也不能新增變量,只能修改現有的。而取得全域變數的運算也是和會話變數類似:

show session variables;
show global variables like "%var%";
登入後複製


以上是MySQL的變數有哪些?怎麼用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板