MySQL中的@變數名

hisun9發表於2024-11-12

在 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;
    
  • 第二個例子:在觸發器中使用 @變數名 儲存新插入行的 ID

    CREATE 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 宣告)不同,不要在同一上下文中混用,否則可能導致難以除錯的錯誤。

相關文章