在 MySQL 中,@變數名
代表 使用者定義變數(User-Defined Variables)。
它是一種用於在 SQL 語句或會話中臨時儲存資料的變數,具有會話級作用域,在當前資料庫連線中有效。
1. 語法和賦值方式
MySQL 的 @變數名
不需要事先宣告,可以直接使用賦值語句初始化,例如:
SET @myVar = 100;
也可以透過 SELECT ... INTO
語句,將查詢結果賦值給 @變數名
:
SELECT column_name INTO @myVar FROM table_name WHERE condition;
此外,使用 := 也可以在 SELECT 語句中進行賦值:
SELECT @myVar := column_name FROM table_name WHERE condition;
2. 特點和作用域
-
作用域:
@變數名
的值在整個會話中有效,直到會話結束或者被重新賦值。不同會話之間的@變數名
相互獨立。 -
型別靈活:
@變數名
可以儲存任何 MySQL 支援的資料型別,包括數字、字串、日期等,型別會根據賦值自動調整。 -
初始化:未初始化的
@變數名
預設為 NULL。
3. 使用場景
-
跨查詢共享資料:
@變數名
可以在複雜查詢中實現資料共享,這意味著它可以跨多行或多次運算保持和更新數值。因此,在查詢過程中,可以利用@變數名
實現累加等操作,不需要在每次查詢時重新計算或傳遞外部引數。 -
在觸發器和儲存過程中儲存中間值:
@變數名
常用於儲存過程中臨時儲存資料,避免觸發器或儲存過程直接返回結果集。
4. 舉幾個例子
-
第一個例子:在查詢中使用 @變數名 進行累計求和
SET @totalSales = 0; SELECT product_id, sales, @totalSales := @totalSales + sales AS cumulative_sales FROM sales_table ORDER BY product_id;
-
第二個例子:在觸發器中使用
@變數名
儲存新插入行的 IDCREATE TRIGGER after_insert_order AFTER INSERT ON orders FOR EACH ROW BEGIN SET @last_order_id = NEW.order_id; -- 可在後續操作中使用 @last_order_id END;
注意事項
-
命名規範:
@變數名
的命名區分大小寫,可以包含字母、數字及下劃線,但最好避免與 MySQL 關鍵字衝突。 -
避免混淆:
@變數名
與區域性變數(透過DECLARE
宣告)不同,不要在同一上下文中混用,否則可能導致難以除錯的錯誤。