Update是SQL语句中
DML类(DataManipulation Language,数据操纵语言)中的一个指令,用于更新(修改)表中原有数据。
语句概述
Update是SQL语句中DML类(Data Manipulation Language,数据操纵语言)中的一个指令,用于更新(修改)表中原有数据。基本书写规则
(1)SQL 语句使用分号(;)结尾;
(2)Update作为关键字不区分大小写。
语法结构
UPDATE 表名称
SET 列名称 = 新值, 列名称2 = 新值2,...
WHERE 条件;
其中,表名称是需要更新数据的表的名称;列名称= 新值部分指定了要更新的列及其新值;WHERE条件用于指定哪些记录需要被更新。如果省略WHERE子句,所有记录将被更新。
SQL的UPDATE语句通过指定表、列及其新值以及适用的条件来实现对数据库表中数据的更新操作。使用WHERE子句
更新部分数据行时可以使用WHERE来指定更新对象的条件。通过WHERE
子句指定更新对象的UPDATE语句称为搜索型UPDATE语句。
更新操作
(1)更新表中的特定行
UPDATE语句用于修改表中的数据,而WHERE子句则用于指定哪些行需要被更新。
语法说明:
UPDATE< 表名 >
SET< 列名 = 表达式 >[,…n]
WHERE< 查询条件 >
具体说明:
1)< 表名 > 指定需要修改数据的表的名称。
2)< 列名 = 表达式 > 指定要修改的列名和相应的值,表达式值的数据类型要与对应列的数据类型一样。
3)WHERE子句指定表中修改数据所要满足的条件。如果WHERE子句省略,则表示要修改表中的所有行。
例如:
客户1000000005现在有了电子邮件地址,因此他的记录需要更新。
语句如下:
输入▼
UPDATE Customers
SET cust_email = ‘kim@thetoystore.com’
WHERE cust_id = ‘1000000005’;
UPDATE语句总是以要更新的表名开始。在这个例子中,要更新的表名为Customers。SET命令用来将新值赋给被更新的列。在这里,SET子句设置cust_email列为指定的值:
SET cust_email = ‘kim@thetoystore.com’ UPDATE语句以WHERE子句结束,它告诉DBMS 更新哪一行。没有WHERE子句,DBMS将会用这个电子邮件地址更新Customers表中的所有行。
(2)更新表中的所有行
省略WHERE子句,所有记录将被更新。
语法说明:
UPDATE <表名>
SET <列名> = <表达式>;
(3)多列更新
同时更新多列时,可以在UPDATE语句的SET子句中,使用逗号分隔更新对象的多个列。
语法说明:
UPDATE< 表名 >
SET< 列名1 = 表达式1,列名2=表达式2,…… >
WHERE< 查询条件 >
例如:
输入▼
UPDATE Customers
SET cust_contact = 'Sam Roberts', cust_email = 'sam@toyland.com'
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值)。
语法说明:
UPDATE< 表名 >
SET< 列名 = NULL,…… >
WHERE< 查询条件 >
例如:
输入▼
UPDATE Customers SET cust_email = NULL WHERE cust_id = ‘1000000005’
其中NULL用来去除cust_email列中的值。这与保存空字符串不同(空字符串用‘’表示,是一个值),而NULL表示没有值。
(5)FROM关键字在有些数据库系统中,SQL实现支持在UPDATE语句中使用FROM子句,用一个表的数据更新另一个表的行。如想知道是否支持该特性需查阅数据库系统文档。
(6)update语句中使用子查询
在有些数据库系统中,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条件正确且高效,以避免性能问题。
操作举例说明
例子:
以Product(商品)表为例
1)更新表中的所有行:将登记日期全部更新为“2009-10-10”
UPDATEProduct
SETregist_date = '2009-10-10';
此时,连登记日期原本为 NULL的数据行(运动 T 恤)的值也更新为2009-10-10了。
2)更新特定行
将商品种类(product_type)为厨房用具的记录的销售单价(sale_price)更新为原来的 10 倍
UPDATEProduct
SETsale_price = sale_price * 10
WHEREproduct_type = '厨房用具';
该语句通过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 = '厨房用具';
4)使用NULL进行更新
将商品编号(product_id)为 0008的数据(圆珠笔)的登记日期(regist_date)更新为 NULL
UPDATEProduct
SETregist_date = NULL
WHEREproduct_id = '0008';
4 UPDATE与安全
在客户端/服务器的DBMS中,使用UPDATE语句可能需要特殊的安全权限。在使用UPDATE前,应该保证自己有足够的安全权限。