INSERT INTO 敘述句 (SQL INSERT INTO Statement)
INSERT INTO 是用來新增資料至某資料表 (table)。
INSERT INTO 語法 (SQL INSERT INTO Syntax)
INSERT INTO table_name (column1, column2, column3...)
VALUES (value1, value2, value3...);
或,可以簡寫成這樣:
INSERT INTO table_name
VALUES (value1, value2, value3...);
使用簡寫的語法每個欄位的值都必需要依序輸入。
INSERT INTO 用法 (Example)
假設我們想從下面的 customers 資料表中新增一顧客的資料:
| C_Id | Name | City | Address | Phone |
|---|---|---|---|---|
| 1 | 張一 | 台北市 | XX路100號 | 02-12345678 |
| 2 | 王二 | 新竹縣 | YY路200號 | 03-12345678 |
我們可以使用以下的 INSERT INTO 敘述句:
INSERT INTO customers (C_Id, Name, City, Address, Phone)
VALUES (3, '李三', '高雄縣', 'ZZ路300號', '07-12345678');
或,簡寫:
INSERT INTO customers
VALUES (3, '李三', '高雄縣', 'ZZ路300號', '07-12345678');
查詢新增後的結果如下:
| C_Id | Name | City | Address | Phone |
|---|---|---|---|---|
| 1 | 張一 | 台北市 | XX路100號 | 02-12345678 |
| 2 | 王二 | 新竹縣 | YY路200號 | 03-12345678 |
| 3 | 李三 | 高雄縣 | ZZ路300號 | 07-12345678 |
只輸入幾個特定的欄位值
你也可以只輸入幾個特定的欄位值:
INSERT INTO customers (C_Id, Name, City)
VALUES (3, '李三', '高雄縣');
查詢新增後的結果如下:
| C_Id | Name | City | Address | Phone |
|---|---|---|---|---|
| 1 | 張一 | 台北市 | XX路100號 | 02-12345678 |
| 2 | 王二 | 新竹縣 | YY路200號 | 03-12345678 |
| 3 | 李三 | 高雄縣 |
一次新增多筆資料
在實務中,我們經常需要一次新增多筆資料,而不是逐筆執行 INSERT INTO。SQL 提供了在一個敘述句中同時插入多筆資料的語法:
INSERT INTO table_name (column1, column2, column3,...)
VALUES
(value1_1, value1_2, value1_3,...),
(value2_1, value2_2, value2_3,...),
(value3_1, value3_2, value3_3,...);
以 customers 資料表為例,一次新增兩位顧客:
INSERT INTO customers (C_Id, Name, City, Address, Phone)
VALUES
(3, '李三', '高雄縣', 'ZZ路300號', '07-12345678'),
(4, '趙四', '台中市', 'YY路400號', '04-87654321');
查詢新增後的結果如下:
| C_Id | Name | City | Address | Phone |
|---|---|---|---|---|
| 1 | 張一 | 台北市 | XX路100號 | 02-12345678 |
| 2 | 王二 | 新北市 | YY路200號 | 02-87654321 |
| 3 | 李三 | 高雄縣 | ZZ路300號 | 07-12345678 |
| 4 | 趙四 | 台中市 | YY路400號 | 04-87654321 |
INSERT INTO SELECT 用法
INSERT INTO SELECT 可以從一個資料表中查詢資料,並將結果直接插入到另一個資料表中。這在資料搬移、備份或合併時非常實用。
INSERT INTO SELECT 語法
將來源資料表的所有欄位插入目標資料表:
INSERT INTO target_table
SELECT * FROM source_table
WHERE condition;
或指定特定欄位:
INSERT INTO target_table (column1, column2, column3,...)
SELECT column1, column2, column3,...
FROM source_table
WHERE condition;
INSERT INTO SELECT 範例
假設我們有一個 new_customers 資料表,裡面存放了新客戶的資料:
| C_Id | Name | City |
|---|---|---|
| 5 | 周五 | 台南市 |
| 6 | 吳六 | 桃園市 |
| 7 | 鄭七 | 新竹市 |
我們想把 new_customers 中位於「台南市」的客戶資料插入到 customers 資料表:
INSERT INTO customers (C_Id, Name, City)
SELECT C_Id, Name, City
FROM new_customers
WHERE City = '台南市';
執行後,customers 資料表將會多出一筆資料:
| C_Id | Name | City | Address | Phone |
|---|---|---|---|---|
| 1 | 張一 | 台北市 | XX路100號 | 02-12345678 |
| 2 | 王二 | 新北市 | YY路200號 | 02-87654321 |
| 5 | 周五 | 台南市 | NULL | NULL |
注意:由於 new_customers 資料表中沒有 Address 和 Phone 欄位,所以插入後這兩個欄位的值為 NULL。如果欄位設定了 NOT NULL 約束條件,則需要確保所有欄位都有對應的值。
搭配聚合函數使用 INSERT INTO SELECT
INSERT INTO SELECT 也可以搭配聚合函數和 GROUP BY 使用,將統計結果直接插入另一個資料表。例如,將各城市的客戶數量統計結果存入 city_stats 資料表:
INSERT INTO city_stats (City, customer_count)
SELECT City, COUNT(*) AS customer_count
FROM customers
GROUP BY City;
查詢結果如下:
| City | customer_count |
|---|---|
| 台北市 | 1 |
| 新北市 | 1 |
| 台南市 | 1 |
使用 INSERT INTO SELECT 時,請確保目標資料表已經存在,且欄位的資料型別與來源查詢結果相符。如果需要同時建立新資料表並複製資料,可以參考 SELECT INTO 語法。
延伸閱讀
- SQL 教學 — 完整 SQL 語法教學
- SQL SELECT — 查詢資料
- SQL UPDATE — 更新資料
- SQL DELETE FROM — 刪除資料
- CREATE TABLE — 建立資料表
- SQL WHERE — 條件篩選
- SQL Subquery — 子查詢