Oracle 12c中文版数据库管理、应用与开发实践教程 (清华电脑学堂)
上QQ阅读APP看书,第一时间看更新

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表的所有数据,但保留了表的结构。