2023年8月3日发(作者:)

SQL数据的更新(UPDATE语句的使⽤⽅法)⽬录学习重点使⽤

UPDATE 语句可以更改(更新)表中的数据。更新部分数据⾏时可以使⽤

WHERE 来指定更新对象的条件。通过

WHERE ⼦句指定更新对象的

UPDATE 语句称为搜索型

UPDATE 语句。UPDATE 语句可以将列的值更新为

NULL。同时更新多列时,可以在

UPDATE 语句的

SET ⼦句中,使⽤逗号分隔更新对象的多个列。⼀、UPDATE 语句的基本语法使⽤

INSERT 语句向表中插⼊数据之后,有时却想要再更改数据,例如“将商品销售单价登记错了”等的时候。这时并不需要把数据删除之后再重新插⼊,使⽤

UPDATE 语句就可以改变表中的数据了。KEYWORDUPDATE 语句和

INSERT 语句、DELETE 语句⼀样,UPDATE 语句也属于 DML 语句。通过执⾏该语句,可以改变表中的数据。其基本语法如下所⽰。语法 4 改变表中数据的

UPDATE 语句UPDATE <表名> SET <列名> = <表达式>;将更新对象的列和更新后的值都记述在

SET ⼦句中。我们还是以

Product(商品)表为例,由于之前我们删除了“销售单价⼤于等于 4000 ⽇元”的 2 ⾏数据,现在该表中只剩下了 6⾏数据了(表 2)。KEYWORDSET ⼦句表 2 Product 表product_idproduct_nameproduct_typesale_pricepurchase_priceregist_date(商品编号)(商品名称)(商品种类)(销售单价)(进货单价)(登记⽇期)T 恤衫打孔器菜⼑叉⼦擦菜板圆珠笔⾐服办公⽤品厨房⽤具厨房⽤具厨房⽤具办公⽤品1-09-202009-09-112009-09-202009-09-202008-04-282009-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 更新部分数据⾏的搜索型

UPDATEUPDATE <表名> 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)。KEYWORDNULL 清空代码清单 17 将商品编号为 0008 的数据(圆珠笔)的登记⽇期更新为

NULLUPDATE 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 中使⽤。

2023年8月3日发(作者:)

SQL数据的更新(UPDATE语句的使⽤⽅法)⽬录学习重点使⽤

UPDATE 语句可以更改(更新)表中的数据。更新部分数据⾏时可以使⽤

WHERE 来指定更新对象的条件。通过

WHERE ⼦句指定更新对象的

UPDATE 语句称为搜索型

UPDATE 语句。UPDATE 语句可以将列的值更新为

NULL。同时更新多列时,可以在

UPDATE 语句的

SET ⼦句中,使⽤逗号分隔更新对象的多个列。⼀、UPDATE 语句的基本语法使⽤

INSERT 语句向表中插⼊数据之后,有时却想要再更改数据,例如“将商品销售单价登记错了”等的时候。这时并不需要把数据删除之后再重新插⼊,使⽤

UPDATE 语句就可以改变表中的数据了。KEYWORDUPDATE 语句和

INSERT 语句、DELETE 语句⼀样,UPDATE 语句也属于 DML 语句。通过执⾏该语句,可以改变表中的数据。其基本语法如下所⽰。语法 4 改变表中数据的

UPDATE 语句UPDATE <表名> SET <列名> = <表达式>;将更新对象的列和更新后的值都记述在

SET ⼦句中。我们还是以

Product(商品)表为例,由于之前我们删除了“销售单价⼤于等于 4000 ⽇元”的 2 ⾏数据,现在该表中只剩下了 6⾏数据了(表 2)。KEYWORDSET ⼦句表 2 Product 表product_idproduct_nameproduct_typesale_pricepurchase_priceregist_date(商品编号)(商品名称)(商品种类)(销售单价)(进货单价)(登记⽇期)T 恤衫打孔器菜⼑叉⼦擦菜板圆珠笔⾐服办公⽤品厨房⽤具厨房⽤具厨房⽤具办公⽤品1-09-202009-09-112009-09-202009-09-202008-04-282009-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 更新部分数据⾏的搜索型

UPDATEUPDATE <表名> 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)。KEYWORDNULL 清空代码清单 17 将商品编号为 0008 的数据(圆珠笔)的登记⽇期更新为

NULLUPDATE 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 中使⽤。