收藏
0有用+1
0

update

数据库SQL语法用语
展开4个同名词条
本词条由中国科学院大学人工智能学院 参与编辑并审核,经科普中国·科学百科认证 。
Update是SQL语句中DML类(DataManipulation Language,数据操纵语言)中的一个指令,用于更新(修改)表中原有数据 [2]
中文名
更新
外文名
Update
性    质
数据库SQL语法用语
用    途
更新表中原有数据
单独使用
使用where匹配字段

语句概述

播报
编辑
Update是SQL语句中DML类(Data Manipulation Language,数据操纵语言)中的一个指令,用于更新(修改)表中原有数据 [2]。基本书写规则
(1)SQL 语句使用分号(;)结尾;
(2)Update作为关键字不区分大小写。

语法结构

播报
编辑
UPDATE 表名称
SET 列名称 = 新值, 列名称2 = 新值2,...
WHERE 条件;
其中,表名称是需要更新数据的表的名称;列名称= 新值部分指定了要更新的列及其新值;WHERE条件用于指定哪些记录需要被更新。如果省略WHERE子句,所有记录将被更新。
SQL语句
SQL的UPDATE语句通过指定表、列及其新值以及适用的条件来实现对数据库表中数据的更新操作。使用WHERE子句
更新部分数据行时可以使用WHERE来指定更新对象的条件。通过WHERE
子句指定更新对象的UPDATE语句称为搜索型UPDATE语句 [1]

更新操作

