目錄
- 一、UPDATE 陳述句的基本語法
- 二、指定條件的 UPDATE 陳述句(搜索型 UPDATE)
- 三、使用 NULL 進行更新
- 四、多列更新
- 請參閱
學習重點
使用
UPDATE陳述句可以更改(更新)表中的資料,更新部分資料行時可以使用
WHERE來指定更新物件的條件,通過WHERE子句指定更新物件的UPDATE陳述句稱為搜索型UPDATE陳述句,
UPDATE陳述句可以將列的值更新為NULL,同時更新多列時,可以在
UPDATE陳述句的SET子句中,使用逗號分隔更新物件的多個列,
一、UPDATE 陳述句的基本語法
使用 INSERT 陳述句向表中插入資料之后,有時卻想要再更改資料,例如“將商品銷售單價登記錯了”等的時候,這時并不需要把資料洗掉之后再重新插入,使用 UPDATE 陳述句就可以改變表中的資料了,
KEYWORD
UPDATE陳述句
和 INSERT 陳述句、DELETE 陳述句一樣,UPDATE 陳述句也屬于 DML 陳述句,通過執行該陳述句,可以改變表中的資料,其基本語法如下所示,
語法 4 改變表中資料的 UPDATE 陳述句
UPDATE <表名>
SET <列名> = <運算式>;
將更新物件的列和更新后的值都記述在 SET 子句中,我們還是以 Product(商品)表為例,由于之前我們洗掉了“銷售單價大于等于 4000 日元”的 2 行資料,現在該表中只剩下了 6 行資料了(表 2),
KEYWORD
- SET 子句
表 2 Product 表
product_id(商品編號) |
product_name(商品名稱) |
product_type(商品種類) |
sale_price(銷售單價) |
purchase_price(進貨單價) |
regist_date(登記日期) |
|---|---|---|---|---|---|
| 0001 | T 恤衫 | 衣服 | 1000 | 500 | 2009-09-20 |
| 0002 | 打孔器 | 辦公用品 | 500 | 320 | 2009-09-11 |
| 0004 | 菜刀 | 廚房用具 | 3000 | 2800 | 2009-09-20 |
| 0006 | 叉子 | 廚房用具 | 500 | 2009-09-20 | |
| 0007 | 擦菜板 | 廚房用具 | 880 | 790 | 2008-04-28 |
| 0008 | 圓珠筆 | 辦公用品 | 100 | 2009-11-11 |
接下來,讓我們嘗試把 regist_date 列(登記日期)的所有資料統一更新為“2009-10-10”,具體的 SQL 陳述句請參見代碼清單 15,
代碼清單 15 將登記日期全部更新為“2009-10-10”
UPDATE Product
SET regist_date = '2009-10-10';
表中的資料有何變化呢?我們通過 SELECT 陳述句來確認一下吧,
-- 確認更新內容
SELECT * FROM Product ORDER BY product_id;
執行結果

此時,連登記日期原本為 NULL 的資料行(運動 T 恤)的值也更新為 2009-10-10 了,

二、指定條件的 UPDATE 陳述句(搜索型 UPDATE)
接下來,讓我們看一看指定更新物件的情況,更新資料時也可以像 DELETE 陳述句那樣使用 WHERE 子句,這種指定更新物件的 UPDATE 陳述句稱為搜索型 UPDATE 陳述句,該陳述句的語法如下所示(與 DELETE 陳述句十分相似),
KEYWORD
- 搜索型
UPDATE
語法 5 更新部分資料行的搜索型 UPDATE
UPDATE <表名>
SET <列名> = <運算式>
WHERE <條件>;
例如,將商品種類(product_type)為廚房用具的記錄的銷售單價(sale_price)更新為原來的 10 倍,請參見代碼清單 16,
代碼清單 16 將商品種類為廚房用具的記錄的銷售單價更新為原來的 10 倍
UPDATE Product
SET sale_price = sale_price * 10
WHERE product_type = '廚房用具';
我們可以使用如下 SELECT 陳述句來確認更新后的內容,
-- 確認更新內容
SELECT * FROM Product ORDER BY product_id;
執行結果

