SQL語法修改資料庫 - DELETE(刪除)

閱讀時間約 10 分鐘

※ 功能:

刪除表格中的資料。

※ 語法:

  • DELETE
  • ON DELETE CASCADE
  • DELETE JOIN

DELETE

• 語法

DELETE FROM table_name
WHERE condition
  1. FROM 後面接上表格的名字:這是想要刪除資料的表格。
  2. WHERE 子句:這部分用來篩選出想要刪除的記錄。就像 SELECT 語句一樣,WHERE子句用來指定條件。
  3. 篩選出來的記錄會被 DELETE 語句刪除。

實例 - 刪除⼀⾸歌:

假設你有一個名為 songs 的表格,表格中有一個 title 欄位儲存歌曲的名稱。如果你想要刪除名為 “My Favorite Song” 的歌曲,可以這樣寫:

DELETE FROM songs
WHERE title = 'My Favorite Song';

這樣就會刪除 songs 表格中 title 為 “My Favorite Song” 的那一行資料。請注意,刪除操作是不可逆的,所以在執行前請確保你真的想要刪除這些資料。

  • 實例 - 按照順序刪除三⾸歌:

假設你有一個名為 songs 的表格,表格中有一個 title 欄位儲存歌曲的名稱。如果你想要按照順序刪除前三首歌 。在 MySQL 中,你可以使用 ORDER BY 和LIMIT  子句來控制刪除的順序和數量:

-- 查詢前三首歌
SELECT song_name
FROM songs
ORDER BY song_name
LIMIT 3;

-- 刪除前三首歌
DELETE FROM songs
ORDER BY song_name
LIMIT 3;

在 SQLite 中,DELETE 語句不支援 ORDER BY 和 LIMIT 子句,你可以使用SUB-QUERY REVISIT(子查詢重訪):

先使用子查詢選出按 song_name 排序的前三首歌,然後在主查詢中利用 IN 子句來刪除這些記錄。

過程:

  1. 使用子查詢 (SUB-QUERY REVISIT) 選出按 song_name 排序的前三首歌。
  2. 在主查詢中使用 IN 子句來篩選出這些記錄。
  3. 刪除篩選出的記錄。
DELETE FROM songs
WHERE song_name IN (
SELECT song_name
FROM songs
ORDER BY song_name
LIMIT 3
);

