如何用SQL DELETE語法有效刪除資料

作者:帆軟行業化團隊

2025年7月02日 · 13 min read

來源:帆軟
SQL DELETE.webp
Image Source: unsplash

你想刪除資料時,只要用 DELETE FROM 表格名稱 WHERE 條件 就可以。很多人會忘記加WHERE,這樣一不小心就會把整個表的資料都刪光。下面這些例子可以幫你理解:

  1. 如果你加上WHERE條件,比如只刪除id為3的資料,執行後只會影響那一行。
  2. 如果你沒寫WHERE,所有資料都會被刪除,這很危險,因為刪掉就救不回來。
  3. 所以每次做SQL刪除時,記得檢查WHERE條件,這樣才不會出錯。

核心要點

  • 使用DELETE刪除資料時,務必加上WHERE條件,避免誤刪整張表的資料。
  • DELETE只能刪除整列資料,無法只刪除單一欄位,若要清空欄位請用UPDATE。
  • 刪除前先用SELECT測試條件,並做好資料備份,確保資料安全可還原。
  • 進階刪除可利用JOIN或子查詢精準刪除多表關聯資料,提升效率與準確度。
  • DELETE與TRUNCATE差異大,DELETE可加WHERE且較安全,TRUNCATE速度快但不可逆。

DELETE語法

DELETE語法
DELETE語法

結構說明

你在做SQL刪除時,最常見的語法就是這樣:

DELETE FROM 表格名稱 WHERE 條件;

這個語法很簡單,卻很有威力。你只要指定表格名稱,然後用WHERE條件告訴資料庫要刪除哪些資料。技術文件裡也有詳細說明這個結構,像是「DELETE FROM table_name WHERE column_name operator value;」。每個部分都有它的意義:

  • DELETE FROM:這是告訴資料庫你要刪除資料。
  • 表格名稱:你要從哪個表格刪除資料。
  • WHERE 條件:你要刪除哪些資料,這裡一定要小心。

你只能用DELETE刪除整列資料,不能只刪除某一個欄位。如果你想只清空某個欄位,得用UPDATE語法。

小提醒:技術社群和官方文件也會提到,像在SQL Server裡,DELETE語法甚至可以用在XML文件,刪除特定節點。不過大多數時候,你會用在一般資料表。

WHERE子句

WHERE子句是SQL刪除裡最重要的部分。你一定要用它來指定條件,否則資料庫會把整個表的資料都刪掉。這裡有幾個重點:

  • DELETE語句會根據WHERE條件刪除符合的資料。
  • 如果你沒寫WHERE,所有資料都會被刪除。
  • 你可以用多個條件組合,像這樣:
DELETE FROM Websites WHERE name='Facebook' AND country='USA';
  • 執行後,只有符合條件的資料會被刪除,其他資料都不會動。

有些資料庫(像MySQL)還有安全機制。例如,sql_safe_updates參數可以防止你不小心執行沒有WHERE條件的SQL刪除。這樣可以大大降低誤刪的風險。

常見錯誤

你在寫SQL刪除時,最常見的錯誤就是忘記加WHERE。這會讓你一口氣刪掉整個表的資料,資料就救不回來了。還有其他常見錯誤:

  • WHERE條件寫錯,結果刪錯資料。
  • 忘記考慮外部關聯鍵,導致資料不一致。
  • 沒有備份資料,刪除後無法還原。

你可以參考技術社群的教學文章,裡面會提醒你要注意外部關聯鍵的約束,還有JOIN語法的應用。這些都能幫你避免在複雜資料庫裡發生意外。

小心:SQL刪除是不可逆的操作。每次執行前,請再三檢查你的WHERE條件,並且記得備份資料。

SQL刪除範例

單筆刪除

你想只刪掉一筆資料嗎?這很簡單。假設你有一個叫做 students 的表格,裡面有學生的資料。你只想刪掉學號是 1001 的那一筆。你可以這樣寫:

DELETE FROM students WHERE student_id = 1001;

這個指令會找到 student_id 等於 1001 的那一行,然後把它從資料表裡移除。你不用擔心其他學生的資料會被影響,只會動到這一筆。

小提醒:每次執行SQL刪除時,請再三檢查你的WHERE條件,確保只刪掉你想要的資料。

多筆刪除

