學習重點
如果想將整個表全部刪除,可以使用
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
時,請大家仔細閱讀使用手冊,多加注意。便利的工具往往還是會存在一些不足之處的。
請參閱
(完)