- 一、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 中使用。 ↩︎