SQL 數據的插入(INSERT 語句的使用方法)


學習重點

  • 使用 INSERT 語句可以向表中插入數據(行)。原則上,INSERT 語句每次執行一行數據的插入。

  • 將列名和值用逗號隔開,分別括在 () 內,這種形式稱為清單。

  • 對表中所有列進行 INSERT 操作時可以省略表名后的列清單。

  • 插入 NULL 時需要在 VALUES 子句的值清單中寫入 NULL

  • 可以為表中的列設定默認值(初始值),默認值可以通過在 CREATE TABLE 語句中為列設置 DEFAULT 約束來設定。

  • 插入默認值可以通過兩種方式實現,即在 INSERT 語句的 VALUES 子句中指定 DEFAULT 關鍵字(顯式方法),或省略列清單(隱式方法)。

  • 使用 INSERT…SELECT 可以從其他表中復制數據。

一、什么是 INSERT

表的創建 中給大家介紹了用來創建表的 CREATE TABLE 語句。通過 CREATE TABLE 語句創建出來的表,可以被認為是一個空空如也的箱子。只有把數據裝入到這個箱子后,它才能稱為數據庫。用來裝入數據的 SQL 就是 INSERT(插入)(圖 1)。

KEYWORD

  • INSERT 語句
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;

DUALOracle 特有(安裝時的必選項)的一種臨時表 [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 語句
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 子句並不會產生任何效果)。

請參閱

(完)


  1. 有關日期型的介紹,請參考 表的創建 節。 ↩︎

  2. 但是使用默認值時列數無需完全一致。相關內容將會在隨后的“插入默認值”中進行介紹。 ↩︎

  3. 插入多行的情況,請參考專欄“多行 INSERT”。 ↩︎

  4. 在書寫沒有參照表的 SELECT 語句時,寫在 FROM 子句中的表。它並沒有實際意義,也不保存任何數據,同時也不能作為 INSERTUPDATE 的對象。 ↩︎

  5. 不僅是 INSERTDELETEUPDATE 等更新語句也一樣,SQL 語句執行失敗時都不會對表中數據造成影響。 ↩︎

  6. 但即使指定了 ORDER BY 子句也沒有任何意義,因為無法保證表內部記錄的排列順序。 ↩︎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM