MySQL 允許直接以 SELECT 結果集的結構與資料建立新表,結合 CREATE TABLE 與 INSERT 兩步為一,極適合建立彙總表、備份快照或測試資料集。
CREATE TABLE 新表名
SELECT 欄位列表 FROM 來源表 WHERE 條件;
同樣使用學生/課程/選課三表:
-- 需求:將成績 ≥ 80 分學生的學號、姓名、系名建立新表 stu
CREATE TABLE stu
SELECT s.sno, s.sname, s.dept
FROM s
WHERE s.sno IN (SELECT sc.sno FROM sc WHERE sc.grade >= 80);
| 特性 | 說明 |
|---|---|
| 自動推斷欄位型別 | 新表欄位型別依 SELECT 選項推斷(如 INT、VARCHAR、DECIMAL 等)。 |
| 不複製索引/約束 | 不會複製 PRIMARY KEY、UNIQUE、FOREIGN KEY、INDEX、AUTO_INCREMENT、DEFAULT、COMMENT 等屬性。 |
| 不複製觸發器/視圖 | 僅複製基礎欄位定義與資料。 |
| 可指定 ENGINE/CHARSET | CREATE TABLE stu ENGINE=InnoDB DEFAULT CHARSET=utf8 SELECT ... |
| 可加欄位別名 | SELECT s.sno AS student_id, s.sname AS name ... 新表欄位名為別名。 |
CREATE TABLE stu ENGINE=InnoDB DEFAULT CHARSET=utf8
SELECT s.sno, s.sname, s.dept
FROM s
WHERE s.sno IN (SELECT sc.sno FROM sc WHERE sc.grade >= 80);
-- 事後添加主鍵與索引
ALTER TABLE stu ADD PRIMARY KEY (sno);
ALTER TABLE stu ADD INDEX idx_dept (dept);
CREATE TABLE sales_2023_q1 SELECT ... FROM sales WHERE date BETWEEN '2023-01-01' AND '2023-03-31';若 SELECT 返回大量資料,建表過程會長時間鎖定元資料,生產環境謹慎使用;可先 CREATE TABLE ... LIKE 再 INSERT ... SELECT 分步執行。