如:查出最高分數,再查該分數的所有用戶。
-- 1. 將聚合結果存入用戶變數
SET @max_score = (SELECT MAX(FScoreCount) FROM Tbl_User);
-- 2. 後續查詢直接引用
SELECT * FROM Tbl_User WHERE FScoreCount = @max_score;
-- 變數特性:
-- @var_name 格式,會話私有
-- 類型自動推斷
-- 連線斷開自動銷毀
-- 1. 建立臨時表存儲中間結果
CREATE TEMPORARY TABLE tmp_max_score AS
SELECT MAX(FScoreCount) AS max_score FROM Tbl_User;
-- 2. 後續查詢關聯或子查詢
SELECT u.* FROM Tbl_User u
JOIN tmp_max_score t ON u.FScoreCount = t.max_score;
-- 或子查詢
SELECT * FROM Tbl_User
WHERE FScoreCount = (SELECT max_score FROM tmp_max_score);
-- 臨時表特性:
-- CREATE TEMPORARY TABLE ... 只在當前會話可見
-- 會話結束/斷開自動 DROP
-- 可建索引、支援複雜查詢
-- 同名永久表被隱藏
| 維度 | 用戶變數 @var | 臨時表 |
|---|---|---|
| 儲存位置 | 內存(線程私有內存) | 磁碟(MyISAM/InnoDB)或內存 |
| 容量 | 極小(單值/少量變數) | 大(受限於 tmp_table_size/磁碟) |
| 結構 | 無結構,單值 | 完整表結構,可多列、多行 |
| 索引支援 | 無 | 可建索引加速 JOIN/WHERE |
| 並發隔離 | 會話級完全隔離 | 會話級完全隔離 |
| 生命週期 | 會話結束銷毀 | 會話結束自動 DROP |
| SQL 注入風險 | 低(類型綁定) | 低(DDL 階段構建) |
| 適用場景 | 單一標量值、標誌位、計數器 | 中間結果集、多步驟 ETL、複雜報表 |
WITH max_score_cte AS (
SELECT MAX(FScoreCount) AS max_score FROM Tbl_User
)
SELECT u.* FROM Tbl_User u
JOIN max_score_cte m ON u.FScoreCount = m.max_score;
需要暫存中間結果?
├─ MySQL 8.0+? → WITH CTE (首選)
├─ 單一標量值(MAX/COUNT/FLAG)? → @用戶變數
├─ 結果集需多次複用/建索引/JOIN? → CREATE TEMPORARY TABLE
└─ 老版本/跨語句複用? → 臨時表
用對暫存方式,讓複雜查詢邏輯清晰、效能最優。