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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM