--[範例9-1] 未指定column_list的INSERT --依據資料表的資料行順序,新增一筆產品資料到『產品資料』資料表內。 INSERT 產品資料 VALUES ( 13, 7, 'S0005', '陳年紹興', 300, 250, 300,150 ) --[範例9-2] 指定column_list的INSERT --新增一筆產品資料到『產品資料』資料表內,並指定出資料行名稱。 INSERT 產品資料 ( 產品編號, 類別編號, 供應商編號, 產品名稱, 建議單價, 平均成本, 庫存量, 安全存量 ) VALUES ( 14, 8, 'S0005', '藍山經典咖啡', 35, 25, 500,200 ) --結果將等同於下列的寫法。也就是說,column_list內的資料行順序可以和真實資料表內的順序不同;只要VALUES內的值能夠配合對應到column_list內的資料行即可。倘若VALUES內的值對應至不對的資料行,或許資料會被新增進去,但是對於資料的意義而言,已經發生了錯誤。 INSERT 產品資料 ( 產品編號, 產品名稱, 類別編號, 供應商編號, 建議單價, 平均成本, 庫存量, 安全存量 ) VALUES ( 14, '藍山經典咖啡', 8, 'S0005', 35, 25, 500,200 ) --[範例9-3] 給定預設值DEFAULT的INSERT --新增一筆產品資料到『產品資料』資料表內,並指定出資料行名稱,以及使用資料表內所設定的預設值。 --[提示] 先開啟SQL Server Management Studio,在『產品資料』資料表上方按下滑鼠右鍵,並點選【設計(G)】。開啟『產品資料』資料表的設計模式時,分別點選及觀察『庫存量』與『安全存量』資料行,從下方【資料行屬性】中的【預設值或繫結】欄位,可找到這兩個資料行的預設值分別為0與100。 INSERT 產品資料 ( 產品編號, 類別編號, 供應商編號, 產品名稱, 建議單價, 平均成本, 庫存量, 安全存量 ) VALUES ( 15, 7, 'S0005', '紅葡萄酒', 850, 650, DEFAULT, DEFAULT ) --[範例9-4] 同時新增多筆資料的INSERT --利用一個INSERT敘述來完成新增三筆產品資料。 INSERT 產品資料 ( 產品編號, 類別編號, 供應商編號, 產品名稱, 建議單價, 平均成本, 庫存量, 安全存量 ) VALUES ( 16, 8, 'S0004', '雙倍濃縮咖啡', 50, 35, 100, DEFAULT ) , ( 17, 7, 'S0001', '黑麥啤酒', 85, 65, DEFAULT, DEFAULT ) , ( 18, 7, 'S0005', '生啤酒', 45, 35, 500, 150 ) --[範例9-5] 結合函數的INSERT --假設公司所承接的訂單,『預計到貨日期』是『訂貨日期』後的七日,請新增一筆訂單資料。 INSERT 訂單 (訂單編號, 員工編號, 客戶編號, 訂貨日期, 預計到貨日期, 付款方式, 交貨方式) VALUES ( '98090201', 7, 'C0012', '2009/09/28', DATEADD( DAY, 7, '2009/09/28' ), '支票', '快遞') --[範例9-6] --新增一筆訂單以及該筆訂單會有三樣產品。 --[提示] 先新增『訂單』資料表,再新增『訂單明細』資料表。 INSERT 訂單 (訂單編號, 員工編號, 客戶編號, 訂貨日期, 預計到貨日期, 付款方式, 交貨方式) VALUES ( '98120101', 7, 'C0005', '2009/12/01', '2009/12/10', '支票', '快遞') INSERT 訂單明細 ( 訂單編號, 產品編號, 實際單價, 數量 ) VALUES ( '98120101', 13, 270, 100 ) , ( '98120101', 14, 30, 150 ) , ( '98120101', 16, 50, 60 ) --[範例9-7] 透過SELECT查詢的INSERT (單一資料表) --比較以下兩個需求,一個使用SELECT...INTO...,另一個使用INSERT...SELECT...,以及兩個不同的概念。 --(1) 從『員工』資料表中挑選出女性員工,並輸出至另一個新的資料表『T女員工』。此範例與[範例6-15]相同。 --(2) 從『員工』資料表中挑選出男性員工,並新增至另一個已存在的資料表『T男員工』。 --[輸出] ( 員工編號, 姓名, 職稱 ) --(1) 將資料『推出去』,以下的語法中,若暫不看『INTO T女員工』,就是一般的SELECT查詢,再將此查詢結果,透過INTO到另一個新資料表。 SELECT 員工編號, 姓名, 職稱, 性別 INTO T女員工 FROM 員工 WHERE 性別 = '女' --(2) 將資料『拉進來』,以下的語法中,若暫不看『SELECT...FROM...WHERE...』,就是一般的INSERT新增。只是將原本使用『VALUES』來當資料輸入的管道,改由『SELECT...FROM...WHERE...』從其他資料表挑選出結果,再新增到『T男員工』資料表。 INSERT T男員工 ( 員工編號, 姓名, 職稱, 性別 ) SELECT 員工編號, 姓名, 職稱, 性別 FROM 員工 WHERE 性別 = '男' --[範例9-8] 透過SELECT查詢的INSERT (多個資料表) --比較以下兩個需求,一個使用SELECT...INTO...,另一個使用INSERT...SELECT...,以及兩個不同的概念。 --(1) 從『員工』、『訂單』及『客戶』資料表中挑選出2005年訂單資料,並輸出至另一個新的資料表『T2005年員工訂單情形』。 --(2) 從『員工』、『訂單』及『客戶』資料表中挑選出2006年訂單資料,並新增至另一個已存在的資料表『T2006年員工訂單情形』。 --[輸出] ( 員工編號, 姓名, 訂單編號, 訂貨日期, 客戶編號, 公司名稱 ) --(1) 將資料『推出去』,以下的語法中,若暫不看『INTO T2005年員工訂單情形』,就是一般的SELECT的JOIN查詢,再將此查詢結果,透過INTO到另一個新資料表。 SELECT 員工.員工編號, 姓名, 訂單編號, 訂貨日期, 客戶.客戶編號, 公司名稱 INTO T2005年員工訂單情形 FROM 員工, 訂單, 客戶 WHERE 員工.員工編號 = 訂單.員工編號 AND 訂單.客戶編號 = 客戶.客戶編號 AND year( 訂貨日期 ) = 2005 --(2) 將資料『拉進來』,以下的語法中,若暫不看『SELECT...FROM...WHERE...』的多資料表JOIN,就是一般的INSERT新增。只是將原本使用『VALUES』來當資料輸入管道,改由『SELECT...FROM...WHERE...』從其他多個資料表JOIN結果,挑選出結果再新增到『T2006年員工訂單情形』資料表。 INSERT T2006年員工訂單情形 SELECT 員工.員工編號, 姓名, 訂單編號, 訂貨日期, 客戶.客戶編號, 公司名稱 FROM 員工, 訂單, 客戶 WHERE 員工.員工編號 = 訂單.員工編號 AND 訂單.客戶編號 = 客戶.客戶編號 AND year( 訂貨日期 ) = 2006 --[範例9-9] 透過執行『預存程序』的INSERT --題目如同[範例9-7],從員工資料表挑選出男性員工,新增到『T男員工』資料表,並限制使用執行『預存程序』的方式。 --[提示] 由於尚未介紹什麼是『預存程序』,以及如何撰寫預存程序,所以本範例預先準備好一個名為『P挑選男員工資料』的預存程序來說明用法。 INSERT T男員工 ( 員工編號, 姓名, 職稱, 性別 ) exec P挑選男員工資料 --[範例9-10] 透過執行『SQL字串』的INSERT --題目如同[範例9-7],從員工資料表挑選出男性員工,新增到『T男員工』資料表,並限制使用execute SQL statement的方式。 INSERT T男員工 ( 員工編號, 姓名, 職稱, 性別 ) exec ( 'SELECT 員工編號, 姓名, 職稱, 性別 FROM 員工 WHERE 性別 = ''男''' ) --[範例9-11] 條件式更新 --凡是在『產品資料』資料表內的庫存量為0的產品,統統將庫存量更改為200。 --[提示] 在更新資料時,一定要特別注意到目的資料的條件為何,倘若沒有加上WHERE的條件篩選,將會造成整個資料表內容統統被更新。 UPDATE 產品資料 SET 庫存量 = 200 WHERE 庫存量 = 0 --[範例9-12] 同時更新多個資料行 --將訂單編號為98120101的『出貨日期』改為2009/12/09 16:00、『實際到貨日期』改為2009/12/10 10:30。 --[提示] 只要在SET後面加入所要更改的資料行與新值,每個資料行之間用逗號『,』隔開即可。 UPDATE 訂單 SET 出貨日期 = '2009/12/09 16:00', 實際到貨日期 = '2009/12/10 10:30' WHERE 訂單編號 = '98120101' --[範例9-13] 更新資料為空值( null value ) --將訂單編號為98120101的『實際到貨日期』清空。 --[提示] 所謂清空就是將其值更新為『空值』( null value )。 UPDATE 訂單 SET 實際到貨日期 = null WHERE 訂單編號 = '98120101' --[範例9-14] 利用運算式更新資料 --挑選2009/01/01之前的訂單資料,若是『實際到貨日期』為空值的資料列,全部依據該筆訂單的『出貨日期』再加三天填入『實際到貨日期』。 --[提示] 可以使用DATEADD()函數 UPDATE 訂單 SET 實際到貨日期 = dateadd( day, 3, 出貨日期 ) WHERE 訂貨日期 < '2009/01/01' AND 實際到貨日期 is null --[範例9-15] --將客戶編號C0016的所有『訂單明細』中的『實際單價』全數打九折。 UPDATE 訂單明細 SET 實際單價 = 實際單價 * 0.9 FROM 訂單 WHERE 訂單.訂單編號 = 訂單明細.訂單編號 AND 客戶編號 = 'C0016' --[範例9-16] --將客戶之『公司名稱』為『日新日公司』的『訂單明細』中的『實際單價』全數打九折。 UPDATE 訂單明細 SET 實際單價 = 實際單價 * 0.9 FROM 客戶, 訂單 WHERE 客戶.客戶編號 = 訂單.客戶編號 AND 訂單.訂單編號 = 訂單明細.訂單編號 AND 公司名稱 = '日新日公司' --[範例9-17] --將『T男員工』資料表全部清空。 DELETE T男員工 --或 TRUNCATE table T男員工 --[範例9-18] --將訂單編號98120101的所有『訂單』及『訂單明細』資料表全數刪除。 --[提示] 刪除的順序應該先刪『訂單明細』,再刪『訂單』資料表 DELETE 訂單明細 WHERE 訂單編號 = '98120101' DELETE 訂單 WHERE 訂單編號 = '98120101' --[範例9-19] --將客戶編號C0016的所有『訂單』及『訂單明細』資料表全數刪除。 --[提示] 刪除的順序應該先刪『訂單明細』,再刪『訂單』資料表 DELETE 訂單明細 FROM 訂單 WHERE 訂單.訂單編號 = 訂單明細.訂單編號 AND 客戶編號 = 'C0016' --[範例9-20] --將客戶的公司名稱『日新日公司』的所有『訂單』及『訂單明細』資料表全數刪除。 --[提示] 刪除的順序應該先刪『訂單明細』,再刪『訂單』資料表 DELETE 訂單明細 FROM 客戶, 訂單 WHERE 客戶.客戶編號 = 訂單.客戶編號 AND 訂單.訂單編號 = 訂單明細.訂單編號 AND 公司名稱 = '日新日公司'