播报
编辑
(1)更新表中的特定行 [3]
UPDATE语句用于修改表中的数据,而WHERE子句则用于指定哪些行需要被更新。
语法说明:
UPDATE< 表名 >
SET< 列名 = 表达式 >[,…n]
WHERE< 查询条件 >
具体说明:
1)< 表名 > 指定需要修改数据的表的名称。
2)< 列名 = 表达式 > 指定要修改的列名和相应的值,表达式值的数据类型要与对应列的数据类型一样。
3)WHERE子句指定表中修改数据所要满足的条件。如果WHERE子句省略,则表示要修改表中的所有行。
例如 [2]
客户1000000005现在有了电子邮件地址,因此他的记录需要更新。
语句如下:
输入▼
UPDATE Customers
SET cust_email = ‘[email protected]
WHERE cust_id = ‘1000000005’;
UPDATE语句总是以要更新的表名开始。在这个例子中,要更新的表名为Customers。SET命令用来将新值赋给被更新的列。在这里,SET子句设置cust_email列为指定的值:
SET cust_email = ‘[email protected]’ UPDATE语句以WHERE子句结束,它告诉DBMS 更新哪一行。没有WHERE子句,DBMS将会用这个电子邮件地址更新Customers表中的所有行。
(2)更新表中的所有行 [1]
省略WHERE子句,所有记录将被更新。
语法说明:
UPDATE <表名>
SET <列名> = <表达式>;
(3)多列更新 [1]
同时更新多列时,可以在UPDATE语句的SET子句中,使用逗号分隔更新对象的多个列 [1]
语法说明:
UPDATE< 表名 >
SET< 列名1 = 表达式1,列名2=表达式2,…… >
WHERE< 查询条件 >
例如 [2]
输入▼
UPDATE Customers
SET cust_contact = 'Sam Roberts', cust_email = '[email protected]'
WHERE cust_id = '1000000006';
在更新多个列时,只需要使用一条SET命令,每 个“列=值”对之间用逗号分隔(最后一列之后不用逗号)。在此例子中,更新顾客1000000006的 cust_contact和cust_email列。
(4)使用NULL进行更新
使用 UPDATE 也可以将列更新为 NULL(该更新俗称为 NULL 清空)。此时只需要将赋值表达式右边的值直接写为 NULL 即可。和 INSERT 语句一样,UPDATE 语句也可以将 NULL 作为一个值来使用。但是,只有未设置 NOT NULL 约束和主键约束的列才可以清空为NULL。如果将设置了上述约束的列更新为NULL,就会出错。要删除某个列的值,可设置它为NULL(假如表定义允许NULL值) [1]
语法说明:
UPDATE< 表名 >
SET< 列名 = NULL,…… >
WHERE< 查询条件 >
例如:
输入▼
UPDATE Customers SET cust_email = NULL WHERE cust_id = ‘1000000005’
其中NULL用来去除cust_email列中的值。这与保存空字符串不同(空字符串用‘’表示,是一个值),而NULL表示没有值 [2]
(5)FROM关键字在有些数据库系统中,SQL实现支持在UPDATE语句中使用FROM子句,用一个表的数据更新另一个表的行。如想知道是否支持该特性需查阅数据库系统文档 [2]
(6)update语句中使用子查询 [2]
在有些数据库系统中,update语句中可以使用子查询,使得能用SELECT 语句检索出的数据更新列数据。
子查询是嵌套在另一个查询中的查询,通常用在WHERE子句中,但也可以用于SET子句。
例如:
1)在WHERE子句中使用子查询
假设有一个sales表,将那些销售额超过所有销售人员平均销售额的记录的bonus字段更新为100。
UPDATE sales
SET bonus = 100
WHERE sales_amount > (SELECTAVG(sales_amount) FROM sales);
在这个例子中,子查询计算sales表中所有记录的sales_amount的平均值,然后WHERE子句根据这个平均值来更新记录。
2)在SET子句中使用子查询
假设有两个表:employees和departments。根据departments表中的信息更新employees表中的salary字段。
UPDATE employees
SET salary = salary * (SELECTdepartment_increase FROM departments WHERE departments.department_id =employees.department_id)
WHERE EXISTS (SELECT 1 FROMdepartments WHERE departments.department_id = employees.department_id);
在这个例子中,department_increase是departments表中的一个字段,表示每个部门的工资增长百分比。SET子句中的子查询根据department_id字段来更新employees表中的salary字段。
(7)在SQL UPDATE语句中使用JOIN来更新表中的数据
当需要根据一张或多张表的数据来更新另一张表的数据时,可以使用UPDATE语句结合JOIN操作。
1)选择合适的JOIN类型:INNER JOIN(内连接)、LEFT JOIN(左连接)、RIGHT JOIN(右连接)。
2)编写UPDATE语句并包含JOIN:首先,确定要更新的目标表和源表,并使用别名来简化查询。使用ON子句指定JOIN条件。使用SET子句来定义要更新的字段及其新值。
假设我们有一个客户表(Customers)和订单表(Orders),我们想要更新客户的姓氏为“Smith”,但仅当他们的订单包含键盘时才进行更新。
UPDATE Customers C
JOIN Orders O ONC.customer_id = O.customer_id
SET C.last_name = 'Smith'
WHERE O.item = 'Keyboard';
在这个例子中,通过Customers和Orders表之间的连接,找到了所有相关联的客户,并将他们的姓氏更新为“Smith”。
如果需要在一个表内更新数据,可以使用自连接。例如,更新每个员工的上级姓名:
UPDATE employee AS t1
JOIN employee AS t2 ON t1.经理_id = t2.员工_id
SET t1.经理_姓名= t2.姓名;
这个语句的目的是更新employee表中每个员工的“经理_姓名”字段,使其与对应经理的“姓名”字段相匹配。使用了自连接(self-join),即同一个表employee通过两个不同的别名t1和t2来表示,t1和t2代表同一个表employee的不同实例或行集,t1代表当前正在处理的员工,t2代表当前员工的上级,通过ON子句中的条件t1.经理_id = t2.员工_id,确定了t1中的每一行与t2中的哪一行相关联。
3)在某些数据库系统中(如SQL Server),可能需要使用FROM子句和表别名来明确指定源表。确保JOIN条件正确且高效,以避免性能问题。
操作举例说明
例子 [1]
以Product(商品)表为例
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
0003
运动T恤
衣服
4000
2800
0004
菜刀
厨房用具
3000
2800
2009-09-20
0006
叉子
厨房用具
500
2009-09-20
0007
擦菜板
厨房用具
880
790
2008-04-28
0008
圆珠笔
办公用品
100
2009-11-11
1)更新表中的所有行:将登记日期全部更新为“2009-10-10”
UPDATEProduct
SETregist_date = '2009-10-10';
结果
product_id
(商品编号)
product_name
(商品名称)
product_type
(商品种类)
sale_price
(销售单价)
purchase_price
(进货单价)
regist_date
(登记日期)
0001
T恤衫
衣服
1000
500
2009-10-10
0002
打孔器
办公用品
500
320
2009-10-10
0003
运动T恤
衣服
4000
2800
2009-10-10
0004
菜刀
厨房用具
3000
2800
2009-10-10
0006
叉子
厨房用具
500
2009-10-10
0007
擦菜板
厨房用具
880
790
2009-10-10
0008
圆珠笔
办公用品
100
2009-10-10
此时,连登记日期原本为 NULL的数据行(运动 T 恤)的值也更新为2009-10-10了。
2)更新特定行
将商品种类(product_type)为厨房用具的记录的销售单价(sale_price)更新为原来的 10 倍
UPDATEProduct
SETsale_price = sale_price * 10
WHEREproduct_type = '厨房用具';
结果
product_id
(商品编号)
product_name
(商品名称)
product_type
(商品种类)
sale_price
(销售单价)
purchase_price
(进货单价)
regist_date
(登记日期)
0001
T恤衫
衣服
1000
500
2009-10-10
0002
打孔器
办公用品
500
320
2009-10-10
0003
运动T恤
衣服
4000
2800
2009-10-10
0004
菜刀
厨房用具
30000
2800
2009-10-10
0006
叉子
厨房用具
5000
2009-10-10
0007
擦菜板
厨房用具
8800
790
2009-10-10
0008
圆珠笔
办公用品
100
2009-10-10
该语句通过WHERE 子句中的“product_type = '厨房用具'”条件,将更新对象限定为 3 行。然后通过 SET 子句中的表达式sale_price * 10,将原来的单价扩大了 10 倍。SET 子句中赋值表达式的右边不仅可以是单纯的值,还可以是包含列的表达式。
3)多列更新
将销售单价(sale_price)更新为原来的 10 倍,同时将进货单(purchase_price)更新为原来的一半
UPDATEProduct
SETsale_price = sale_price * 10, purchase_price = purchase_price / 2
WHEREproduct_type = '厨房用具';
结果
product_id
(商品编号)
product_name
(商品名称)
product_type
(商品种类)
sale_price
(销售单价)
purchase_price
(进货单价)
regist_date
(登记日期)
0001
T恤衫
衣服
1000
500
2009-10-10
0002
打孔器
办公用品
500
320
2009-10-10
0003
运动T恤
衣服
4000
2800
2009-10-10
0004
菜刀
厨房用具
300000
1400
2009-10-10
0006
叉子
厨房用具
50000
2009-10-10
0007
擦菜板
厨房用具
88000
395
2009-10-10
0008
圆珠笔
办公用品
100
2009-10-10
4)使用NULL进行更新
将商品编号(product_id)为 0008的数据(圆珠笔)的登记日期(regist_date)更新为 NULL
UPDATEProduct
SETregist_date = NULL
WHEREproduct_id = '0008';
结果
product_id
(商品编号)
product_name
(商品名称)
product_type
(商品种类)
sale_price
(销售单价)
purchase_price
(进货单价)
regist_date
(登记日期)
0001
T恤衫
衣服
1000
500
2009-10-10
0002
打孔器
办公用品
500
320
2009-10-10
0003
运动T恤
衣服
4000
2800
2009-10-10
0004
菜刀
厨房用具
30000
2800
2009-10-10
0006
叉子
厨房用具
5000
2009-10-10
0007
擦菜板
厨房用具
8800
790
2009-10-10
0008
圆珠笔
办公用品
100
4 UPDATE与安全
在客户端/服务器的DBMS中,使用UPDATE语句可能需要特殊的安全权限。在使用UPDATE前,应该保证自己有足够的安全权限 [2]