1. MySQL變數的概要
MySQL中變數的角色與便利性
MySQL變數是一個方便的工具,可以在查詢中保存值,並在多個查詢中重複使用。這樣一來,就不需要重複取得相同的資料,使SQL語句更簡潔且高效。
MySQL主要有以下兩種類型的變數:
- 使用者自訂變數:在特定會話(Session)中使用的臨時變數。
- 系統變數:用於控制MySQL伺服器運行設定的變數。
本章節會先詳細介紹使用者自訂變數,接著再說明系統變數的使用方法。
2. MySQL的變數種類
2.1 使用者自訂變數
使用者自訂變數以會話為單位使用,無法被其他客戶端存取。因此,可以在同一會話中安全地重複使用這些變數。宣告變數時使用@
符號。
範例:
SET @user_id = 123;
SELECT @user_id;
像這樣,可以用SET
定義變數,並在後續的查詢中重複使用其值。若要將查詢結果直接存入變數,則可以使用SELECT INTO
。
SELECT name INTO @user_name FROM users WHERE id = @user_id;
2.2 系統變數
系統變數用於調整MySQL伺服器的設定。例如,可以管理最大連線數或逾時設定。
範例:
SHOW VARIABLES LIKE 'max_connections';
此查詢會顯示MySQL伺服器允許的最大同時連線數。系統變數可以使用SET
指令修改,並可套用於整個伺服器或單一會話。

3. 變數的宣告與使用方式
3.1 變數的宣告方法
宣告變數時,可以使用SET
或SELECT INTO
。SET
適合直接指定任意值。
範例:
SET @user_name = '佐藤';
SELECT @user_name;
而使用SELECT INTO
則能將查詢結果直接存入變數。
範例:
SELECT name INTO @user_name FROM users WHERE id = 123;
3.2 在查詢中使用變數
透過變數,可以在查詢中重複利用參數。例如,下列查詢透過變數@user_id
取得使用者資訊。
範例:
SELECT * FROM users WHERE id = @user_id;
這樣一來,可以在同一會話中跨多個查詢保存資料。
4. 常見使用案例
4.1 查詢最佳化
將常用的資料先存入變數,並在後續查詢中重複使用,可以提升效能。
範例:
SELECT MAX(id) INTO @max_id FROM users;
此範例將最大的使用者ID存入變數,並在後續查詢中重複使用。
4.2 日期時間操作案例
利用變數進行日期與時間的計算,有助於管理時間序列資料。
範例:
SELECT NOW() INTO @current_time;
SELECT @current_time - INTERVAL 1 DAY INTO @yesterday;
這樣即可將當前時間或時間差存入變數,並在其他查詢中重複使用。

5. 在儲存過程中使用變數
在儲存過程(Stored Procedure)中使用變數,可以將複雜邏輯集中處理,提升程式碼的重用性。以下是取得使用者資訊的儲存過程範例。
範例:
CREATE PROCEDURE get_user_info(IN user_id INT, OUT user_name VARCHAR(255))
BEGIN
SELECT name INTO user_name FROM users WHERE id = user_id;
END;
呼叫此程序時,可以傳入使用者ID作為參數,並將結果存入變數。
6. 使用變數的最佳實踐
6.1 初始化的重要性
變數在宣告之前必須初始化。如果在未初始化的情況下使用,可能會回傳NULL
。特別是在多個查詢共用同一變數時要特別注意。
6.2 會話中的作用域管理
使用者自訂變數僅在會話期間有效,當會話結束時變數也會被重置。若需要跨會話使用變數,則必須考慮其他方法(例如暫存資料表)。

7. 進階技巧
7.1 使用游標處理資料
當需要處理大量資料時,可以使用游標逐行處理查詢結果。這樣可以一邊將結果存入變數,一邊進行逐步處理。
範例:
DECLARE cursor_user CURSOR FOR SELECT id, name FROM users;
透過游標,可以高效地處理多行資料。
8. 總結
使用MySQL變數可以更有效地管理查詢,提升程式碼的可讀性與效能。妥善區分使用者自訂變數與系統變數,能讓資料操作更精確。特別是結合儲存過程與游標等進階技巧時,能大幅提升MySQL的資料處理能力。