SQL 數據的更新(UPDATE 語句的使用方法)


學習重點

  • 使用 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;

執行結果

將登記日期全部更新為“2009-10-10”

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

將登記日期全部更新為“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]。因此,實際應用中通常都會使用第一種方法。

請參閱

(完)


  1. 可以在 PostgreSQL 和 DB2 中使用。 ↩︎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM