學習重點
使用
INSERT
語句可以向表中插入數據(行)。原則上,INSERT
語句每次執行一行數據的插入。將列名和值用逗號隔開,分別括在
()
內,這種形式稱為清單。對表中所有列進行
INSERT
操作時可以省略表名后的列清單。插入
NULL
時需要在VALUES
子句的值清單中寫入NULL
。可以為表中的列設定默認值(初始值),默認值可以通過在
CREATE TABLE
語句中為列設置DEFAULT
約束來設定。插入默認值可以通過兩種方式實現,即在
INSERT
語句的VALUES
子句中指定DEFAULT
關鍵字(顯式方法),或省略列清單(隱式方法)。使用
INSERT…SELECT
可以從其他表中復制數據。
一、什么是 INSERT
表的創建 中給大家介紹了用來創建表的 CREATE TABLE
語句。通過 CREATE TABLE
語句創建出來的表,可以被認為是一個空空如也的箱子。只有把數據裝入到這個箱子后,它才能稱為數據庫。用來裝入數據的 SQL 就是 INSERT
(插入)(圖 1)。
KEYWORD
INSERT
語句

圖 1 INSERT(插入)的流程
本節將會和大家一起學習 INSERT
語句。
要學習 INSERT
語句,我們得首先創建一個名為 ProductIns
的表。請大家執行代碼清單 1 中的 CREATE TABLE
語句。該表除了為 sale_price
列(銷售單價)設置了 DEFAULT 0
的約束之外,其余內容與之前使用的 Product
(商品)表完全相同。DEFAULT 0
的含義將會在隨后進行介紹,大家暫時可以忽略。
代碼清單 1 創建 ProductIns
表的 CREATE TABLE
語句
CREATE TABLE ProductIns
(product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER DEFAULT 0,
purchase_price INTEGER ,
regist_date DATE ,
PRIMARY KEY (product_id));
如前所述,這里僅僅是創建出了一個表,並沒有插入數據。接下來,我們就向 ProductIns
表中插入數據。
二、INSERT
語句的基本語法
表的刪除和更新 中講到向 CREATE TABLE
語句創建出的 Product
表中插入數據的 SQL 語句時,曾介紹過 INSERT
語句的使用示例,但當時的目的只是為學習 SELECT
語句准備所需的數據,並沒有詳細介紹其語法。下面就讓我們來介紹一下 INSERT
語句的語法結構。
INSERT
語句的基本語法如下所示。
語法 1 INSERT
語句
INSERT INTO <表名> (列1, 列2, 列3, ……) VALUES (值1, 值2, 值3, ……);
例如,我們要向 ProductIns
表中插入一行數據,各列的值如下所示。
product_id (商品編號) |
product_name (商品名稱) |
product_type (商品種類) |
sale_price (銷售單價) |
purchase_price (進貨單價) |
regist_date (登記日期) |
---|---|---|---|---|---|
0001 | T 恤衫 | 衣服 | 1000 | 500 | 2009-09-20 |
此時使用的 INSERT
語句可參見代碼清單 2。
代碼清單 2 向表中插入一行數據
INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');
由於 product_id
列(商品編號)和 product_name
列(商品名稱)是字符型,所以插入的數據需要像 '0001'
這樣用單引號括起來。日期型的 regist_date
(登記日期)列也是如此 [1]。
將列名和值用逗號隔開,分別括在()
內,這種形式稱為清單。代碼清單 2 中的 INSERT
語句包含如下兩個清單。
A: 列清單→(product_id
, product_name
, product_type
, sale_price
, purchase_price
, regist_date
)
B: 值清單→('0001'
, 'T恤衫'
, '衣服'
, 1000
, 500
,'2009-09-20'
)
KEYWORD
清單
列清單
值清單
當然,表名后面的列清單和 VALUES
子句中的值清單的列數必須保持一致。如下所示,列數不一致時會出錯,無法插入數據 [2]。
-- VALUES子句中的值清單缺少一列
INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0001', 'T恤衫', '衣服', 1000, 500);
此外,原則上,執行一次 INSERT
語句會插入一行數據 [3]。因此,插入多行時,通常需要循環執行相應次數的 INSERT
語句。
法則 1
原則上,執行一次
INSERT
語句會插入一行數據。
專欄
多行
INSERT
法則 1 中介紹了“執行一次
INSERT
語句會插入一行數據”的原則。雖然在大多數情況下該原則都是正確的,但它也僅僅是原則而已,其實很多 RDBMS 都支持一次插入多行數據,這樣的功能稱為多行INSERT
(multi row INSERT)。KEYWORD
多行
INSERT
其語法請參見代碼清單A,將多條
VALUES
子句通過逗號進行分隔排列。代碼清單 A 通常的
INSERT
和多行INSERT
-- 通常的INSERT INSERT INTO ProductIns VALUES ('0002', '打孔器', '辦公用品', 500, 320, '2009-09-11'); INSERT INTO ProductIns VALUES ('0003', '運動T恤', '衣服', 4000, 2800, NULL); INSERT INTO ProductIns VALUES ('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20'); -- 多行INSERT (Oracle以外) INSERT INTO ProductIns VALUES ('0002', '打孔器', '辦公用品', 500, 320, '2009-09-11'), ('0003', '運動T恤', '衣服', 4000, 2800, NULL), ('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20');
該語法很容易理解,並且減少了書寫語句的數量,非常方便。但是,使用該語法時請注意以下幾點。
首先,
INSERT
語句的書寫內容及插入的數據是否正確。若不正確會發生INSERT
錯誤,但是由於是多行插入,和特定的單一行插入相比,想要找出到底是哪行哪個地方出錯了,就變得十分困難。其次,多行
INSERT
的語法並不適用於所有的 RDBMS。該語法適用於 DB2、SQL、SQL Server、PostgreSQL 和 MySQL,但不適用於 Oracle。特定的 SQL
Oracle
使用如下語法來巧妙地完成多行INSERT
操作。-- Oracle中的多行INSERT INSERT ALL INTO ProductIns VALUES ('0002', '打孔器', '辦公用品', 500, 320, '2009-09-11') INTO ProductIns VALUES ('0003', '運動T恤', '衣服', 4000, 2800, NULL) INTO ProductIns VALUES ('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20') SELECT * FROM DUAL;
DUAL
是Oracle
特有(安裝時的必選項)的一種臨時表 [4]。因此“SELECT * FROM DUAL
”部分也只是臨時性的,並沒有實際意義。
三、列清單的省略
對表進行全列 INSERT
時,可以省略表名后的列清單。這時 VALUES
子句的值會默認按照從左到右的順序賦給每一列。因此,代碼清單 3 中的兩個 INSERT
語句會插入同樣的數據。
代碼清單 3 省略列清單
-- 包含列清單
INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0005', '高壓鍋', '廚房用具', 6800, 5000, '2009-01-15');
-- 省略列清單
INSERT INTO ProductIns VALUES ('0005', '高壓鍋', '廚房用具', 6800, 5000, '2009-01-15');
四、插入 NULL
INSERT
語句中想給某一列賦予 NULL
值時,可以直接在 VALUES
子句的值清單中寫入 NULL
。例如,要向 purchase_price
列(進貨單價)中插入 NULL
,就可以使用代碼清單 4 中的 INSERT
語句。
代碼清單 4 向 purchase_price
列中插入 NULL
INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0006', '叉子', '廚房用具', 500, NULL, '2009-09-20');
但是,想要插入 NULL
的列一定不能設置 NOT NULL
約束。向設置了 NOT NULL
約束的列中插入 NULL
時,INSERT
語句會出錯,導致數據插入失敗。
插入失敗指的是希望通過 INSERT
語句插入的數據無法正常插入到表中,但之前已經插入的數據並不會被破壞 [5]。
五、插入默認值
我們還可以向表中插入默認值(初始值)。可以通過在創建表的 CREATE TABLE
語句中設置 DEFAULT
約束來設定默認值。
KEYWORD
-
默認值
-
DEFAULT
約束
本文開頭創建的 ProductIns
表的定義部分請參見代碼清單 5。其中 DEFAULT 0
就是設置 DEFAULT
約束的部分。像這樣,我們可以通過“DEFAULT <默認值>
”的形式來設定默認值。
代碼清單 5 創建 ProductIns
表的 CREATE TABLE
語句(節選)
CREATE TABLE ProductIns
(product_id CHAR(4) NOT NULL,
(略)
sale_price INTEGER DEFAULT 0, -- 銷售單價的默認值設定為0;
(略)
PRIMARY KEY (product_id));
如果在創建表的同時設定了默認值,就可以在 INSERT
語句中自動為列賦值了。默認值的使用方法通常有顯式和隱式兩種。
-
通過顯式方法插入默認值
在
VALUES
子句中指定DEFAULT
關鍵字(代碼清單 6)。KEYWORD
DEFAULT
關鍵字
代碼清單 6 通過顯式方法設定默認值
INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0007', '擦菜板', '廚房用具', DEFAULT, 790, '2009-04-28');
這樣一來,RDBMS 就會在插入記錄時自動把默認值賦給對應的列。
我們可以使用
SELECT
語句來確認通過INSERT
語句插入的數據行。-- 確認插入的數據行; SELECT * FROM ProductIns WHERE product_id = '0007';
因為
sale_price
列(銷售單價)的默認值是0
,所以sale_price
列被賦予了值0
。執行結果
product_id | product_name | product_type | sale_price | purchase_price | regist_date -----------+--------------+--------------+------------+----------------+---------- 0007 | 擦菜板 | 廚房用具 | 0 | 790 | 2008-04-28
-
通過隱式方法插入默認值
插入默認值時也可以不使用 DEFAULT
關鍵字,只要在列清單和 VALUES
中省略設定了默認值的列就可以了。我們可以像代碼清單 7 那樣,從 INSERT
語句中刪除 sale_price
列(銷售單價)。
代碼清單 7 通過隱式方法設定默認值
這樣也可以給 sale_price
賦上默認值 0
。
那么在實際使用中哪種方法更好呢?筆者建議大家使用顯式的方法。因為這樣可以一目了然地知道 sale_price
列使用了默認值,SQL 語句的含義也更加容易理解。
說到省略列名,還有一點要說明一下。如果省略了沒有設定默認值的列,該列的值就會被設定為 NULL
。因此,如果省略的是設置了 NOT NULL
約束的列,INSERT
語句就會出錯(代碼清單 8)。請大家一定要注意。
代碼清單 8 未設定默認值的情況
-- 省略purchase_price列(無約束):會賦予“NULL”
INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, regist_date) VALUES ('0008', '圓珠筆', '辦公用品', 100, '2009-11-11');
-- 省略product_name列(設置了NOT NULL約束):錯誤!
INSERT INTO ProductIns (product_id, product_type, sale_price,purchase_price, regist_date) VALUES ('0009', '辦公用品', 1000, 500, '2009-12-12');
法則 2
省略
INSERT
語句中的列名,就會自動設定為該列的默認值(沒有默認值時會設定為NULL
)。
六、從其他表中復制數據
要插入數據,除了使用 VALUES
子句指定具體的數據之外,還可以從其他表中復制數據。下面我們就來學習如何從一張表中選取數據,復制到另外一張表中。
要學習該方法,我們首先得創建一張表(代碼清單 9)。
代碼清單 9 創建 ProductCopy
表的 CREATE TABLE
語句
-- 用來插入數據的商品復制表
CREATE TABLE ProductCopy
(product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER ,
purchase_price INTEGER ,
regist_date DATE ,
PRIMARY KEY (product_id));
ProductCopy
(商品復制)表的結構與之前使用的 Product
(商品)表完全一樣,只是更改了一下表名而已。
接下來,就讓我們趕快嘗試一下將 Product
表中的數據插入到 ProductCopy
表中吧。代碼清單 10 中的語句可以將查詢的結果直接插入到表中。
代碼清單 10 INSERT ... SELECT
語句
-- 將商品表中的數據復制到商品復制表中
INSERT INTO ProductCopy (product_id, product_name, product_type, sale_price, purchase_price, regist_date)
SELECT product_id, product_name, product_type, sale_price, purchase_price, regist_date
FROM Product;
執行該 INSERT … SELECT
語句時,如果原來 Product
表中有 8 行數據,那么 ProductCopy
表中也會插入完全相同的 8 行數據。當然,Product
表中的原有數據不會發生改變。因此,INSERT … SELECT
語句可以在需要進行數據備份時使用(圖 2)。
KEYWORD
INSERT … SELECT
語句

