學習重點
使用
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子句並不會產生任何效果)。
請參閱
(完)
