24 SQL Select Into
1. 定義
解釋:
Select Into
既可以給表做備份,也可以通過某張表的資料新建另一張表。
2. 前言
本小節,我們將介紹一個數據備份利器——Select Into
。
在資料維護工作中,我們經常需要對某張重要的資料表做備份
,又或者只對某張表中的某些重要欄位做備份
,甚至需要從一張表從提取某些欄位組織成另一張表。
對於這些需求,雖然通過多條 SQL 語句來實現,但是 Select Into 讓它們變得更加簡單。
本小節測試資料如下,請先在資料庫中執行:
DROP TABLE IF EXISTS imooc_user;
CREATE TABLE imooc_user
(
id int PRIMARY KEY,
username varchar(20),
age int,
birthday date
);
INSERT INTO imooc_user(id,username,age,birthday)
VALUES (1,'peter', 18, '2002-10-21'), (2,'pedro', 24, '1996-03-15'),
(3,'jerry', 28, '1992-02-13'), (4,'mike', 38, '1982-04-01');
3. 初級使用
Select Into 可以將資料從某一張表(表 A)備份到另一張表(表 B)中。
使用語法如下:
SELECT [col] INTO [new_table_name] FROM [table_name];
其中col
表示欄位名,此處可以使用*
來表示所有欄位,new_table_name
表示備份表名稱,table_name
是被備份表名稱。
3.1 例1 Select Into 備份使用者表
請書寫 SQL 語句,備份imooc_user
表,但剔除掉其中的birthday
欄位,新表名稱為imooc_user_backup
。
分析:
按照語法直接使用 Select Into 即可,但需剔除掉birthday
欄位。
語句:
整理可得語句如下:
SELECT id,username,age INTO imooc_user_backup FROM imooc_user;
執行成功後,結果如下:
+----+----------+-----+
| id | username | age |
+----+----------+-----+
| 1 | peter | 18 |
| 2 | pedro | 24 |
| 3 | jerry | 28 |
| 4 | mike | 38 |
+----+----------+-----+
注意: MySQL 不支援 Select Into 直接建立資料表,你可以使用如下方式替代:
CREATE TABLE imooc_user_backup(SELECT id,username,age FROM imooc_user);
4. 高階使用
Select Into 還可以搭配 Where 以及 Join 來更加有選擇性備份。
使用語法如下:
SELECT [col] INTO [new_table_name] FROM [table_name] WHERE [col] [condition];
SELECT [col] INTO [new_table_name] FROM [table_name1] JOIN [table_name2] ON [condition];
其中col
表示欄位名稱,table_name
表示資料表名稱,condition
表示條件子句,數字1、2表示多張表。
4.1 例2 Select Into 搭配 Where
請書寫SQL語句,備份imooc_user
表中id大於2
的記錄,新表名稱為imooc_user_backup
。
分析:
按照語法使用 Select Into 搭配 Where,且過濾條件為id > 2
。
語句:
整理可得語句如下:
SELECT * INTO imooc_user_backup FROM imooc_user WHERE id > 2;
執行成功後,結果如下:
+----+----------+-----+------------+
| id | username | age | birthday |
+----+----------+-----+------------+
| 3 | jerry | 28 | 1992-02-13 |
| 4 | mike | 38 | 1982-04-01 |
+----+----------+-----+------------+
MySQL 不支援 Select Into,可使用如下語句替代:
CREATE TABLE imooc_user_backup LIKE imooc_user;
INSERT INTO imooc_user_backup SELECT * FROM imooc_user WHERE id > 2;
4.2 例3 Select Into 搭配 Join
使用 Join 之前,我們需要新建一張 imooc_user_score 表與 imooc_user 表關聯,新建語句如下:
DROP TABLE IF EXISTS imooc_user_score;
CREATE TABLE imooc_user_score
(
id int PRIMARY KEY,
user_id int references imooc_user(id),
user_score int
);
INSERT INTO imooc_user_score VALUES(1,1,10), (2,2,15);
請書寫 SQL 語句,備份imooc_user
和imooc_user_score
表,要求新表擁有使用者 id,使用者積分,使用者名稱這三個欄位,且名稱為imooc_user_score_backup
。
分析:
使用 Select Into 搭配 Join,連線條件為imooc_user.id = imooc_user_score.user_id
。
語句:
整理可得語句如下:
SELECT imooc_user.id,username,user_score INTO imooc_user_score_backup FROM imooc_user
JOIN imooc_user_score ON imooc_user.id = imooc_user_score.user_id;
執行成功後,結果如下:
+----+----------+------------+
| id | username | user_score |
+----+----------+------------+
| 1 | peter | 10 |
| 2 | pedro | 15 |
+----+----------+------------+
MySQL 不支援 Select Into,可使用如下語句替代:
CREATE TABLE imooc_user_score_backup
(
id int PRIMARY KEY,
username varchar(20),
user_score int
);
INSERT INTO imooc_user_score_backup
SELECT imooc_user.id,username,user_score
FROM imooc_user
JOIN imooc_user_score ON imooc_user.id = imooc_user_score.user_id;
5. 小結
- Select Into 不常用於專案開發,但卻是資料庫運維的利器。
- MySQL 資料庫不支援 Select Into,而在 PostgreSQL 中卻可以良好使用,如果你使用 MySQL 則需要有良好的 SQL 基礎。