在数据库操作中,经常需要根据其他表的数据来更新当前表的内容,这时就需要用到多表关联更新语法。不同数据库对这类操作的语法支持差异较大,尤其是UPDATE FROM和UPDATE JOIN的使用规则各不相同,理解这些差异能有效减少开发中的语法错误。

MySQL数据库的多表更新写法
MySQL支持使用UPDATE JOIN语法实现多表关联更新,同时也可以通过逗号分隔多表的方式完成更新,不支持UPDATE FROM语法。
UPDATE JOIN写法
语法格式为UPDATE 主表 JOIN 关联表 ON 关联条件 SET 更新字段=值,示例如下:
-- 更新用户表中用户所属部门名称,关联部门表获取部门名称 UPDATE user u JOIN department d ON u.dept_id = d.id SET u.dept_name = d.dept_name WHERE d.status = 1;
多表逗号分隔写法
这种写法和JOIN写法效果一致,适合简单的关联场景:
UPDATE user u, department d SET u.dept_name = d.dept_name WHERE u.dept_id = d.id AND d.status = 1;
SQL Server数据库的多表更新写法
SQL Server支持UPDATE FROM语法,同时也可以通过JOIN结合FROM实现关联更新,不支持直接使用UPDATE JOIN的写法。
UPDATE FROM写法
语法格式为UPDATE 主表 SET 更新字段=值 FROM 主表 JOIN 关联表 ON 关联条件,示例如下:
-- 更新员工表中员工薪资,关联薪资等级表计算新薪资 UPDATE e SET e.salary = e.salary * s.rate FROM employee e JOIN salary_level s ON e.level_id = s.id WHERE s.level_name = '高级';
带别名的简化写法
可以给主表起别名放在UPDATE之后,简化语句书写:
UPDATE employee SET salary = salary * 1.2 FROM employee e JOIN salary_level s ON e.level_id = s.id WHERE s.level_name = '中级';
PostgreSQL数据库的多表更新写法
PostgreSQL支持UPDATE FROM语法,不支持UPDATE JOIN写法,关联表需要放在FROM子句中。
语法格式为UPDATE 主表 SET 更新字段=值 FROM 关联表 WHERE 关联条件,示例如下:
-- 更新订单表中订单金额,关联订单明细表计算总金额
UPDATE order_info o
SET total_amount = t.total
FROM (
SELECT order_id, SUM(price * quantity) AS total
FROM order_detail
GROUP BY order_id
) t
WHERE o.id = t.order_id;
Oracle数据库的多表更新写法
Oracle既不支持UPDATE FROM也不支持UPDATE JOIN语法,需要通过子查询或者MERGE语句实现多表关联更新。
子查询写法
适合更新字段较少的场景:
-- 更新产品表中产品价格,关联价格表获取最新价格
UPDATE product p
SET p.price = (
SELECT pr.new_price
FROM price pr
WHERE pr.product_id = p.id
)
WHERE EXISTS (
SELECT 1
FROM price pr
WHERE pr.product_id = p.id
);
MERGE语句写法
MERGE语句功能更强大,支持同时存在更新和插入的场景:
MERGE INTO product p
USING price pr
ON (p.id = pr.product_id)
WHEN MATCHED THEN
UPDATE SET p.price = pr.new_price;
不同数据库写法对比总结
以下是主流数据库对UPDATE FROM和UPDATE JOIN的支持情况对比:
| 数据库类型 | 支持UPDATE JOIN | 支持UPDATE FROM | 推荐写法 |
|---|---|---|---|
| MySQL | 是 | 否 | UPDATE JOIN 或 多表逗号分隔 |
| SQL Server | 否 | 是 | UPDATE FROM 结合 JOIN |
| PostgreSQL | 否 | 是 | UPDATE FROM 子句关联 |
| Oracle | 否 | 否 | 子查询 或 MERGE语句 |
注意事项
- 使用多表更新时,建议先通过SELECT语句验证关联条件和更新逻辑是否正确,避免误更新数据。
- MySQL的UPDATE JOIN写法中,如果不写WHERE条件,会更新所有匹配到的关联记录,需要谨慎操作。
- Oracle使用子查询更新时,如果子查询返回多行会报错,需要确保关联条件能唯一匹配记录。
UPDATE_FROMUPDATE_JOINSQL数据库多表更新修改时间:2026-06-24 17:15:32