
6.3 DELETE语句
使用Oracle中DML的DELETE语句可以对数据表中的数据执行删除操作。删除表数据时,如果该表中的某个字段有外键关系,需要先删除外键表的数据,然后再删除该表中的数据,否则将会出现删除异常。
下面详细介绍DELETE语句删除数据表中数据的方法。
6.3.1 DELETE语句语法
DELETE语句的基本格式为:
DELETE table_or_view FROM table_sources WHERE search_condition
下面具体说明语句中各参数的具体含义。
(1)table_or_view是从中删除数据的表或者视图的名称。表或者视图中的所有满足WHERE子句的记录都将被删除。
通过使用DELETE语句中的WHERE子句,SQL可以删除表或者视图中的单行数据、多行数据以及所有行数据。如果DELETE语句中没有WHERE子句的限制,表或者视图中的所有记录都将被删除。
(2)FROM table_sources子句为需要删除数据的表名称。它使DELETE可以先从其他表查询出一个结果集,然后删除table_sources中与该查询结果相关的数据。
DELETE语句只能从表中删除数据,不能删除表本身,要删除表的定义可以使用DROP TABLE语句。
使用DELETE语句时应该注意以下几点。
(1)DELETE语句不能删除单个列的值,只能删除整行数据。要删除单个列的值,可以采用UPDATE语句,将其更新为NULL。
(2)使用DELETE语句仅能删除记录即表中的数据,不能删除表本身。要删除表,需要使用DROP TABLE语句。
(3)同INSERT和UPDATE语句一样,从一个表中删除记录将引起其他表的参照完整性问题。这是一个潜在的问题,需要时刻注意。
6.3.2 删除数据
DELETE语句可以删除数据库表中的单行数据、多行数据以及所有行数据。同时在WHERE子句中也可以通过子查询删除数据。
【范例9】
假设要删除该表中rno列为R101的房间信息,实现语句如下。
DELETE FROM roominfo_copy WHERE rno='R101';
由于在roominfo_copy表中rno列是表的主键,所以上述语句只会删除一行数据。可以使用如下语句验证删除效果。
SELECT * FROM roominfo_copy WHERE rno='R101';
由于rno列为R101的房间信息已经被删除,所以上述语句返回空结果集。
【范例10】
DELETE语句不但可以删除单行数据,而且可以删除多行数据。假设要删除roominfo_copy表中rprice列小于300的房间信息。语句如下。
DELETE FROM roominfo_copy WHERE rprice<300;
执行上述语句多行受影响,可以使用“SELECT * FROM roominfo_copy WHERE rprice<300”语句查看删除后的表结果。
【范例11】
如果DELETE语句中没有WHERE子句,则表中所有记录将全部被删除。例如,删除roominfo_copy表里的所有信息,语句如下。
DELETE FROM roominfo_copy;
执行上述语句,然后再查看roominfo_copy表的数据,可见所有记录都已被删除。
6.3.3 清空表
除了使用DELETE语句删除数据之外,还可以使用TRUNCATE语句进行删除。TRUNCATE语句语法如下:
TRUNCATE TABLE table_name;
使用TRUNCATE清空表中数据的时候,要注意如下几点。
(1)TRUNCATE语句删除表中所有的数据。
(2)释放表的存储空间。
(3)TRUNCATE语句不能回滚。
【范例12】
使用TRUNCATE语句清空roominfo_copy表的数据。语句如下。
TRUNCATE TABLE roominfo_copy;
清空之后再使用SELECT查询roominfo_copy表的数据,结果如下。
RNO RTYPE RPRICE RFLOOR TOWARD ---------- --------- ----------- --------- ---------------
如上述结果所示,TRUNCATE语句清空了roominfo_copy表的所有数据,但保留了表的结构。