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

database

目录

  • 一、DROP TABLE 语句和 DELETE 语句
  • 二、DELETE 语句的基本语法
  • 三、指定删除对象的 DELETE 语句(搜索型 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 语句

DELETE FROM <表名>;

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

代码清单 13 清空 Product 表

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

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 日元的数据

DELETE FROM Product

WHERE sale_price >= 4000;

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

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

-- 确认删除后的结果

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 语句

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 操作。 ↩︎

以上是 SQL数据的删除(DELETE语句的使用方法) 的全部内容, 来源链接: utcz.com/z/536095.html

回到顶部