CodeGym /课程 /SQL SELF /使用 WHERE 在更新和删除数据时

使用 WHERE 在更新和删除数据时

SQL SELF
第 21 级 , 课程 4
可用

想象一下你是数据库管理员,需要修改或删除一些记录。但如果你不小心把所有都更新或删掉了怎么办?用 WHERE 操作符就像是你的“保险”,能防止灾难性失误。它能让你精确指定哪些行会被操作。

比如:

UPDATE students
SET status = '毕业';
这个语句会更新 所有行 在表 students。想象一下,如果你本来想祝贺毕业,结果一不小心把大家的 status = '开除',是不是很危险?为了避免这种事,我们总是用 WHERE 来指定 条件,决定哪些行要被更新或删除。

WHERE 条件的语法

WHERE 用来过滤要操作的行。你可以在 UPDATEDELETE 语句里用它。语法长这样:

对于 UPDATE

UPDATE 表名
SET column1 = value1, column2 = value2
WHERE 条件;

对于 DELETE

DELETE FROM 表名
WHERE 条件;

没有 WHERE 的话,所有行都会被影响。所以一定要加条件,别误操作到不该动的数据。

比较操作符的用法

WHERE 条件时会用到比较操作符。常见的有这些:

操作符 说明 例子
= 等于 age = 18
<> 不等于 age <> 18
> 大于 age > 18
< 小于 age < 18
>= 大于等于 age >= 18
<= 小于等于 age <= 18

例子:更新学生状态

如果你想把所有大于21岁的学生标记为“毕业”,可以这样写:

UPDATE students
SET status = '毕业'
WHERE age > 21;

例子:删除所有小于18岁的学生

如果有人误录了未成年学生,可以这样删掉:

DELETE FROM students
WHERE age < 18;

用逻辑操作符写复杂条件

有时候你得按多个条件过滤,比如只更新那些大于18岁而且在学编程的学生。可以用逻辑操作符:ANDORNOT

逻辑操作符:

操作符 说明 例子
AND 只有所有条件都成立才执行 age > 18 AND course = 'Programming'
OR 只要有一个条件成立就执行 age > 18 OR course = 'Programming'
NOT 取反(条件结果反过来) NOT (age < 18)

例子:只更新大于18岁的编程学生

UPDATE students
SET status = '进阶'
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;

确认选出来的数据没问题,再执行 UPDATEDELETE

实战例子

例子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:删除被开除的学生

现在假设有些学生学的是要被删掉的课程,比如“艺术史”。表格如下:

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

执行没有 WHEREUPDATE 后:

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,会影响到不该动的数据。
  • 复杂条件: 逻辑优先级(ANDOR)没搞清楚,结果出乎意料。用括号让逻辑更清楚:
    DELETE FROM students
    WHERE (age > 18 AND course = 'Programming') OR course = 'Mathematics';
    

写 SQL 时尽量让语句自己和同事都能一眼看懂。

现在你已经知道怎么用 WHERE 安全可靠地更新和删除数据了。这个工具就是你玩数据库时最靠谱的朋友。记住:多检查条件,别等出事了才后悔!

1
调查/小测验
插入和更新数据第 21 级,课程 4
不可用
插入和更新数据
插入和更新数据
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION