目录一、UPDATE 语句的基本语法二、指定条件的 UPDATE 语句(搜索型 UPDATE)三、使用 NULL 进行更新四、多列更新请参阅 学习重点 使用 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;
执行结果
此时,连登记日期原本为 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 中使用。 ↩︎
--结束END--
本文标题: SQL 数据的更新(UPDATE 语句的使用方法)
本文链接: https://www.lsjlt.com/news/8923.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-10
2024-05-10
2024-05-10
2024-05-10
2024-05-10
2024-05-10
2024-05-10
2024-05-10
2024-05-09
2024-05-09
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0