SQL 数据的更新(UPDATE 语句的使用方法)

天天见闻 天天见闻 2022-03-15 科技 阅读: 661
摘要: 语句向表中插入数据之后,有时却想要再更改数据,例如“将商品销售单价登记错了”等的时候。语句就可以改变表中的数据了。通过执行该语句,可以改变表中的数据。语句来确认一下吧。语句来确认更新后的内容。子句中赋值表达式的右边不仅可以是单纯的值,还可以是包含列的表达式。子句支持同时将多个列作为更新对象。语句来处理。。因此,实际应用中通常都会使用第一种方法。

目录

学习重点

一、UPDATE 语句的基本语法

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

KEYWORD

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

语法 4改变表中数据的 UPDATE 语句

UPDATE <表名>
   SET <列名> = <表达式>;

将更新对象的列和更新后的值都记述在 SET 子句中。我们还是以 Product(商品)表为例,由于之前我们删除了“销售单价大于等于 4000 日元”的 2 行数据,现在该表中只剩下了 6 行数据了(表 2)。

KEYWORD

表 2Product 表

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

语法 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语句,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 语句不但有些浪费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 中是无法使用的 。因此,实际应用中通常都会使用第一种方法。

请参阅

(完)

可以在 PostgreSQL 和 DB2 中使用。

其他相关
常见的MySQL语句

常见的MySQL语句

作者: 天天见闻 时间:2023-03-15 阅读: 141
...
windows update和microsoft update有什么区别,用microsoft update后是不是就可以不用windows update了?

windows update和microsoft update有什么区别,用microsoft update后是不是就可以不用windows update了?

作者: 天天见闻 时间:2022-07-15 阅读: 399
如果你采用microsoft update,可以同时搜索检测WINDOWS和OFFICE的所有关键更新并下载安装。windows update是microsoft update的一部分,某些盗版的Windows无法通过microsoft update升级....
Sql Update语句使用表别名的方法

Sql Update语句使用表别名的方法

作者: 天天见闻 时间:2022-05-04 阅读: 236
在编写Sql脚本时通过表别名可以大大缩减Sql代码,同时表别名也是解决同表多次引用的手段之一。在中使用表别名大家应该都很熟悉了:中使用表别名可能就没那么多人知道了。这是因为Sql引擎无法知道你在where子句中的到底指的是要的表还是from后面的表。#p#如果不对后面的使用别名的话,我们只能通过以下方法来实现。使用别名可以得到更简洁的写法:查询表的字段名的sql语句写法...
独特的deadlock(仅update语句也能造成死锁)

独特的deadlock(仅update语句也能造成死锁)

作者: 天天见闻 时间:2022-04-23 阅读: 296
(d)去掉,然后运行同样的语句循环,死锁就不会发生。为什么两条一模一样的语句,会相互死锁呢?为什么索引上去掉一个选项,或者改掉一个数据类型,就不会死锁了呢?index上的字段去掉,能够解决死锁问题呢(测试2)?表格上的索引越多、数据类型越复杂,执行计划也会越复杂,从而导致遇到阻塞或者死锁的几率增加。对于这个死锁案例本身,将(max)包含在一个索引里,是不太妥当的。...

MySQL中一条update语句是怎么执行的

作者: 天天见闻 时间:2022-03-16 阅读: 298
SQL语句的执行过程如果通过key能够查找到这条SQL语句,直接返回SQL的执行结果。接下来,分析器会经过语法分析和词法分析,知道了这是一条更新语句后,优化器决定要使用哪一个索引,然后执行器负责具体的执行,先找到这一行,然后做更新。InnoDB引擎部分在执行这个简单的update语句的时候的内部流程哪些是update语句执行之后做的,哪些是commit语句执行之后做的?...

mysql update语句的执行过程详解

作者: 天天见闻 时间:2022-03-12 阅读: 501
where子句的工作原理与使用SELECT语句的工作原理完全相同。现在,我们有了带有SET,FROM和Where子句关键字的更新SQL语句。UPDATE语句中修改的行数。下面的示例更新Sales.让我们使用CTE运行相同SQL更新语句以下示例使用链接的服务器更新远程服务器上的数据。Update语句更新行的一些简单方法,以及在使用条件,子句和其他上下文的情况下进行的各种排列。...
我来说两句

年度爆文