第26章 DELETE语句
发布时间:2014-02-16 来源:文档文库
小
中
大
字号:
第26章 DELETE语句
当数据库的添加工作完成以后,随着使用和对数据的修改,表中可能存在一些无用的数据,这些无用的数据不仅会占用空间,还会影响修改和查询的速度,所以应及时将它们删除。本节主要介绍几种最常用的删除方法。
26.1 DELETE语法
在SQL支持的所有数据修改语句中,DELETE语句可能是最简单的语句。它只包含两个子句,其中一个子句是强制性的。DELETE语句的语法格式如下:
DELETE FROM name> [WHERE 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 商品信息
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