想像一下你是資料庫管理員,要修改或刪除一些紀錄。但如果你不小心把全部都改掉或刪掉怎麼辦?用 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 來安全又可靠地更新和刪除資料了。這個工具就是你玩資料庫時最好的朋友。記住:寧可多檢查兩次條件,也不要事後才在那邊救資料!
GO TO FULL VERSION