当前位置: 首页 > ds >正文

SQL 使用 UPDATE FROM 语法进行更新

UPDATE FROM 是一种常见的 SQL 语法模式,允许你基于其他表的数据来更新目标表。这种语法在不同数据库系统中有所不同,下面我将介绍几种主要数据库的实现方式。


PostgreSQL/SQL Server 语法

UPDATE target_table
SET target_column = source_table.source_column
FROM source_table
WHERE target_table.join_key = source_table.join_key
AND source_table.condition = true;

示例

-- 更新员工工资为对应部门平均工资的110%
UPDATE employees e
SET salary = d.avg_salary * 1.10
FROM (SELECT department_id, AVG(salary) as avg_salary FROM employees GROUP BY department_id
) d
WHERE e.department_id = d.department_id;

MySQL 语法

UPDATE target_table t
JOIN source_table s ON t.join_key = s.join_key
SET t.target_column = s.source_column
WHERE s.condition = true;

示例

-- 更新产品价格为供应商建议价格的95%
UPDATE products p
JOIN suppliers s ON p.supplier_id = s.supplier_id
SET p.price = s.suggested_price * 0.95
WHERE s.is_preferred = 1;

Oracle 语法

UPDATE (SELECT t.target_column, s.source_columnFROM target_table t, source_table sWHERE t.join_key = s.join_keyAND s.condition = true
)
SET target_column = source_column;

示例

-- 更新客户等级基于最近订单金额
UPDATE (SELECT c.customer_level, o.order_totalFROM customers c, orders oWHERE c.customer_id = o.customer_idAND o.order_date > ADD_MONTHS(SYSDATE, -3)
)
SET customer_level = CASE WHEN order_total > 1000 THEN 'GOLD'WHEN order_total > 500 THEN 'SILVER'ELSE 'STANDARD'END;

SQLite 语法

UPDATE target_table
SET target_column = (SELECT source_column FROM source_table WHERE join_condition
)
WHERE exists_condition;

示例

-- 更新库存数量为最新进货记录的数量
UPDATE inventory
SET quantity = (SELECT quantity FROM latest_deliveriesWHERE inventory.product_id = latest_deliveries.product_id
)
WHERE EXISTS (SELECT 1 FROM latest_deliveriesWHERE inventory.product_id = latest_deliveries.product_id
);

注意事项

  1. 在执行更新前,先用 SELECT 验证你的 JOIN 条件是否正确

  2. 大量数据更新时考虑添加事务和分批处理

  3. 不同数据库系统的语法可能有差异

  4. 更新操作通常不可逆,建议先备份数据

http://www.xdnf.cn/news/873.html

相关文章:

  • C++回溯算法详解
  • 在线查看【免费】vsd, vsdx/wmf, emf /psd, eps/pdf ,ofd, rtf/xmind/bpmn/eml/epub文件格式网
  • Elasticsearch插件:IDEA中的Elasticsearch开发利器
  • 【Unity笔记】Unity音视频播放监听器封装笔记:VideoPlayer + AudioSource事件触发与编辑器扩展
  • leetcode:LCP 01. 猜数字(python3解法)
  • 并发设计模式之双缓冲系统
  • 10天学会嵌入式技术之51单片机-day-4
  • 安装WSL2.0
  • LX4-数据手册相关
  • 一个很简单的机器学习任务
  • 我用deepseek做了一个提取压缩文件夹下pdf和word文件工具
  • 解决 Ubuntu 下 VTune 无法收集 CPU 硬件时间计数数据的问题
  • Android Kotlin+Compose首个应用
  • 服务器在国外国内用户访问慢会影响谷歌排名吗?
  • Python 写一个带参数的EXE函数
  • SystemVerilog语法之内建数据类型
  • 数字IC后端PR阶段Innovus,ICC,ICC2修复short万能脚本分享
  • 20.3 使用技巧9
  • Linux:权限相关问题
  • 实验六- Linux网络管理
  • 【MySQL】MySQL中的数据类型详解
  • 【React】获取元素距离页面顶部的距离
  • Spark(20)spark和Hadoop的区别
  • 数据赋能(203)——原则与原理——原则方法
  • 应用层核心协议详解:HTTP, HTTPS, RPC 与 Nginx
  • 健康养生,开启新生活
  • 随机深林算法是分类还是回归?
  • Selenium的ActionChains:自动化Web交互的强大工具
  • 棉花糖实验新解
  • 《数据结构之美--双向链表》