學習重點
使用
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 中使用。 ↩︎