跳到主要内容

SQL UPDATE 更新数据

UPDATE 语句用于修改表中已存在的数据。

基本语法

UPDATE 表名
SET1 = 新值1,2 = 新值2, ...
WHERE 条件;

重要:务必使用 WHERE 条件,否则会更新所有行!

演示表

假设有 users 表:

idnameemailagecountrysalary
1张三[email protected]25China5000
2李四[email protected]30USA7000
3王五[email protected]28China6000
4赵六[email protected]35USA8000
5孙七[email protected]25UK5500

更新示例

1. 更新单列

-- 将 id 为 1 的用户年龄改为 26
UPDATE users
SET age = 26
WHERE id = 1;

结果:

id=1 的用户 age 变为 26

2. 更新多列

-- 将 id 为 2 的用户年龄改为 31,薪资改为 7500
UPDATE users
SET age = 31, salary = 7500
WHERE id = 2;

3. 使用表达式

-- 给所有中国用户涨薪1000
UPDATE users
SET salary = salary + 1000
WHERE country = 'China';

4. 使用字符串函数

-- 将邮箱转换为大写
UPDATE users
SET email = UPPER(email);

-- 拼接字符串
UPDATE users
SET name = CONCAT(name, ' (VIP)')
WHERE salary > 7000;

5. 使用 WHERE 条件

-- 更新年龄大于30的用户
UPDATE users
SET country = 'Canada'
WHERE age > 30;

不使用 WHERE 的危险

-- 危险!会更新所有用户
UPDATE users SET salary = salary + 1000;

-- 正确写法
UPDATE users SET salary = salary + 1000 WHERE country = 'China';

复杂条件更新

AND / OR 条件

-- AND:同时满足
UPDATE users
SET salary = salary + 500
WHERE country = 'China' AND age > 25;

-- OR:满足任一
UPDATE users
SET age = age + 1
WHERE country = 'USA' OR country = 'UK';

BETWEEN / IN

-- BETWEEN 范围
UPDATE users
SET salary = salary * 1.1
WHERE salary BETWEEN 5000 AND 7000;

-- IN 列表
UPDATE users
SET country = 'China'
WHERE country IN ('USA', 'UK');

子查询

-- 将薪资低于平均值的用户涨薪10%
UPDATE users
SET salary = salary * 1.1
WHERE salary < (SELECT AVG(salary) FROM (SELECT salary FROM users) AS t);

注意:MySQL 中需要使用嵌套子查询。

常见错误

1. 忘记 WHERE

-- 错误:会导致所有数据被更新
UPDATE users SET age = 30;

2. 条件列类型不匹配

-- 错误:字符串需要加引号
UPDATE users SET country = China WHERE id = 1;
-- 正确
UPDATE users SET country = 'China' WHERE id = 1;

3. 更新违反约束

-- 错误:违反唯一约束
UPDATE users SET email = '[email protected]' WHERE id = 1;
-- [email protected] 已被 id=2 使用

PostgreSQL / SQLite 语法

RETURNING

PostgreSQL 和 SQLite 支持返回更新后的数据:

-- PostgreSQL
UPDATE users
SET salary = salary + 1000
WHERE country = 'China'
RETURNING *;

-- SQLite
UPDATE users
SET salary = salary + 1000
WHERE country = 'China'
RETURNING id, name, salary;

小结

本章我们学习了:

  1. UPDATE 基本语法
  2. 更新单列和多列
  3. 使用表达式和函数
  4. WHERE 条件的重要性

练习

  1. 将所有薪资低于5000的用户涨薪500
  2. 将中国用户的年龄都加1
  3. 给薪资最高的用户添加 "VIP" 标记
  4. 将 USA 用户的邮箱域名改为 newdomain.com