目錄
- 一、什么是 INSERT
- 二、INSERT 陳述句的基本語法
- 三、列清單的省略
- 四、插入 NULL
- 五、插入默認值
- 六、從其他表中復制資料
- 請參閱
學習重點
使用
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子句并不會產生任何效果),
請參閱
- 資料的插入
- 資料的洗掉
- 資料的更新
- 事務
(完)
有關日期型的介紹,請參考 表的創建 節, ??
但是使用默認值時列數無需完全一致,相關內容將會在隨后的“插入默認值”中進行介紹, ??
插入多行的情況,請參考專欄“多行
INSERT”, ??在書寫沒有參照表的
SELECT陳述句時,寫在FROM子句中的表,它并沒有實際意義,也不保存任何資料,同時也不能作為INSERT和UPDATE的物件, ??不僅是
INSERT,DELETE和UPDATE等更新陳述句也一樣,SQL 陳述句執行失敗時都不會對表中資料造成影響, ??但即使指定了
ORDER BY子句也沒有任何意義,因為無法保證表內部記錄的排列順序, ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/374432.html
標籤:SQL Server