有時候,你會想一次刪掉好幾筆資料。比如你想把所有畢業年份是 2020 的學生資料都刪除。你可以這樣做:

DELETE FROM students WHERE graduation_year = 2020;

這個指令會找出所有 graduation_year 等於 2020 的學生,然後一次把他們的資料都刪掉。這樣你不用一筆一筆慢慢刪,效率很高。

你也可以用IN語法,像這樣:

DELETE FROM students WHERE student_id IN (1002, 1003, 1004);

這樣就能同時刪掉多個指定學號的學生。

執行前後對照

你可能會想知道,執行SQL刪除前後,資料表到底有什麼變化?我們來看一個簡單的例子。假設你的 students 表格原本長這樣:

student_idnamegraduation_year
1001小明2020
1002小華2021
1003小美2020
1004小強2022

你執行這個指令:

DELETE FROM students WHERE graduation_year = 2020;

執行後,資料表會變成:

student_idnamegraduation_year
1002小華2021
1004小強2022

你可以很清楚看到,畢業年份是2020的學生(小明和小美)都被刪除了。

  • 有些資料庫(像SQL Server)會自動保存資料變更的歷程。這種時態表可以讓你隨時查到不同時間點的資料內容,方便你分析資料變化。
  • 在高事務量的環境,例如庫存管理或貨幣交易,時態表可以幫你追蹤每一次的刪除或異動,還能減少對主系統的影響。
  • 如果你用Tableau做資料分析,也能設定前後期的日期參數,直接比較刪除前後的資料差異,像是銷售額的變化或成長率。

你可以利用這些工具,輕鬆追蹤SQL刪除前後的資料表變化,無論是用來稽核還是做趨勢分析都很方便。

進階刪除

JOIN刪除

你有時候會遇到需要根據多個表格的關聯來刪除資料。這時候,你可以用JOIN來幫忙。舉個例子,你有一個orders表和一個customers表。你想刪掉所有來自特定城市的客戶訂單,可以這樣寫:

DELETE o
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE c.city = 'Taipei';

這樣,只有住在台北的客戶訂單會被刪除。JOIN讓你可以根據不同表格的條件,精準找到要刪的資料。

小提醒:不是每個資料庫都支援JOIN刪除,像MySQL可以,SQL Server語法會不一樣。記得查一下你用的資料庫支援哪些語法。

子查詢

你也可以用子查詢來做條件刪除。假設你想刪掉所有沒有訂單的客戶,可以這樣寫:

DELETE FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);

這個指令會先找出所有有訂單的客戶,再把沒有出現在這個名單裡的客戶刪掉。子查詢讓你可以先篩選出一組資料,再根據這組資料來決定要刪哪些資料。

ON DELETE CASCADE

有時候,你刪掉一筆資料時,會希望相關的資料也自動被刪除。這時候你可以用ON DELETE CASCADE。舉個例子,你有一本書(Book),這本書有評論(Review)、價格優惠(PriceOffer)、作者(BookAuthor)等相關資料。當你刪掉這本書時,這些相關資料也會自動被刪除,不用你一筆一筆處理。

  • 你只要在資料表設計時,設定外鍵的刪除行為為CASCADE,資料庫就會自動幫你處理聯級刪除。
  • 如果你用EF Core開發,可以在OnModelCreating方法裡設定外鍵刪除規則,像是Restrict或Cascade。
  • 當你把規則設成Restrict,刪除有關聯資料的書籍時,資料庫會跳出錯誤,讓你知道不能直接刪除。
  • 你還可以根據實體間的必填(required)或選填(optional)關係,靈活調整刪除策略,避免循環刪除的問題。

 ON DELETE CASCADE讓你不用擔心資料遺漏或不一致,特別適合有多層關聯的資料表。你只要設好規則,資料庫就會自動幫你把相關資料一起清掉,省時又安全!

刪除安全

刪除安全
刪除安全

避免全刪

你在寫SQL刪除時,最怕的就是一不小心把整個表的資料都刪掉。只要漏掉WHERE條件,資料庫就會把所有資料清空。這種錯誤很常見,很多人都踩過這個坑。你可以這樣檢查:

  • 執行前,先看一下指令裡有沒有WHERE。
  • 如果你用的是圖形化工具,按下執行前再三確認。
  • 可以先用SELECT語法測試條件,確定只會影響你想刪的資料。

 小提醒:永遠不要直接執行沒有WHERE的SQL刪除,這樣很危險!

