目錄
- 一、插入完整的行
- 二、插入部分行
- 三、插入檢索出的資料
- 請參閱
目錄匯總:SQL 入門教程:面向萌新小白的零基礎入門教程
毫無疑問,SELECT 是最常用的 SQL 陳述句了,這就是前 14 部分都在講它的原因,但是,還有其他 3 個常用的 SQL 陳述句需要學習,第一個就是 INSERT(第二個是 UPDATE 第三個是 DELETE),
顧名思義,INSERT 用來將行插入(或添加)到資料庫表,插入有幾種方式:
- 插入完整的行;
- 插入行的一部分;
- 插入某些查詢的結果,
下面逐一介紹這些內容,
提示:插入及系統安全
使用
INSERT陳述句可能需要客戶端/服務器 DBMS 中的特定安全權限,在你試圖使用INSERT前,應該保證自己有足夠的安全權限,
一、插入完整的行
把資料插入表中的最簡單方法是使用基本的 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 的顧客已經存在,在 資料庫基礎 我們說過,主鍵的值必須有唯一性,而
cust_id是主鍵,DBMS 不允許插入相同cust_id值的新行,下一個例子也是同樣的道理,要想再嘗試另一種插入方法,需要首先洗掉掉已經插入的記錄(請參閱 洗掉資料),要么就別嘗試新方法了,反正記錄已經插入好,你可以繼續往下學習,
下面的 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的數目都必須正確,如果不提供列名,則必須給每個表列提供一個值;如果提供列名,則必須給列出的每個列一個值,否則,就會產生一條錯誤訊息,相應的行不能成功插入,
二、插入部分行
正如所述,使用 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 就會產生錯誤訊息,相應的行不能成功插入,
三、插入檢索出的資料
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表的結構與 樣例表腳本 中描述的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)練習題
(完)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/296437.html
標籤:SQL Server
