-
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
语句
|
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 BY
、 HAVING
和 ORDER BY
三类子句,而只能使用 WHERE
子句。原因很简单, GROUP BY
和 HAVING
是从表中选取数据时用来改变抽取数据形式的,而 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
时,请大家仔细阅读使用手册,多加注意。便利的工具往往还是会存在一些不足之处的。
请参阅
- 数据的插入
- 数据的删除
- 数据的更新
- 事务
(完)
-
与
INSERT
语句相同,数据的更新也是以记录为基本单位进行的。下一篇将要学习的 UPDATE 语句 也是如此。 ↩︎ -
虽然“搜索型
DELETE
”是正式用语,但实际上这种说法并不常用,而是简单地称为DELETE
语句。 ↩︎ -
因此,Oracle 中的
TRUNCATE
不能使用ROLLBACK
。执行TRUNCATE
的同时会默认执行COMMIT
操作。 ↩︎
来源:https://www.cnblogs.com/vin-c/p/15572709.html