備份建議

你每次要刪資料前,最好先備份。這樣萬一刪錯,還有機會救回來。備份的方法有很多種:

  • 匯出整個資料表成CSV或SQL檔案。
  • 用資料庫內建的備份功能。
  • 複製一份資料表,做成暫存表。

你可以根據自己的需求選一種方式。只要有備份,就不用怕誤刪。

建議你把備份當成習慣,這樣資料才有保障。

不可逆操作

SQL刪除是一種不可逆的操作。你一旦執行,資料就真的不見了。資料庫不會自動幫你保留歷史紀錄。你如果沒有備份,想還原就很困難。你可以這樣做:

  • 執行前,先用SELECT查詢看看會刪掉哪些資料。
  • 如果資料很重要,請主管或同事再幫你檢查一次。
  • 執行後,馬上確認資料表內容,確保沒有多刪。

記住:SQL刪除不是回收筒,刪掉就沒辦法還原。每次操作都要小心!

指令比較

DELETE vs TRUNCATE

你常常會看到DELETE和TRUNCATE這兩個指令。它們都能刪除資料,但用法和效果不一樣。你可以參考下表:

指令刪除方式是否可加WHERE是否可回復速度
DELETE一筆一筆刪除可以有機會較慢
TRUNCATE整個表一次清空不行幾乎不能很快
  • 你想只刪部分資料,就用DELETE。
  • 你想把整個表清空,速度又要快,就選TRUNCATE。

 小提醒:TRUNCATE不能加WHERE,執行後資料很難救回來,要特別小心!

DELETE vs DROP

DROP和DELETE差更多。你用DELETE是刪資料,表格還在。你用DROP,整個表格都會被移除,連結構都不見。

  • DELETE:只刪資料,表格還能用。
  • DROP:連表格本身都刪掉,什麼都沒了。

 DROP很危險,除非你真的不再需要這個表,否則不要亂用!

Auto_Increment

你用DELETE刪資料時,Auto_Increment欄位(像自動編號)不會重設。新資料還是會接著原本的編號。TRUNCATE則會把Auto_Increment重設回1。

  • 你想保留編號順序,用DELETE。
  • 你想讓編號從頭開始,用TRUNCATE。

記住:DELETE不會影響Auto_Increment,TRUNCATE才會重設!

 

每次你要做SQL刪除,記得先檢查WHERE條件,還有備份資料。你可以多做幾次測試,熟悉語法,這樣操作起來會更安心。根據不同需求,選對刪除指令,才能避免資料無法還原的困擾。

小提醒:資料安全最重要,千萬別心急!

FAQ

我可以只刪除某一個欄位的資料嗎?

你沒辦法用 DELETE 只刪一個欄位。DELETE 會把整列刪掉。如果只想清空欄位,請用 UPDATE。

忘記加 WHERE,資料還救得回來嗎?

你如果沒備份,資料就救不回來。建議你平常一定要先備份,這樣才有機會還原。

DELETE 跟 TRUNCATE 哪個比較安全?

DELETE 比較安全。你可以加 WHERE 控制範圍。TRUNCATE 一次清空整個表,沒辦法選資料。

執行 DELETE 會影響 Auto_Increment 嗎?

你用 DELETE 刪資料,Auto_Increment 不會重設。新資料還是會接著原本的編號。

可以一次刪很多資料嗎?

你可以!只要 WHERE 條件符合多筆資料,DELETE 就會一次刪掉全部符合的資料。

帆軟產品免費試用

企業戰情室報表軟體

企業戰情室報表軟體

複雜報表/戰情室/資料填報/數位孿生

企業商業智慧BI軟體

企業商業智慧BI軟體

自助資料處理/Dashboard/探索分析

一站式資料整合平台

一站式資料整合平台

資料同步/ETL資料開發/API資料服務

免費資源下載

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

我們很樂意傾聽你的需求,解答您的疑問,並提供專業建議, 助力您的企業實現智慧轉型!

×

意見回饋

姓名

電郵

公司

國家/地區

-- select an option --

電話

投訴原因

請選擇投訴原因

代理商問題
產品問題
技術支援服務問題
專案問題
銷售問題
商務問題
行銷問題
其他

投訴內容