該陳述句通過 WHERE 子句中的“product_type = '廚房用具'”條件,將更新物件限定為 3 行,然后通過 SET 子句中的運算式 sale_price * 10,將原來的單價擴大了 10 倍,SET 子句中賦值運算式的右邊不僅可以是單純的值,還可以是包含列的運算式,
三、使用 NULL 進行更新
使用 UPDATE 也可以將列更新為 NULL(該更新俗稱為 NULL 清空),此時只需要將賦值運算式右邊的值直接寫為 NULL 即可,例如,我們可以將商品編號(product_id)為 0008 的資料(圓珠筆)的登記日期(regist_date)更新為 NULL(代碼清單 17),
KEYWORD
NULL清空
代碼清單 17 將商品編號為 0008 的資料(圓珠筆)的登記日期更新為 NULL
UPDATE Product
SET regist_date = NULL
WHERE product_id = '0008';
-- 確認更新內容
SELECT * FROM Product ORDER BY product_id;
執行結果

和 INSERT 陳述句一樣,UPDATE 陳述句也可以將 NULL 作為一個值來使用,
但是,只有未設定 NOT NULL 約束和主鍵約束的列才可以清空為 NULL,如果將設定了上述約束的列更新為 NULL,就會出錯,這點與 INSERT 陳述句相同,
法則 6
使用
UPDATE陳述句可以將值清空為NULL(但只限于未設定NOT NULL約束的列),
四、多列更新
UPDATE 陳述句的 SET 子句支持同時將多個列作為更新物件,例如我們剛剛將銷售單價(sale_price)更新為原來的 10 倍,如果想同時將進貨單價(purchase_price)更新為原來的一半,該怎么做呢?最容易想到的解決辦法可能就是像代碼清單 18 那樣,執行兩條 UPDATE 陳述句,
代碼清單 18 能夠正確執行的繁瑣的 UPDATE 陳述句
-- 一條UPDATE陳述句只更新一列
UPDATE Product
SET sale_price = sale_price * 10
WHERE product_type = '廚房用具';
UPDATE Product
SET purchase_price = purchase_price / 2
WHERE product_type = '廚房用具';
雖然這樣也能夠正確地更新資料,但執行兩次 UPDATE 陳述句不但有些浪費,而且增加了 SQL 陳述句的書寫量,其實,我們可以將其合并為一條 UPDATE 陳述句來處理,合并的方法有兩種,請參見代碼清單 19 和代碼清單 20,
方法①:代碼清單 19 將代碼清單 18 的處理合并為一條 UPDATE 陳述句
-- 使用逗號對列進行分隔排列
UPDATE Product
SET sale_price = sale_price * 10,
purchase_price = purchase_price / 2
WHERE product_type = '廚房用具';
方法②:代碼清單 20 將代碼清單 18 的處理合并為一條 UPDATE 陳述句
-- 將列用()括起來的清單形式
UPDATE Product
SET (sale_price, purchase_price) = (sale_price * 10, purchase_price / 2)
WHERE product_type = '廚房用具';
執行上述兩種 UPDATE 陳述句,都可以得到相同的結果:只有廚房用具的銷售單價(sale_price)和進貨單價(purchase_price)被更新了,
-- 確認更新內容
SELECT * FROM Product ORDER BY product_id;
執行結果

當然,SET 子句中的列不僅可以是兩列,還可以是三列或者更多,
需要注意的是第一種方法——使用逗號將列進行分隔排列(代碼清單 19),這一方法在所有的 DBMS 中都可以使用,但是第二種方法——將列清單化(代碼清單 20),這一方法在某些 DBMS 中是無法使用的 [1],因此,實際應用中通常都會使用第一種方法,
請參閱
- 資料的插入
- 資料的洗掉
- 資料的更新
- 事務
(完)
可以在 PostgreSQL 和 DB2 中使用, ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/374435.html
標籤:SQL Server
上一篇:SQL 資料的洗掉(DELETE 陳述句的使用方法)
下一篇:SQL 事務簡介
