SQL Server - 使用SELECT语句更新数据的不同方法

在本文中,我们将介绍在SQL Server中使用SELECT语句更新数据的不同方法。

在数据库中,通常不存储静态数据。相反,当我们更新现有数据、存档或删除不相关数据时,数据会不断变化。例如,假设您有一个超市产品定价数据的表。产品价格不断变化,因为您可能会在不同时间向客户提供产品折扣。在这种情况下,无法在表中添加新行,因为产品记录已经存在,所以需要更新现有产品的当前价格。

此时就用到UPDATE了。UPDATE修改数据库中现有行中的数据。您可以使用WHERE子句限制更新行。例如,在[employee]表中,要求必须将所有在职员工的工资增加10%。在这种情况下,直接引用SQL语句:

Update employee set [salary]= salary + (salary * 10 / 100)  where [active]=1

假设有一个员工位置的表[Address],需要根据[Address]表中可用的数据更新[Employee]表。那么如何更新[Employee]表中的数据?

更新[Employee]表中的数据

这个时候就要使用select语句,然后更新数据了。

要求更新[Employee]中[PostCode] 和[City]两列的数据,如果数值是NULL,那么根据[Address]的对应两列更新。

更新[Employee]中[PostCode] 和[City]两列的数据

1.   使用Join方法

使用 SQL JOIN来引用包含更新的值的辅助表。 因此,根据指定条件更新目标表。

首先使用 SELECT 语句来获取引用列和目标列的值。

SELECT e.City,A.City, e.PostCode,A.PostCode

FROM Employee e

INNER JOIN [Address] a

ON e.EmpID = A.EmpID

SELECT 语句

接下来,对语句进行更改,如下所示。

1. 将 select 关键字替换为 update。

2. 指定需要更新的表名或别名。

3. 在引用列和目标列之间使用 set 关键字和等号 (=)。

UPDATE e set

e.City=A.City,

e.PostCode=A.PostCode

FROM Employee e

INNER JOIN [Address] a

ON e.EmpID = A.EmpID

执行 UPDATE 语句并验证结果。

执行 UPDATE 语句并验证结果

2.   使用MERGE语句

MERGE 语句对于根据匹配行和不匹配行的操作来更新目标表的数据。 它是使用 SELECT 语句更新数据的另一种方法。

在下面的示例 MERGE 语句中,执行以下任务:

使用 MERGE 语句更新 [Employee] 表数据。

应用 USING 子句时引用另一个表。

WHEN MATCHED 指定引用表和目标表之间的合并 JOIN(内连接)。

使用 THEN UPDATE 语句后根据源表和目标表列映射更新数据。

使用分号(;) 结束MERGE。

MERGE Employee AS e

USING (SELECT * FROM [Address]) AS A

ON A.EmpID=e.EmpID

WHEN MATCHED THEN UPDATE SET

e.PostCode=A.PostCode ,

e.City = A.City;

3.   使用子查询语句

子查询定义了可以在 SELECT、INSERT、UPDATE 和 DELETE 语句中使用的内部查询。 这是一种从其他表更新现有表数据的简单方法。

UPDATE Employee

SET Employee.City=(SELECT [Address].city

FROM [Address]

WHERE [Address].EmpID = Employee.EmpId)

上面的查询在 UPDATE 语句的 SET 子句中使用了一个 SELECT 语句。

如果子查询找到匹配行,则更新特定员工的记录。

如果子查询返回 NULL(没有匹配的行),更新相应列为NULL。

如果子查询返回多个匹配的行,则会引发错误——“SQL Server Subquery returned more than 1 value.

This is not permitted when the subquery uses comparison operators(=, !=, <, <= , >, >=)。”

子查询很简单但是有限制

带有比较运算符的子查询只能包含一个列名,除非用于 IN 或 EXISTS 运算符。 因此,如果我们需要更新多列数据时,需要单独的 SQL 语句。

不能在子查询中使用 ntext、text 和 image 数据类型。

如果子查询包含未修改的比较运算符,则子查询不能包含 GROUP BY 和 HAVING 子句。

 PS : 未修改的比较运算符不能使用关键字 ANY 或 ALL。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容