删除数据
T-SQL提供两种从表中删除数据行的语句:DELETE和TRUNCATE
DELETE 语句是标准的SQL语句,它用于根据谓词删除表中的数据。
DELETE采用的是完整模式的日志处理,当删除大量数据时,可能会花费大量时间。
TRUNCATE不是标准的SQL语句,它用于删除表中所有数据,与DELETE不同的是,它采取的是最小模式记录日志,在性能上它们有很大差异。例如:删除几百万条数据时,使用TRUNCATE只需要几秒钟,而DELETE则需要几分钟甚至几小时。
当表中有标识列时,TRUNCATE会清除标识种子,而DELETE不会清除。
由于TRUNCATE语句执行速度非常快,因为有时具有一定的危险性。当清空表时搞错了要操作的表,类似的事情时有发生。
为避免发生这样的事故,可以简单地创建一个虚拟表(dummy table),以便于可以及时回滚。
T-SQL支持一种基于联接的语法,由于联接本身具有过滤的作用,因为它有一个基于谓词的过滤器(ON子句)。通过连接可以访问另一个表中相关的属性(列),并在WHERE子句中引用这些属性。
例如:
删除所有中国客户的订单
DELETE FROM O
FROM T_Order AS O
JOIN T_Customer AS C
ON O.CustID = C.CustID
WHERE C.Country = 'China'
也可以改成EXISTS+子查询的形式
DELETE FROM T_Order
WHERE EXISTS(
SELECT * FROM T_Customer AS C
WHERE C.CustID = T_Order.CustID AND C.Country = 'China'
)