修改数据
UPDATE语句是标准的SQL语句,用于对表中数据行的一个子集进行更新。为了标识作为更新的子集行,须要在WHERE子句中指定一个谓词。在SET子句中要指定更改的列和这些列的新值(或表达式),各列之间用逗号分隔。
“同时操作”是SQL表达式中一个重要的特性,在编写UPDATE语句时应该谨记这一点。
例如:
UPDATE T
SET col1 = col1 + 10,col2 = col1 + 10
假如在更新钱col1等于100,col2等于200,你能计算出最终的结果值吗?
如果不考虑同时操作的概念,你可能认为col将等于110,col2等于120。好像赋值表达式是从左到右执行的。但是两个表达式是同时执行的它们都等于110.
用同时操作的思想,如果想交换两个变量的值该怎么操作呢?在大多数编程语言中,得需要一个临时变量。然而在SQL中这个问题非常简单:
UPDATE T
SET col1 = col2,col2 = col1
和DELETE一样,T-SQL也支持一种基于联接的UPDATE语法,这不是标准的SQL语法。和基于联接的DELETE语句一样,联接在此也起到过滤的作用。
UPDATE还支持一种特殊语法,可以对表中的数据更新的同时为变量赋值,这种语法可以使你不必单独使用UPDATE和SELECT语句,就能完成同样的任务。
例如:
declare @i AS int = 123;
update T_Customer
set @i = CustID = CustID + 1
select @i
合并数据
SQLServer2008引入了一个称为MERGE的语句,它在一条语句根据逻辑条件做出不同的修改操作(INSERT,UPDATE,DELETE),使用MERGE的好处是:用较少的代码就可以表达需求,提高查询性能,因为它可以更少地查询设计表。
在MERGE子句中指定目标表的名称,在USING子句中指定来源表的名称。然后在ON子句中用谓词来定义合并条件,合并条件用来定义来源表中哪些行在目标表中有匹配,哪些没有匹配。
我们可以在WHEN MATCHED THEN子句中定义找到匹配行时执行的操作,也可以在WHEN NOT MATCHED THEN子句中定义没有找到匹配行时要进行的操作。
例如:
--MERGE语句
MERGE T_Employee AS e1
USING T_Employee2 AS e2
ON e1.Empid = e2.Empid
WHEN Matched THEN --以USING的表为准,修改MERGE的表
UPDATE SET
e1.FirstName = e2.FirstName,e1.LastName = e2.LastName,e1.Country = e2.Country
WHEN NOT Matched THEN --以USING的表为准,新增MERGE的表
INSERT(FirstName,LastName,Country) VALUES
(e2.FirstName,e2.LastName,e2.Country)
WHEN NOT MATCHED BY SOURCE THEN --以USING的表为准,删除MERGE的表
UPDATE SET
e1.IsDelete = 1;
T-SQL还支持第三种子句:WHEN NOT MATCHED BY SOURCE它用于当来源表中没有行对应目标表时,一般可以采取删除操作。
我们还可以在WHEN MATCHED后面添加AND来为操作子句增加谓词条件。