如何在 MySQL 中宣告和使用變數

Gustavo du Mortier 2023年1月30日
  1. MySQL 中的使用者定義變數
  2. 初始化使用者定義的變數
  3. SELECT 語句中使用變數用作欄位
  4. 在 MySQL 中宣告本地變數
  5. 在 MySQL 中宣告系統變數
如何在 MySQL 中宣告和使用變數

在這篇教程文章中,我們將解釋如何在 MySQL 資料庫的 SQL 程式碼中宣告變數。

在 SQL 指令碼上,可以在執行一系列命令期間使用變數儲存值,並使用它們代替文字。

MySQL 中的使用者定義變數

MySQL 可以識別不同型別的變數。第一種型別是使用者定義的變數,由作為字首的@符號標識。在 MySQL 中,你可以訪問使用者定義的變數,而無需事先宣告或初始化它們。如果你這樣做,當初始化時,會給變數分配一個 NULL 值。例如,如果你對一個變數使用 SELECT,而沒有給它賦值,就像在這種情況下。

SELECT @SomeVariable;

MySQL 會返回一個 NULL 值。

初始化使用者定義的變數

要初始化一個使用者定義的變數,需要使用 SETSELECT 語句。你可以一次初始化許多變數,用逗號分隔每個賦值語句,如下所示。

SET @FirstVar=1, @SecondVar=2;

一旦你給一個變數賦值,它將根據給定的值有一個型別。在前面的例子中,@FirstVar@SecondVar 的型別是 int

使用者定義的變數的生命週期在會話處於活動狀態時就會持續,而且它對其他會話是不可見的。一旦會話關閉,該變數就會消失。

有 5 種資料型別可以分配給使用者自定義變數。

  • 字串(二進位制或非二進位制
  • 整數
  • 小數
  • 浮點
  • NULL,它可以與任何型別相關聯。

要給一個變數賦值,可以使用符號 =:=。下面兩個語句具有相同的效果。

SET @MyIntVar = 1;
SET @MyIntVar := 1;

SELECT 語句中使用變數用作欄位

變數可以成為 SELECT 語句的欄位列表的一部分。當你在選擇中指定欄位時,你可以混合變數和欄位名,就像這個例子一樣。

SET @IndexVar := 1;
SELECT @IndexVar, ISBN FROM Books;

在 MySQL 中宣告本地變數

區域性變數不需要在其名稱中使用@字首,但在使用之前必須宣告它們。要宣告一個區域性變數,可以使用 DECLARE 語句,或者在 STORED PROCEDURE 宣告中使用它作為引數。

當你宣告一個區域性變數時,可以選擇給它分配一個預設值。如果你不分配任何預設值,那麼變數將被初始化為一個 NULL 值。

每個變數都生活在一個範圍內,由包含其宣告的 BEGIN ... END 塊限定。

下面的例子說明了使用區域性變數的兩種不同方式:作為過程引數和作為過程內部變數。

DELIMITER $$

CREATE PROCEDURE GetUpdatedPrices(itemcount INT)
BEGIN
	DECLARE factor DECIMAL(5, 2);
	SET factor:=3.45;
	SELECT PartNo, Description, itemcount * factor * ListPrice FROM Catalogue;
END
$$

DELIMITER ;

在前面的例子中,變數 itemcount 被用作引數,將值傳遞給過程。之後在 SELECT 語句中使用該變數來乘以從表中獲得的 ListPrice 欄位。本地變數 factor 用於儲存一個小數值,用來乘以得到的價格。

在 MySQL 中宣告系統變數

還有第三種型別的變數稱為系統變數,用於儲存影響單個客戶端連線的值(SESSION 變數)或影響整個伺服器操作的值(GLOBAL 變數)。

系統變數通常在伺服器啟動時設定。要做到這一點,你可以使用命令列或在選項檔案中包含 SET 語句。但是它們的值可以在 SQL 指令碼中進行修改。

系統變數可以使用雙@符號作為字首,或者在 SET 語句中使用 GLOBALSESSION 字樣來識別。區分 GLOBALSESSION 系統變數的另一種方法是使用第二個字首:globalsession。下面是一些如何為系統變數賦值的例子。

-- Alternative ways to set session system variables:
SET interactive_timeout=30000;
SET SESSION interactive_timeout=30000;
SET @@interactive_timeout=30000;
SET @@local.interactive_timeout=30000;

-- Alternative ways to set global system variables:
SET @@global.interactive_timeout=30000;
SET GLOBAL interactive_timeout=30000;

要檢視會話中或伺服器中使用的系統變數,可以使用 SHOW VARIABLES 語句。如果你想得到一些特定變數的值,你可以新增一個比較運算子來過濾這個列表。例如:

SHOW VARIABLES LIKE '%timeout%'