Temporary Table 暫存表 (SQL Temporary Table)
Temporary Table(暫存表、臨時表)是一種暫時性的資料表,只存在於當前的連線階段中。當連線結束時,暫存表會自動被刪除。
暫存表適合用來儲存中間計算結果、複雜查詢的暫存資料,或是需要多次使用的子查詢結果。
建立暫存表
SQL Server / PostgreSQL
CREATE TEMPORARY TABLE temp_customers (
id INT,
name VARCHAR(50),
city VARCHAR(50)
);
-- 或使用縮寫
CREATE TEMP TABLE temp_customers (
id INT,
name VARCHAR(50)
);
MySQL
CREATE TEMPORARY TABLE temp_customers (
id INT,
name VARCHAR(50),
city VARCHAR(50)
);
Oracle
Oracle 使用 Global Temporary Table,表結構是永久的,但資料是暫時的:
CREATE GLOBAL TEMPORARY TABLE temp_customers (
id NUMBER,
name VARCHAR2(50)
) ON COMMIT DELETE ROWS; -- 交易結束時刪除資料
-- 或
ON COMMIT PRESERVE ROWS; -- 連線結束時才刪除資料
從查詢結果建立暫存表
SQL Server
SELECT * INTO #temp_customers
FROM customers
WHERE city = '台北';
SQL Server 使用 # 前綴表示暫存表,## 表示全域暫存表(所有連線都能存取)。
MySQL
CREATE TEMPORARY TABLE temp_customers AS
SELECT * FROM customers WHERE city = '台北';
PostgreSQL
CREATE TEMP TABLE temp_customers AS
SELECT * FROM customers WHERE city = '台北';
使用暫存表
暫存表建立後,可以像一般資料表一樣使用:
-- 新增資料
INSERT INTO temp_customers (id, name, city) VALUES (1, '張一', '台北');
-- 查詢資料
SELECT * FROM temp_customers;
-- 更新資料
UPDATE temp_customers SET city = '新北' WHERE id = 1;
-- 刪除資料
DELETE FROM temp_customers WHERE id = 1;
刪除暫存表
雖然暫存表會在連線結束時自動刪除,但如果想要提早釋放資源,可以手動刪除:
DROP TEMPORARY TABLE temp_customers;
-- SQL Server
DROP TABLE #temp_customers;
暫存表 vs CTE vs 子查詢
| 特性 | 暫存表 | CTE | 子查詢 |
|---|---|---|---|
| 可重複使用 | 是 | 同一查詢內 | 否 |
| 可建立索引 | 是 | 否 | 否 |
| 生命週期 | 連線期間 | 單次查詢 | 單次查詢 |
| 適用情境 | 大量資料、多次使用 | 提高可讀性 | 簡單情境 |
實際應用範例
將複雜計算結果存入暫存表,供後續多次使用:
-- 建立暫存表儲存每個客戶的訂單統計
CREATE TEMPORARY TABLE temp_customer_stats AS
SELECT
customer_id,
COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id;
-- 查詢高價值客戶
SELECT * FROM temp_customer_stats WHERE total_amount > 10000;
-- 查詢訂單次數最多的客戶
SELECT * FROM temp_customer_stats ORDER BY order_count DESC LIMIT 10;