CodeGym /課程 /SQL SELF /使用 WHERE 來更新和刪除資料

使用 WHERE 來更新和刪除資料

SQL SELF
等級 21, 課堂 4
開放

想像一下你是資料庫管理員,要修改或刪除一些紀錄。但如果你不小心把全部都改掉或刪掉怎麼辦?用 WHERE 就像是你的「保險」,可以防止災難性錯誤。它讓你精確指定哪些資料列要被影響。

舉個例子:

UPDATE students
SET status = 'Graduated';
這個查詢會更新 所有資料列 在 students 這張表。想像一下,如果你本來是要恭喜畢業,結果一不小心把大家的 status = 'Expelled',是不是很可怕?為了避免這種事,我們一定要用 WHERE 來指定 條件,決定哪些資料列要被更新或刪除。

WHERE 條件語法

WHERE 是用來過濾要被運算子的資料列。你可以在 UPDATE 或 DELETE 指令裡用它。語法長這樣:

對 UPDATE 來說:

UPDATE 表格
SET 欄位1 = 值1, 欄位2 = 值2
WHERE 條件;

對 DELETE 來說:

DELETE FROM 表格
WHERE 條件;

如果沒寫 WHERE,所有資料列都會被影響。所以一定要記得加條件,才不會動到你不想動的資料。

比較運算子的用法

在 WHERE 裡面會用到比較運算子。來看看常用的有哪些:

運算子 說明 範例
= 等於 age = 18
<> 不等於 age <> 18
> 大於 age > 18
< 小於 age < 18
>= 大於等於 age >= 18
<= 小於等於 age <= 18

範例:更新學生狀態

如果你要把所有超過 21 歲的學生標記成「畢業生」,可以這樣寫:

UPDATE students
SET status = 'Graduated'
WHERE age > 21;

範例:刪除所有未滿 18 歲的學生

如果有人不小心把未成年學生加進來,可以這樣刪掉:

DELETE FROM students
WHERE age < 18;

用邏輯運算子寫複雜條件

有時候你會想根據多個條件過濾資料列。比如只更新那些年齡超過 18 歲而且在學程式設計課的學生。這時就要用到邏輯運算子:AND、OR 跟 NOT。

邏輯運算子:

運算子 說明 範例
AND 只有 所有條件 都成立才會執行 age > 18 AND course = 'Programming'
OR 只要 有一個條件 成立就會執行 age > 18 OR course = 'Programming'
NOT 反向(把條件結果顛倒) NOT (age < 18)

範例:只更新超過 18 歲的程式設計學生

UPDATE students
SET status = 'Advanced'
WHERE age > 18 AND course = 'Programming';

範例:刪除所有未滿 18 歲或在「唱歌」課的學生

DELETE FROM students
WHERE age < 18 OR course = 'Singing';

怎麼避免災難性錯誤

每次執行前都要檢查條件!

如果你寫了沒有 WHERE 的查詢,PostgreSQL 會很開心地把 所有資料列 都處理掉。像這樣:

DELETE FROM students;
-- 哎呀!students 表裡的所有紀錄都被刪掉了!

為了避免這種事,記得加上 WHERE:

DELETE FROM students
WHERE student_id = 123;

小建議:如果你不確定條件會影響哪些資料,先用 SELECT 查查看。例如:

SELECT * FROM students
WHERE student_id = 123;

等你確定選出來的資料沒問題,再執行 UPDATE 或 DELETE。

實戰範例

範例 1:更新學生狀態

假設我們有一張 students 表:

student_id name age course status
1 Otto Lin 20 Programming Beginner
2 Maria Chi 22 Mathematics Graduated
3 Eva Gram 19 Programming Beginner

我們想把所有超過 18 歲的程式設計學生標記成「Intermediate」:

UPDATE students
SET status = 'Intermediate'
WHERE age > 18 AND course = 'Programming';

結果:

student_id name age course status
1 Otto Lin 20 Programming Intermediate
2 Maria Chi 22 Mathematics Graduated
3 Eva Gram 19 Programming Beginner

範例 2:刪除被退學的學生

現在假設有些學生修了要被刪除的課,比如「History of Arts」。表格如下:

student_id name age course status
1 Otto Lin 20 Programming Intermediate
4 Alex Ming 21 History of Arts Expelled

刪除修「History of Arts」課的學生:

DELETE FROM students
WHERE course = 'History of Arts';
student_id name age course status
1 Otto Lin 20 Programming Intermediate

範例 3:沒加條件的更新(這樣很危險)

如果你寫:

UPDATE students
SET status = '畢業生';

所有 學生都會變成畢業生。所以真的很建議每次都加 WHERE!

假設原本表格長這樣:

student_id name age course status
1 Otto Lin 20 Programming Intermediate
2 Maria Chi 22 Mathematics Graduated
3 Eva Gram 19 Programming Beginner

執行沒加 WHERE 的 UPDATE 之後:

student_id name age course status
1 Otto Lin 20 Programming 畢業生
2 Maria Chi 22 Mathematics 畢業生
3 Eva Gram 19 Programming 畢業生

😬 看到沒?全部狀態都被改掉了。這種錯誤有時候是救不回來的,尤其沒備份的時候。所以 WHERE 絕對是你的好朋友!

小細節和陷阱

雖然 WHERE 超級好用,但新手很常犯這些錯:

  • 沒加條件: 忘記寫 WHERE,結果所有資料列都被動到。
  • 條件寫錯: 比如你寫 age = 19,其實應該是 age < 19,這樣就會影響到不該動的資料。
  • 複雜條件: 邏輯運算子(AND 跟 OR)優先順序搞錯,結果出乎意料。建議用括號讓條件更清楚:
    DELETE FROM students
    WHERE (age > 18 AND course = 'Programming') OR course = 'Mathematics';
    

寫查詢的時候,盡量讓自己和同事都能一看就懂。

現在你已經知道怎麼用 WHERE 來安全又可靠地更新和刪除資料了。這個工具就是你玩資料庫時最好的朋友。記住:寧可多檢查兩次條件,也不要事後才在那邊救資料!

2
任務
SQL SELF, 等級 21, 課堂 4
上鎖
多條件更新
多條件更新
1
問卷/小測驗
插入與更新資料,等級 21,課堂 4
未開放
插入與更新資料
插入與更新資料
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION