SQL UPDATE 更新数据
UPDATE 语句用于修改表中已存在的数据。
基本语法
UPDATE 表名
SET 列1 = 新值1, 列2 = 新值2, ...
WHERE 条件;
重要:务必使用 WHERE 条件,否则会更新所有行!
演示表
假设有 users 表:
| id | name | age | country | salary | |
|---|---|---|---|---|---|
| 1 | 张三 | [email protected] | 25 | China | 5000 |
| 2 | 李四 | [email protected] | 30 | USA | 7000 |
| 3 | 王五 | [email protected] | 28 | China | 6000 |
| 4 | 赵六 | [email protected] | 35 | USA | 8000 |
| 5 | 孙七 | [email protected] | 25 | UK | 5500 |
更新示例
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;
小结
本章我们学习了:
- UPDATE 基本语法
- 更新单列和多列
- 使用表达式和函数
- WHERE 条件的重要性
练习
- 将所有薪资低于5000的用户涨薪500
- 将中国用户的年龄都加1
- 给薪资最高的用户添加 "VIP" 标记
- 将 USA 用户的邮箱域名改为 newdomain.com