2024-08-16|閱讀時間 ‧ 約 34 分鐘

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

    ※ 功能:

    刪除表格中的資料。

    ※ 語法:

    • 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 可以幫助我們避免一個歌單被一個不存在的使用者所擁有的矛盾情況。

    ※ 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 子句來篩選出我們想要刪除的那些記錄。

    解析順序:

    1. 指定刪除的表格:首先,DELETE 子句會查看我們指定要刪除資料的表格(例如 T1 和 T2)。
    2. 進行 JOIN 操作:接下來,INNER JOIN 會根據 ON 子句中的條件(例如 T1.key = T2.key)將表格合併。
    3. 篩選記錄:合併後的表格會通過 WHERE 子句進行篩選,以確定哪些記錄需要刪除。
    • 實例 - INNER JOIN:
    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 的歌單中的歌曲。

    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(刪掉沒有歌的歌單)
    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. 刪除這些沒有歌曲的歌單。
    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 表格中記錄的歌單。




    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.