第26章  DELETE语句
当数据库的添加工作完成以后,随着使用和对数据的修改,表中可能存在一些无用的数据,这些无用的数据不仅会占用空间,还会影响修改和查询的速度,所以应及时将它们删除。本节主要介绍几种最常用的删除方法。
26.1  DELETE语法
在SQL支持的所有数据修改语句中,DELETE语句可能是最简单的语句。它只包含两个子句,其中一个子句是强制性的。DELETE语句的语法格式如下:
DELETE FROM <table name>
[WHERE <search condition>]
DELETE FROM子句是必选项,要求指定从中删除行的表的名称,WHERE子句是可选项,类似于SELECT和UPDATE这两个语句中的WHERE子句,它要求指定搜索条件。如果在DELETE语句中没有包括WHERE子句,那么将从指定的表中删除所有行。
DELETE语句只从表中删除数据,它不删除表定义本身。如果要删除数据和表定义,应使用DROP TABLE语句。
在DELETE语句中没有指定列名,这是由于不能从表中删除单个列的值,只能删除行。如果需要删除特定的列值,应使用UPDATE语句将该值设置为空值,不过,必须只有在该列支持空值时才可以这么做。
26.2  使用DELETE语句
上面介绍了DELETE的语法以及注意事项,下面通过几个具体实例,来详细介绍一下如何使用DELETE语句删除表中的数据。首先看怎么删除一个表中的所有数据。例如删除商品信息里的所有数据,可以使用如下DELETE语句:
DELETE FROM 商品信息
这只是在需要删除所有语句时才可以使用这条语句。不过,这种情况使用的并不多,更多的时候,需要使用WHERE子句来指定要删除的行。例如要删除商品信息表中的商品名称为“VE眼霜”的所有信息,可以使用如下DELETE语句:
DELETE FROM 商品信息
truncate删除数据WHERE 商品名称=‘VE眼霜’
执行上面语句后,“VE眼霜”的信息将被删除。
如果用户需要删除包含某些字段的信息,例如,需要删除商品信息表中的包含“苹果”字段的商品名称。则可以使用如下DELETE语句:
use 购物系统
go
DELETE FROM 商品信息 where 商品名称 like '%苹果%'
Go
执行上述语句后,显示结果如图6-15所示。与原始数据相比,结果集里不再显示所有包含“苹果”字段的商品信息。原始数据见图6-14。
图6-15  执行上述语句后的结果
如果需要删除商品信息表中的20%,可以使用如下DELETE语句:
DELETE TOP(20) PERCENT 商品信息
执行述语句后,商品信息表中将会删除前2条语句(原来共有9条语句)。结果如图6-16所示。
图6-16 删除其表20%后的结果集
实际上,如果需要删除图书信息表的前2行,也可以使用如下DELETE语句:
DELETE TOP(2) 商品信息
26.3  使用TRUNCATE TABLE语句
TRUNCATE TABLE语句提供了一种删除表中所有记录的快速方法。因为TRUNCATE TABLE语句不记录日志,只记录整个数据页的释放操作,而DELETE语句对每一行修改都记录日志,所以使用TRUNCATE TABLE语句进行删除操作总是比没有指定条件的DELETE语句效率高。TRUNCATE TABLE立即释放了表中数据及索引所占用的全部空间,同时也释放了分配给所有索引的空间。其语法格式如下:
TRUNCATE TABLE [ [database.] owner.] table_name
与DELETE语句相比,TRUNCATE TABLE具有以下优点:
所用的事务日志空间较少  DELETE语句每次删除一行,并在事务日志中为所删除的每行记录一个项。TRUNCATE TABLE通过释放用于存储表数据的数据页来删除数据,并且在事务日志中只记录页释放。
使用的锁通常较少  当使用行锁执行DELETE语句时,将会锁定表中各行以便删除。TRUNCATE TABLE始终锁定表和页,而不是锁定各行。
表中将毫无例外地不留下任何页  执行DELETE语句后,表仍会包含空页。例如,必须至少使用一个排他(LCK_M_X)表锁,才能释放堆中的空表。如果执行删除操作时没有使用表锁,表(堆)中将包含许多空页。对于索引,删除操作会留下一些空页,尽管如此,不过这些页会通过后台清除进程迅速释放。
那么可不可以用TRUNCATE TABLE代替不带WHERE子句的DELETE语句呢?在以下几种情况是不行的:
在需要保留标识的情况下不能用TRUNCATE TABLE,因为TRUNCATE TABLE会重置标识。
在需要使用触发器的情况下不能使用TRUNCATE TABLE,因为它不会激发触发器。
对于由FOREIGN KEY约束引用的表(即主键所在的表,不是外键所在的表)不能使用TRUNCATE TABLE.
对于参与了索引视图的表不能使用TRUNCATE TABLE,注意指的是索引视图,并非普通视图。
那么用户需要具有什么权限才可以使用TRUNCATE TABLE呢?若要使用TRUNCATE TABLE语句,必须是表的所有者,具有DBA权限或表的ALTER权限。对于基表,TRUNCATE TABLE语句需要有表的排他访问权限,因为操作是原子操作(要么删除所有行,要么不删除任何行)。这意味着所有以前打开的游标和引用要截断的表的游标都必须关闭,并且必须发出COMMIT或ROLLBACK命令释放对表的引用。对于临时表,每个用户都有自己的数据副本,不需要排他访问。
下面结合一个简单的实例来说明如何使用TRUNCATE TABLE语句。比如需要删除商品信息表中的所有数据,可以使用如下语句:
TRUNCATE TABLE 商品信息
由于TRUNCATE TABLE操作是不进行日志记录的,所以建议在TRUNCATE TABLE语句之前使用BACKUP DATABASE语句来对数据库做备份。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。