SQL 数据的删除(DELETE 语句的使用方法)

学习重点

  • 如果想将整个表全部删除,可以使用 DROP TABLE 语句,如果只想删除表中全部数据,需使用 DELETE 语句。

  • 如果想删除部分数据行,只需在 WHERE 子句中书写对象数据的条件即可。通过 WHERE 子句指定删除对象的 DELETE 语句称为搜索型 DELETE 语句。

一、DROP TABLE 语句和 DELETE 语句

上一篇我们学习了插入数据的方法,本文我们来学习如何删除数据。删除数据的方法大体可以分为以下两种。

DROP TABLE 语句可以将表完全删除

DELETE 语句会留下表(容器),而删除表中的全部数据

KEYWORD

  • DROP TABLE 语句

  • DELETE 语句

① 中的 DROP TABLE 语句我们已经在 表的删除和更新 中学过了,此处再简单回顾一下。DROP TABLE 语句会完全删除整张表,因此删除之后再想插入数据,就必须使用 CREATE TABLE 语句重新创建一张表。

反之,② 中的 DELETE 语句在删除数据(行)的同时会保留数据表,因此可以通过 INSERT 语句再次向表中插入数据。

本文所要介绍的删除数据,指的就是只删除数据的 DELETE 语句。

此外,不管使用哪种方法,删除数据时都要慎重,一旦误删,想要恢复数据就会变得十分困难。

二、DELETE 语句的基本语法

DELETE 语句的基本语法如下所示,十分简单。

语法 2 保留数据表,仅删除全部数据行的 DELETE 语句

1
DELETE FROM <表名>;

执行使用该基本语法的 DELETE 语句,就可以删除指定的表中的全部数据行了。因此,想要删除 Product 表中全部数据行,就可以参照代码清单 13 来书写 DELETE 语句。

代码清单 13 清空 Product 表

1
DELETE FROM Product;

如果语句中忘了写 FROM,而是写成了“DELETE <表名>”,或者写了多余的列名,都会出错,无法正常执行,请大家特别注意。

前者无法正常执行的原因是删除对象不是表,而是表中的数据行(记录)。这样想的话就很容易理解了吧 1

后者错误的原因也是如此。因为 DELETE 语句的对象是行而不是列,所以 DELETE 语句无法只删除部分列的数据。因此,在 DELETE 语句中指定列名是错误的。当然,使用星号的写法(DELETE * FROM Product ;)也是不对的,同样会出错。

法则 4

DELETE 语句的删除对象并不是表或者列,而是记录(行)。

三、指定删除对象的 DELETE 语句(搜索型 DELETE

想要删除部分数据行时,可以像 SELECT 语句那样使用 WHERE 子句指定删除条件。这种指定了删除对象的 DELETE 语句称为搜索型 DELETE 2

KEYWORD

  • 搜索型 DELETE

搜索型 DELETE 的语法如下所示。

语法 3 删除部分数据行的搜索型 DELETE

1
2
DELETE FROM <表名>
 WHERE <条件>;

下面让我们以 Product(商品)表为例,来具体研究一下如何进行数据删除(表 1)。

表 1 Product

product_id
(商品编号)
product_name
(商品名称)
product_type
(商品种类)
sale_price
(销售单价)
purchase_price
(进货单价)
regist_date
(登记日期)
0001 T 恤衫 衣服 1000 500 2009-09-20
0002 打孔器 办公用品 500 320 2009-09-11
0003 运动 T 恤 衣服 4000 2800
0004 菜刀 厨房用具 3000 2800 2009-09-20
0005 高压锅 厨房用具 6800 5000 2009-01-15
0006 叉子 厨房用具 500 2009-09-20
0007 擦菜板 厨房用具 880 790 2008-04-28
0008 圆珠笔 办公用品 100 2009-11-11

假设我们要删除销售单价(sale_price)大于等于 4000 日元的数据(代码清单 14)。上述表中满足该条件的是“运动 T 恤”和“高压锅”。

代码清单 14 删除销售单价(sale_price)大于等于 4000 日元的数据

1
2
DELETE FROM Product
 WHERE sale_price >= 4000;

WHERE 子句的书写方式与此前介绍的 SELECT 语句完全一样。

通过使用 SELECT 语句确认,表中的数据被删除了 2 行,只剩下 6 行。

1
2
-- 确认删除后的结果
SELECT * FROM Product;

执行结果

product_id | product_name | product_type | sale_price | purchase_price | regist_date
-----------+--------------+--------------+------------+----------------+-----------
 0001      | T恤衫        | 衣服         |        1000 |             500 | 2009-09-20
 0002      | 打孔器       | 办公用品     |         500 |             320 | 2009-09-11
 0004      | 菜刀         | 厨房用具     |        3000 |            2800 | 2009-09-20
 0006      | 叉子         | 厨房用具     |         500 |                 | 2009-09-20
 0007      | 擦菜板       | 厨房用具     |         880 |             790 | 2008-04-28
 0008      | 圆珠笔       | 办公用品     |         100 |                 | 2009-11-11

法则 5

可以通过 WHERE 子句指定对象条件来删除部分数据。

SELECT 语句不同的是,DELETE 语句中不能使用 GROUP BYHAVINGORDER BY 三类子句,而只能使用 WHERE 子句。原因很简单, GROUP BYHAVING 是从表中选取数据时用来改变抽取数据形式的,而 ORDER BY 是用来指定取得结果显示顺序的。因此,在删除表中数据时它们都起不到什么作用。

专栏

删除和舍弃

标准 SQL 中用来从表中删除数据的只有 DELETE 语句。但是,很多数据库产品中还存在另外一种被称为 TRUNCATE 的语句。这些产品主要包括 Oracle、SQL Server、PostgreSQL、MySQL 和 DB2。

KEYWORD

  • TRUNCATE 语句

TRUNCATE 是舍弃的意思,具体的使用方法如下所示。

语法 A 只能删除表中全部数据的 TRUNCATE 语句

1
TRUNCATE <表名>;

DELETE 不同的是,TRUNCATE 只能删除表中的全部数据,而不能通过 WHERE 子句指定条件来删除部分数据。也正是因为它不能具体地控制删除对象,所以其处理速度比 DELETE 要快得多。实际上,DELETE 语句在 DML 语句中也属于处理时间比较长的,因此需要删除全部数据行时,使用 TRUNCATE 可以缩短执行时间。

但是,产品不同需要注意的地方也不尽相同。例如在 Oracle 中,把 TRUNCATE 定义为 DDL,而不是 DML 3。使用 TRUNCATE 时,请大家仔细阅读使用手册,多加注意。便利的工具往往还是会存在一些不足之处的。

请参阅

(完)


  1. INSERT 语句相同,数据的更新也是以记录为基本单位进行的。下一篇将要学习的 UPDATE 语句 也是如此。 ↩︎

  2. 虽然“搜索型 DELETE”是正式用语,但实际上这种说法并不常用,而是简单地称为 DELETE 语句。 ↩︎

  3. 因此,Oracle 中的 TRUNCATE 不能使用 ROLLBACK。执行 TRUNCATE 的同时会默认执行 COMMIT 操作。 ↩︎

comments powered by Disqus