本文介紹如何使用 SQL INSERT 語句將數據插入到表中,如何用 INSERT SELECT 從其他表中導入行,如何用 SELECT INTO 將行導出到一個新表。 一、數據插入 毫無疑問,SELECT 是最常用的 SQL 語句了。但是,還有其他 3 個常用的 SQL 語句需要學習。第一個就是 ...
目錄
本文介紹如何使用 SQL INSERT
語句將數據插入到表中,如何用 INSERT SELECT
從其他表中導入行,如何用 SELECT INTO
將行導出到一個新表。
一、數據插入
毫無疑問,SELECT
是最常用的 SQL 語句了。但是,還有其他 3 個常用的 SQL 語句需要學習。第一個就是 INSERT(如何使用 SQL UPDATE 和 DELETE 語句更新或刪除表數據 介紹另外兩個)。
顧名思義,INSERT
用來將行插入(或添加)到資料庫表。插入有幾種方式:
- 插入完整的行;
- 插入行的一部分;
- 插入某些查詢的結果。
下麵逐一介紹這些內容。
提示:插入及系統安全
使用
INSERT
語句可能需要客戶端/伺服器 DBMS 中的特定安全許可權。在你試圖使用INSERT
前,應該保證自己有足夠的安全許可權。
1.1 插入完整的行
把數據插入表中的最簡單方法是使用基本的 INSERT
語法,它要求指定表名和插入到新行中的值。下麵舉一個例子:
INSERT INTO Customers
VALUES(1000000006,
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA',
NULL,
NULL);
這個例子將一個新顧客插入到 Customers
表中。
存儲到表中每一列的數據在 VALUES
子句中給出,必須給每一列提供一個值。
如果某列沒有值,如上面的 cust_contact
和 cust_email
列,則應該使用 NULL
值(假定表允許對該列指定空值)。各列必須以它們在表定義中出現的次序填充。
提示:
INTO
關鍵字在某些 SQL 實現中,跟在
INSERT
之後的INTO
關鍵字是可選的。但是,即使不一定需要,最好還是提供這個關鍵字,這樣做將保證 SQL 代碼在 DBMS 之間可移植。
雖然這種語法很簡單,但並不安全,應該儘量避免使用。
上面的 SQL 語句高度依賴於表中列的定義次序,還依賴於其容易獲得的次序信息。即使可以得到這種次序信息,也不能保證各列在下一次表結構變動後保持完全相同的次序。
因此,編寫依賴於特定列次序的 SQL 語句是很不安全的,這樣做遲早會出問題。
編寫 INSERT
語句的更安全(不過更煩瑣)的方法如下:
INSERT INTO Customers(cust_id,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country,
cust_contact,
cust_email)
VALUES(1000000006,
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA',
NULL,
NULL);
這個例子與前一個 INSERT
語句的工作完全相同,但在表名後的括弧里明確給出了列名。
在插入行時,DBMS 將用 VALUES
列表中的相應值填入列表中的對應項。VALUES
中的第一個值對應於第一個指定列名,第二個值對應於第二個列名,如此等等。
因為提供了列名,VALUES
必須以其指定的次序匹配指定的列名,不一定按各列出現在表中的實際次序。其優點是,即使表的結構改變,這條 INSERT
語句仍然能正確工作。
說明:不能插入同一條記錄兩次
如果你嘗試了這個例子的兩種方法,會發現第二次生成了一條出錯消息,說 ID 為
1000000006
的顧客已經存在。在 學習 SQL 之前需要瞭解的基礎知識 我們說過,主鍵的值必須有唯一性,而
cust_id
是主鍵,DBMS 不允許插入相同cust_id
值的新行。下一個例子也是同樣的道理。要想再嘗試另一種插入方法,需要首先刪除掉已經插入的記錄(請參閱 如何使用 SQL UPDATE 和 DELETE 語句更新或刪除表數據)。
要麼就別嘗試新方法了,反正記錄已經插入好,你可以繼續往下學習。
下麵的 INSERT
語句填充所有列(與前面的一樣),但以一種不同的次序填充。因為給出了列名,所以插入結果仍然正確:
INSERT INTO Customers(cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip)
VALUES(1000000006,
NULL,
NULL,
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111');
提示:總是使用列的列表
不要使用沒有明確給出列的
INSERT
語句。給出列能使 SQL 代碼繼續發揮作用,即使表結構發生了變化。
註意:小心使用
VALUES
不管使用哪種
INSERT
語法,VALUES
的數目都必須正確。如果不提供列名,則必須給每個表列提供一個值;如果提供列名,則必須給列出的每個列一個值。
否則,就會產生一條錯誤消息,相應的行不能成功插入。
1.2 插入部分行
正如所述,使用 INSERT
的推薦方法是明確給出表的列名。使用這種語法,還可以省略列,這表示可以只給某些列提供值,給其他列不提供值。
請看下麵的例子:
INSERT INTO Customers(cust_id,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
VALUES(1000000006,
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA');
在本文前面的例子中,沒有給 cust_contact
和 cust_email
這兩列提供值。這表示沒必要在 INSERT
語句中包含它們。因此,這裡的 INSERT
語句省略了這兩列及其對應的值。
註意:省略列
如果表的定義允許,則可以在
INSERT
操作中省略某些列。省略的列必須滿足以下某個條件。
- 該列定義為允許
NULL
值(無值或空值)。- 在表定義中給出預設值。這表示如果不給出值,將使用預設值。
註意:省略所需的值
如果表中不允許有
NULL
值或者預設值,這時卻省略了表中的值,DBMS 就會產生錯誤消息,相應的行不能成功插入。
1.3 插入檢索出的數據
INSERT
一般用來給表插入具有指定列值的行。
INSERT
還存在另一種形式,可以利用它將 SELECT
語句的結果插入表中,這就是所謂的 INSERT SELECT
。
顧名思義,它是由一條 INSERT
語句和一條 SELECT
語句組成的。
假如想把另一表中的顧客列合併到 Customers
表中,不需要每次讀取一行再將它用 INSERT
插入,可以如下進行:
INSERT INTO Customers(cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
SELECT cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country
FROM CustNew;
說明:新例子的說明
這個例子從一個名為
CustNew
的表中讀出數據並插入到Customers
表。為了試驗這個例子,應該首先創建和填充CustNew
表。
CustNew
表的結構與 學習 SQL 所用到的樣例表腳本 中描述的Customers
表相同。在填充
CustNew
時,不應該使用已經在Customers
中用過的cust_id
值(如果主鍵值重覆,後續的INSERT
操作將會失敗)。
這個例子使用 INSERT SELECT
從 CustNew
中將所有數據導入 Customers
。
SELECT
語句從 CustNew
檢索出要插入的值,而不是列出它們。
SELECT
中列出的每一列對應於 Customers
表名後所跟的每一列。這條語句將插入多少行呢?這依賴於 CustNew
表有多少行。
如果這個表為空,則沒有行被插入(也不產生錯誤,因為操作仍然是合法的)。如果這個表確實有數據,則所有數據將被插入到 Customers
。
提示:
INSERT SELECT
中的列名為簡單起見,這個例子在
INSERT
和SELECT
語句中使用了相同的列名。但是,不一定要求列名匹配。事實上,DBMS 一點兒也不關心
SELECT
返回的列名。它使用的是列的位置,因此
SELECT
中的第一列(不管其列名)將用來填充表列中指定的第一列,第二列將用來填充表列中指定的第二列,如此等等。
INSERT SELECT
中 SELECT
語句可以包含 WHERE
子句,以過濾插入的數據。
提示:插入多行
INSERT
通常只插入一行。要插入多行,必須執行多個INSERT
語句。
INSERT SELECT
是個例外,它可以用一條INSERT
插入多行,不管SELECT
語句返回多少行,都將被INSERT
插入。
二、從一個表複製到另一個表
有一種數據插入不使用 INSERT
語句。要將一個表的內容複製到一個全新的表(運行中創建的表),可以使用 CREATE SELECT
語句(或者在 SQL Server 里也可用 SELECT INTO
語句)。
說明:DB2 不支持
DB2 不支持這裡描述的
CREATE SELECT
。
與 INSERT SELECT
將數據添加到一個已經存在的表不同,CREATE SELECT
將數據複製到一個新表(有的 DBMS 可以覆蓋已經存在的表,這依賴於所使用的具體 DBMS)。
下麵的例子說明如何使用 CREATE SELECT
:
CREATE TABLE CustCopy AS SELECT * FROM Customers;
若是使用 SQL Server,可以這麼寫:
SELECT * INTO CustCopy FROM Customers;
這條 SELECT
語句創建一個名為 CustCopy
的新表,並把 Customers
表的整個內容複製到新表中。
因為這裡使用的是 SELECT *
,所以將在 CustCopy
表中創建(並填充)與 Customers
表的每一列相同的列。要想只複製部分的列,可以明確給出列名,而不是使用 *
通配符。
在使用 SELECT INTO
時,需要知道一些事情:
- 任何
SELECT
選項和子句都可以使用,包括WHERE
和GROUP BY
; - 可利用聯結從多個表插入數據;
- 不管從多少個表中檢索數據,數據都只能插入到一個表中。
提示:進行表的複製
SELECT INTO
是試驗新 SQL 語句前進行表複製的很好工具。先進行複製,可在複製的數據上測試 SQL 代碼,而不會影響實際的數據。
說明:更多例子
如果想看
INSERT
用法的更多例子,請參閱 學習 SQL 所用到的樣例表腳本 中給出的樣例表填充腳本。
三、小結
本文介紹瞭如何將行插入到資料庫表中。我們學習了使用 INSERT
的幾種方法,為什麼要明確使用列名,如何用 INSERT SELECT
從其他表中導入行,如何用 SELECT INTO
將行導出到一個新表。
如何使用 SQL UPDATE 和 DELETE 語句更新或刪除表數據 講述瞭如何使用 UPDATE
和 DELETE
進一步操作表數據。
原文鏈接:https://www.developerastrid.com/sql/sql-insert/
(完)