※ ON DELETE CASCADE(刪除時級聯

定義:

是一個在 SQL 中用於外鍵(foreign key)約束的選項。當父表中的一行被刪除時,子表中所有參照該行的記錄也會自動被刪除。這樣可以確保數據的一致性,避免子表中出現孤立的記錄。

簡單來說,ON DELETE CASCADE 確保了當父表的資料被刪除時,子表中相關的資料也會同步被刪除;也就是一個指令就可以把所有相關的資料刪除乾淨。

實例 - 用USER和LIST來解說ON DELETE CASCADE如何使用:

當每個歌單(list)都由一個使用者(user)所擁有時,list 表格中的 user_id 欄位是外鍵(foreign key),參考 user 表格中的 user_id。假設我們刪除了 user 表格中 user_id = 0 的資料,會導致一個矛盾:歌單應該由一個使用者擁有,但 user_id = 0 已經被刪除,這樣會留下無效的歌單記錄。 為了解決這個問題,SQL 提供了 ON DELETE CASCADE 選項。這不是一個指令,而是一個外鍵的選項。當我們在創建表格時,為外鍵加上 ON DELETE CASCADE,意思是當 user 表格中 user_id = 0 被刪除時,list 表格中所有參考到 user_id = 0 的記錄也會被自動刪除。 這樣可以確保資料刪除的乾淨,不會留下無效的記錄。例如,當 user_id = 0 被刪除時,list_id = 0, 1, 2 的三個歌單也會被一併刪除ON DELETE CASCADE 可以幫助我們避免一個歌單被一個不存在的使用者所擁有的矛盾情況。

raw-image

※ DELETE JOIN(刪除聯接

  • 定義:

在SQL 中想要一次刪除多個表格內的資料,就需要使用 DELETE JOIN

  • 注意事項:

SQLite的資料庫並沒有支援DELETE JOIN這個語法。所以我們會使用My SQL來當例子。

• 語法

使用My SQL語法:

DELETE T1 , T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition

語法解析:

  • DELETE T1, T2 指定了我們想要刪除的資料來自於哪些表格。
  • INNER JOIN 的左邊是 left table(在這裡是 T1),右邊是 right table(在這裡是 T2)。
  • ON 子句指定了合併的條件(在這裡是 T1.key = T2.key)。
  • 合併完表格之後,我們使用 WHERE 子句來篩選出我們想要刪除的那些記錄。

解析順序:

raw-image
  1. 指定刪除的表格:首先,DELETE 子句會查看我們指定要刪除資料的表格(例如 T1 和 T2)。
  2. 進行 JOIN 操作:接下來,INNER JOIN 會根據 ON 子句中的條件(例如 T1.key = T2.key)將表格合併。
  3. 篩選記錄:合併後的表格會通過 WHERE 子句進行篩選,以確定哪些記錄需要刪除。
  • 實例 - INNER JOIN:
raw-image
SELECT * //選取所有欄位。
FROM list //指定從 list 表格中選取資料。
INNER JOIN song //使用 INNER JOIN 將 list 表格與 song 表格合併。
ON list.list_id = song.list_id //合併條件是 list 和 song 表格中的 list_id 必須相同。
WHERE list.list_id = 0 //過濾結果,只顯示 list_id 為 0 的記錄。

將 list 和 song 兩個表格的資料合併,使用的是 INNER JOIN。合併的條件是兩個表格中的 list_id 必須相同。查詢結果會過濾,只顯示 list.list_id 為 0 的記錄。

這意味著結果會顯示所有屬於 list_id = 0 的歌單中的歌曲。結果的左邊會顯示 list 表格的欄位,右邊會顯示 song 表格的欄位。這個合併結果幫助我們預覽將要刪除的資料,顯示所有屬於 list_id = 0 的歌單中的歌曲。

raw-image
DELETE list, song //會刪除 list 和 song 表格中所有 list_id 為 0 的記錄。
FROM list INNER JOIN song //將 list 和 song 表格合併。
ON list.list_id = song.list_id //合併條件是 list_id 必須相同。
WHERE list.list_id = 0 //過濾條件是只刪除 list_id 為 0 的記錄。
//查詢會刪除 list 和 song 表格中 list_id 為 0 的所有記錄。
SELECT * FROM list WHERE list_id = 0
SELECT * FROM song WHERE list_id = 0
  1. 在 DELETE 後面寫上 list 和 song,因為我們要刪除這兩個表格中的資料。
  2. 下半部分與 SELECT 查詢類似,使用 FROMINNER JOIN 和 ON 指定合併條件。
  3. 使用 WHERE 條件篩選出要刪除的 list_id

最後,我們可以使用 SELECT 查詢來檢視刪除後的結果。

  • 實例 - LEFT JOIN(刪掉沒有歌的歌單)
raw-image
SELECT * //選取所有欄位。

FROM list //指定從 list 表格中選取資料。

Left JOIN song //將 list 表格與 song 表格合併。

ON list.list_id = song.list_id //合併條件是 list 和 song 表格中的 list_id 必須相同。

WHERE song.song_id IS NULL //過濾條件是 song_id 為空值(NULL)。
  1. 使用 LEFT JOIN 將 list 和 song 表格合併,合併條件是 list_id 必須相同。
  2. 檢查 song 表格中的 song_id 欄位是否為空值(NULL)。如果是空值,表示該歌單中沒有歌曲。
  3. 使用 SELECT 查詢來檢視結果,確認哪些歌單中沒有歌曲。
  4. 刪除這些沒有歌曲的歌單。
raw-image
DELETE list //刪除 list 表格中的記錄。
FROM list //指定從 list 表格中刪除資料。
LEFT JOIN song //使用 LEFT JOIN 將 list 表格與 song 表格合併。
ON list.list_id = song.list_id //合併條件是 list 和 song 表格中的 list_id 必須相同。
WHERE song.song_id IS NULL //過濾條件是 song_id 為空值(NULL),表示該歌單中沒有歌曲。

SELECT * //選取所有欄位。
FROM list //指定從 list 表格中選取資料。
LEFT JOIN song //使用 LEFT JOIN 將 list 表格與 song 表格合併。
ON list.list_id = song.list_id //合併條件是 list 和 song 表格中的 list_id 必須相同。
WHERE song.song_id IS NULL //過濾條件是 song_id 為空值(NULL),表示該歌單中沒有歌曲。
  1. 刪除沒有歌曲的歌單:
    • 這段程式碼只會刪除 list 表格中的資料,不會刪除 song 表格中的資料。
    • 使用 DELETE list 指定要刪除 list 表格中的資料。
    • 利用 LEFT JOIN 和 WHERE 檢查 song 表格中的欄位是否為空值(NULL)。如果是空值,表示該歌單中沒有歌曲。
    • 找出沒有歌曲的歌單後,進行刪除。
  2. 查詢沒有歌曲的歌單:
    • 使用 SELECT 查詢來檢視結果,確認哪些歌單中沒有歌曲。
    • 這段程式碼會顯示 list 表格中所有沒有對應 song 表格中記錄的歌單。




    全端網頁開發專業知識分享
    留言0
    查看全部
    發表第一個留言支持創作者!
    ※ 為什麼我們需要 Transaction? 當我們談到 Transaction(交易)時,指的是一組不可分割的 SQL 操作。這些操作結果只能成功或失敗,以確保資料庫的一致性和完整性。Transaction 是資料庫操作中的一個「邏輯單位」,包含多個操作步驟。如果其中任何一個步驟失敗,整個 Tr
    已經存在在table裡面的那些record做更新。 ※ 語法 UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, … [WHERE
    ※ 把record加到table有兩種方式: VALUES • SELECT ※ 語法 INSERT INTO VALUES 語法: Record 代表一組值的集合,每個值對應到表格中的一個欄位(column)。 INSERT INTO 語法用來指定要插入資料的表格。 需要提供一個
    ※ CTE是什麼? 在 SQL 中,我們經常需要從多個表中提取數據,因此會使用子查詢 (subquery)。為了讓子查詢更易讀並實現遞迴查詢,我們可以使用 Common Table Expression (CTE)。 CTE 是一個「暫存」且「具名」的結果集合,透過 AS 關鍵字將查詢結果暫時儲
    ※ 為什麼需要 Subquery? 當⼀個任務需要多個 Query 完成任務,可以使⽤ Subquery 把多個 Query 合併成⼀個 Query。 當我們在進行SQL查詢時,每次查詢都需要在Web Server和資料庫之間來回傳遞資料。這個過程會產生網路延遲,特別是當兩者之間的物理距離較遠時
    ※ 何時該使用 JOIN? JOIN 使用的時機是:當你需要同時查詢一張以上的資料表的時候。 ※ SQL有哪些TABLE JOIN的方式? INNER JOIN LEFT JOIN RIGHT JOIN SELF JOIN ※ 使用 JOIN 的時候,我們需要考慮到: 我要使用哪一種
    ※ 為什麼我們需要 Transaction? 當我們談到 Transaction(交易)時,指的是一組不可分割的 SQL 操作。這些操作結果只能成功或失敗,以確保資料庫的一致性和完整性。Transaction 是資料庫操作中的一個「邏輯單位」,包含多個操作步驟。如果其中任何一個步驟失敗,整個 Tr
    已經存在在table裡面的那些record做更新。 ※ 語法 UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, … [WHERE
    ※ 把record加到table有兩種方式: VALUES • SELECT ※ 語法 INSERT INTO VALUES 語法: Record 代表一組值的集合,每個值對應到表格中的一個欄位(column)。 INSERT INTO 語法用來指定要插入資料的表格。 需要提供一個
    ※ CTE是什麼? 在 SQL 中,我們經常需要從多個表中提取數據,因此會使用子查詢 (subquery)。為了讓子查詢更易讀並實現遞迴查詢,我們可以使用 Common Table Expression (CTE)。 CTE 是一個「暫存」且「具名」的結果集合,透過 AS 關鍵字將查詢結果暫時儲
    ※ 為什麼需要 Subquery? 當⼀個任務需要多個 Query 完成任務,可以使⽤ Subquery 把多個 Query 合併成⼀個 Query。 當我們在進行SQL查詢時,每次查詢都需要在Web Server和資料庫之間來回傳遞資料。這個過程會產生網路延遲,特別是當兩者之間的物理距離較遠時
    ※ 何時該使用 JOIN? JOIN 使用的時機是:當你需要同時查詢一張以上的資料表的時候。 ※ SQL有哪些TABLE JOIN的方式? INNER JOIN LEFT JOIN RIGHT JOIN SELF JOIN ※ 使用 JOIN 的時候,我們需要考慮到: 我要使用哪一種
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    已經存在在table裡面的那些record做更新。 ※ 語法 UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, … [WHERE
    Thumbnail
    ※ 把record加到table有兩種方式: VALUES • SELECT ※ 語法 INSERT INTO VALUES 語法: Record 代表一組值的集合,每個值對應到表格中的一個欄位(column)。 INSERT INTO 語法用來指定要插入資料的表格。 需要提供一個
    Thumbnail
    ※ 別名: 目的在於提高SQL查詢的可讀性和簡潔性。 ※ 別名有兩種: Column Alias(列別名):在查詢結果中的某一列,取一個臨時的新名字。 Table Alias(表別名):給查詢中的表取一個短暫的新名字。 ※ Column Alias ※ 為什麼需要 Column A
    Thumbnail
    ※ 什麼是WHERE? 使用 WHERE來設定條件,可以幫助我們縮小查詢結果的範圍,取得想要的結果。 ※ 語法: ※ 解析順序: From:先看是哪一張table→table裡面符合Where指定條件的record→再看Select指定的是那些欄位→再根據那個欄位進行排序。 ※ 使⽤⽅
    Thumbnail
    ※ 語法 SELECT select_list FROM table_name​ ※ 解析順序 From:從哪裡拿? SELECT:要 "拿什麼" 資料? ※ 使用場景: Single column(單一欄位): Multiple column(多個欄位): All colu
    Thumbnail
    這篇文章主要是介紹了SQL查詢效能調校的方法,針對索引最佳化做了整理和分享,並提供了一些注意事項和建議。
    Thumbnail
    本文介紹瞭如何使用BAT腳本和CMD指令來自動執行檔案和空目錄的刪除作業。通過設定各種參數和指令,可以快速、有效地執行定期刪除作業,節省硬體空間並提升工作效率。
    Thumbnail
    工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
    Thumbnail
    ※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    已經存在在table裡面的那些record做更新。 ※ 語法 UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, … [WHERE
    Thumbnail
    ※ 把record加到table有兩種方式: VALUES • SELECT ※ 語法 INSERT INTO VALUES 語法: Record 代表一組值的集合,每個值對應到表格中的一個欄位(column)。 INSERT INTO 語法用來指定要插入資料的表格。 需要提供一個
    Thumbnail
    ※ 別名: 目的在於提高SQL查詢的可讀性和簡潔性。 ※ 別名有兩種: Column Alias(列別名):在查詢結果中的某一列,取一個臨時的新名字。 Table Alias(表別名):給查詢中的表取一個短暫的新名字。 ※ Column Alias ※ 為什麼需要 Column A
    Thumbnail
    ※ 什麼是WHERE? 使用 WHERE來設定條件,可以幫助我們縮小查詢結果的範圍,取得想要的結果。 ※ 語法: ※ 解析順序: From:先看是哪一張table→table裡面符合Where指定條件的record→再看Select指定的是那些欄位→再根據那個欄位進行排序。 ※ 使⽤⽅
    Thumbnail
    ※ 語法 SELECT select_list FROM table_name​ ※ 解析順序 From:從哪裡拿? SELECT:要 "拿什麼" 資料? ※ 使用場景: Single column(單一欄位): Multiple column(多個欄位): All colu
    Thumbnail
    這篇文章主要是介紹了SQL查詢效能調校的方法,針對索引最佳化做了整理和分享,並提供了一些注意事項和建議。
    Thumbnail
    本文介紹瞭如何使用BAT腳本和CMD指令來自動執行檔案和空目錄的刪除作業。通過設定各種參數和指令,可以快速、有效地執行定期刪除作業,節省硬體空間並提升工作效率。
    Thumbnail
    工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
    Thumbnail
    ※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為