在本文中,我们将介绍在SQL Server中使用SELECT语句更新数据的不同方法。
在数据库中,通常不存储静态数据。相反,当我们更新现有数据、存档或删除不相关数据时,数据会不断变化。例如,假设您有一个超市产品定价数据的表。产品价格不断变化,因为您可能会在不同时间向客户提供产品折扣。在这种情况下,无法在表中添加新行,因为产品记录已经存在,所以需要更新现有产品的当前价格。
此时就用到UPDATE了。UPDATE修改数据库中现有行中的数据。您可以使用WHERE子句限制更新行。例如,在[employee]表中,要求必须将所有在职员工的工资增加10%。在这种情况下,直接引用SQL语句:
Update employee set [salary]= salary + (salary * 10 / 100) where [active]=1
假设有一个员工位置的表[Address],需要根据[Address]表中可用的数据更新[Employee]表。那么如何更新[Employee]表中的数据?
这个时候就要使用select语句,然后更新数据了。
要求更新[Employee]中[PostCode] 和[City]两列的数据,如果数值是NULL,那么根据[Address]的对应两列更新。
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
接下来,对语句进行更改,如下所示。
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 语句并验证结果。
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。