圖 2 INSERT … SELECT 語句
- 多種多樣的
SELECT
語句
該 INSERT
語句中的 SELECT
語句,也可以使用 WHERE
子句或者 GROUP BY
子句等。目前為止學到的各種 SELECT
語句也都可以使用 [6]。對在關聯表之間存取數據來說,這是非常方便的功能。
接下來我們嘗試一下使用包含 GROUP BY
子句的 SELECT
語句進行插入。代碼清單 11 中的語句創建了一個用來插入數據的表。
代碼清單 11 創建 ProductType
表的 CREATE TABLE
語句
-- 根據商品種類進行匯總的表;
CREATE TABLE ProductType
(product_type VARCHAR(32) NOT NULL,
sum_sale_price INTEGER ,
sum_purchase_price INTEGER ,
PRIMARY KEY (product_type));
該表是用來存儲根據商品種類(product_type
)計算出的銷售單價合計值以及進貨單價合計值的表。下面就讓我們使用代碼清單 12 中的 INSERT ... SELECT
語句,從 Product
表中選取出數據插入到這張表中吧。
代碼清單 12 插入其他表中數據合計值的 INSERT ... SELECT
語句
INSERT INTO ProductType (product_type, sum_sale_price, sum_purchase_price)
SELECT product_type, SUM(sale_price), SUM(purchase_price)
FROM Product
GROUP BY product_type;
通過 SELECT
語句對插入結果進行確認,我們發現 ProductType
表中插入了以下 3 行數據。
-- 確認插入的數據行
SELECT * FROM ProductType;
執行結果
product_type | sum_sale_price | sum_purchase_price
--------------+-----------------+--------------------
衣服 | 5000 | 3300
辦公用品 | 600 | 320
廚房用具 | 11180 | 8590
法則 3
INSERT
語句的SELECT
語句中,可以使用WHERE
子句或者GROUP BY
子句等任何 SQL 語法(但使用ORDER BY
子句並不會產生任何效果)。
請參閱
(完)