12.2.1 DELETE語句基本語法
使用DELETE語句從數(shù)據(jù)庫刪除數(shù)據(jù),基本語法如下。
DELETE FROM table_name
WHERE search_condition
說明:該語句將從表中刪除符合條件的數(shù)據(jù)行,如果沒有WHERE語句,則刪除所有數(shù)據(jù)行。通過使用DELETE語句的WHERE子句,SQL可以刪除單行數(shù)據(jù)、多行數(shù)據(jù)以及所有行數(shù)據(jù)。使用DELETE語句時,應(yīng)注意以下幾點(diǎn)。
DELETE語句不能刪除單個字段的值,只能刪除整行數(shù)據(jù)。要刪除單個字段的值,可以采用上節(jié)介紹的使用UPDATE語句,將其更新為NULL。
使用DELETE語句僅能刪除記錄即表中的數(shù)據(jù),不能刪除表本身。要刪除表,需要使用前面介紹的DROP TABLE語句。
同INSERT和UPDATA語句一樣,從一個表中刪除記錄將引起其他表的參照完整性問題。這是一個潛在問題,需要時刻注意。
注意
在DELETE語句中沒有指定列名,這是因?yàn)椴荒軓谋碇袆h除單個列的值,只能整行刪除。如果需要刪除特定的列值,應(yīng)使用UPDATE語句將該值設(shè)置為NULL,當(dāng)然,前提是該列沒有NOT NULL約束,具體操作可參加12.1.2節(jié)的例程。
12.2.2 DELETE語句刪除單行數(shù)據(jù)
DELETE語句可以刪除數(shù)據(jù)庫表中的單行數(shù)據(jù)、多行數(shù)據(jù)以及所有行數(shù)據(jù)。同時在WHERE子句中,也可以通過子查詢刪除數(shù)據(jù)。本節(jié)主要通過一個實(shí)例說明如何從表中刪除單行數(shù)據(jù)。
實(shí)例9 DELETE語句刪除單行數(shù)據(jù)
從New_Teacher2表中,刪除教工號為8的教師記錄。實(shí)例代碼:
DELETE FROM New_Teacher2
WHERE TNO=8
查看表New_Teacher2的數(shù)據(jù)。
SELECT * FROM New_Teacher2
運(yùn)行結(jié)果如圖12.10所示。
圖12.10 刪除New_Teacher2表中教工號為8的教師記錄
可見,教工號為8的教師記錄已經(jīng)被整行刪除。
12.2.3 DELETE語句刪除多行數(shù)據(jù)
與前面介紹的數(shù)據(jù)更新操作一樣,可以在WHERE子句中設(shè)置各種搜索條件,也可以通過子查詢或者多表連接的方式選擇要刪除的行。
實(shí)例10 DELETE語句刪除多行數(shù)據(jù)
從New_Teacher2表中,刪除工資低于所有教師平均工資的男教師的記錄。
實(shí)例代碼:
DELETE FROM New_Teacher2
WHERE TSEX=’男’
AND SAL < (SELECT avg(SAL)
FROM New_Teacher2)
查看表New_Teacher2的數(shù)據(jù)。
SELECT * FROM New_Teacher2
運(yùn)行結(jié)果如圖12.11所示。
可見,教工號為1和3的兩位男教師記錄已經(jīng)被刪除。
圖12.11 刪除New_Teacher2表中工資低于所有教師平均工資的男教師的記錄
12.2.4 DELETE語句刪除所有行
如果DELETE語句中,不包含WHERE子句,則該表的所有行都將被刪除。
實(shí)例11 DELETE語句刪除所有行
刪除New_Teacher2表中的所有記錄,代碼如下:
DELETE FROM New_Teacher2
查看表New_Teacher2的數(shù)據(jù)。
SELECT * FROM New_Teacher2
運(yùn)行結(jié)果如圖12.12所示。
圖12.12 刪除New_Teacher2表中的所有記錄
可以發(fā)現(xiàn),New_Teacher2表中的所有記錄都被刪除了,但是New_Teacher2表本身(各個字段)還存在,并沒有被刪除。
12.2.5 TRUNCATE TABLE語句
從12.2.4節(jié)可以看到,使用沒有WHERE子句的DELETE語句可以從表中刪除所有的行。在SQL Server中,還提供了TRUNCATE TABLE語句,供用戶刪除表中的所有數(shù)據(jù),同時又不刪除表結(jié)構(gòu)。TRUNCATE TABLE語句語法如下。
TRUNCATE TABLE table_name
雖然使用DELETE語句和TRUNCATE TABLE語句都能夠刪除表中的所有數(shù)據(jù),但是使用TRUNCATE TABLE語句比用DELETE語句快得多,表現(xiàn)為以下兩點(diǎn)。
使用DELETE語句,系統(tǒng)將一次一行地處理要刪除的表中的記錄,在從表中刪除行之前,在事務(wù)處理日志中記錄相關(guān)的刪除操作和刪除行中的列值,以防止刪除失敗時,可以使用事務(wù)處理日志來恢復(fù)數(shù)據(jù)。
TRUNCATE TABLE則一次性完成刪除與表有關(guān)的所有數(shù)據(jù)頁的操作。另外,TRUNCATE TABLE語句并不更新事務(wù)處理日志。由此,在SQL Server中,使用TRUNCATE TABLE語句從表中刪除行后,將不能用ROLLBACK命令取消行的刪除操作。
注意
TRUNCATE TABLE語句不能用于有外關(guān)鍵字依賴的表。
實(shí)例12 TRUNCATE TABLE語句刪除表中的數(shù)據(jù)
刪除New_Teacher表中的所有數(shù)據(jù),代碼如下。
TRUNCATE TABLE New_Teacher
查看刪除數(shù)據(jù)后表New_Teacher中的數(shù)據(jù)。
SELECT * FROM New_Teacher
運(yùn)行結(jié)果如圖12.13所示。
圖12.13 刪除New_Teacher表中的所有數(shù)據(jù)
可見,表New_Teacher中的數(shù)據(jù)均被刪除,但表結(jié)構(gòu)并沒有被刪除,這與DROP TABLE語句是不同的。