如何在 MySQL 中宣告和使用變數
在這篇教程文章中,我們將解釋如何在 MySQL 資料庫的 SQL 程式碼中宣告變數。
在 SQL 指令碼上,可以在執行一系列命令期間使用變數儲存值,並使用它們代替文字。
MySQL 中的使用者定義變數
MySQL 可以識別不同型別的變數。第一種型別是使用者定義的變數,由作為字首的@符號標識。在 MySQL 中,你可以訪問使用者定義的變數,而無需事先宣告或初始化它們。如果你這樣做,當初始化時,會給變數分配一個 NULL 值。例如,如果你對一個變數使用 SELECT,而沒有給它賦值,就像在這種情況下。
SELECT @SomeVariable;
MySQL 會返回一個 NULL 值。
初始化使用者定義的變數
要初始化一個使用者定義的變數,需要使用 SET 或 SELECT 語句。你可以一次初始化許多變數,用逗號分隔每個賦值語句,如下所示。
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 語句中使用 GLOBAL 或 SESSION 字樣來識別。區分 GLOBAL 和 SESSION 系統變數的另一種方法是使用第二個字首:global 或 session。下面是一些如何為系統變數賦值的例子。
-- 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%'