2.13 sql数据更新(UPDATE)

news2026/4/13 23:13:16
2.13 数据更新UPDATE在电商数据分析工作中你会遇到这些必须用UPDATE的场景批量修正错误数据如订单状态、商品价格、用户等级。运营活动结束后统一调整商品库存。根据用户行为数据更新用户标签如“高价值用户”标记。数据清洗时用标准值替换异常值。这一章我会带你彻底搞懂UPDATE语句的所有用法单字段更新、多字段更新、条件更新甚至关联多表更新。学完之后你不仅能安全地修正数据还能避免“忘加WHERE删库跑路”的惨剧。学习前准备已完成MySQL安装参考系列前几章。已安装DBeaver或Navicat。准备一个练习数据库比如update_demo。学习前环境准备快速回顾如果你已经完成了前面的教程可以跳过本节。否则按以下步骤快速搭建练习环境。步骤1确保MySQL服务已启动。步骤2创建练习数据库和表。CREATEDATABASEupdate_demoCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;USEupdate_demo;-- 商品表CREATETABLEproducts(product_idINTPRIMARYKEYAUTO_INCREMENT,product_nameVARCHAR(100)NOTNULL,priceDECIMAL(10,2)NOTNULL,stockINTNOTNULLDEFAULT0,statusTINYINTNOTNULLDEFAULT1COMMENT1上架,2下架);-- 订单表CREATETABLEorders(order_idVARCHAR(50)PRIMARYKEY,user_idINTNOTNULL,amountDECIMAL(10,2)NOTNULL,order_statusTINYINTNOTNULLDEFAULT1COMMENT1待支付,2已支付,3已取消,4已完成,logistics_statusVARCHAR(20)DEFAULT待发货);-- 用户表CREATETABLEusers(user_idINTPRIMARYKEY,user_nameVARCHAR(50),user_levelTINYINTDEFAULT1COMMENT1普通,2银卡,3金卡);-- 插入一些测试数据INSERTINTOproducts(product_name,price,stock)VALUES(连衣裙,299.00,100),(T恤,89.00,200),(牛仔裤,199.00,50);INSERTINTOorders(order_id,user_id,amount,order_status)VALUES(ORD001,1,299.00,2),(ORD002,2,89.00,1),(ORD003,1,199.00,2);INSERTINTOusers(user_id,user_name,user_level)VALUES(1,张小花,1),(2,李大明,1);UPDATE基础认知UPDATE是SQL中用于修改表中已有数据的语句。它是DML数据操纵语言的一部分。数据分析师在以下场景必须用到更新批量修正错误录入的数据。根据业务规则更新状态字段如订单状态、物流状态。数据清洗时将异常值替换为标准值。运营活动后调整商品库存或价格。基本语法UPDATE表名SET列名1新值1,列名2新值2,...WHERE条件;⚠️ 终身难忘的踩坑经历我入行第三个月需要修改一批订单的状态。我写了一句UPDATE orders SET order_status 2忘了加WHERE条件。执行后全表几万条订单全部变成了“已支付”。运营发现后我被领导叫去喝茶。幸亏有前一天的备份恢复了两个小时。从那以后我养成了先在WHERE里写条件再写UPDATE主体的习惯而且每次执行前必先SELECT确认范围。单字段更新与多字段同步更新4.1 单字段更新只修改某一列的值。基础语法UPDATE表名SET列名新值WHERE条件;电商实操案例将商品ID为1的连衣裙价格从299元调整为329元。UPDATEproductsSETprice329.00WHEREproduct_id1;分步操作先用SELECT确认要更新的行SELECT * FROM products WHERE product_id 1;执行UPDATE语句。再次SELECT验证价格已改变。预期结果product_id1的商品价格变为329.00。4.2 多字段同步更新同时修改多个列的值用逗号分隔。UPDATE表名SET列1值1,列2值2WHERE条件;电商实操案例将商品ID为2的T恤价格改为79元库存改为150。UPDATEproductsSETprice79.00,stock150WHEREproduct_id2;分步操作先SELECT查看原数据。执行多字段UPDATE。验证两个字段都变了。预期结果价格和库存同时更新。实操避坑提醒SET后面的多个列用逗号分隔不要用AND。我见过新手写成SET price 79.00 AND stock 150这是错误的语法。带WHERE条件的精准更新WHERE子句决定了哪些行会被更新。不加WHERE会更新全表这是最大的风险点。5.1 单条件更新电商实操将订单ORD002的状态从“待支付”改为“已取消”。UPDATEordersSETorder_status3WHEREorder_idORD002;5.2 多条件组合更新电商实操将所有已支付order_status2且物流状态为“待发货”的订单物流状态改为“已发货”。UPDATEordersSETlogistics_status已发货WHEREorder_status2ANDlogistics_status待发货;5.3 使用IN和BETWEEN更新电商实操批量更新多个指定订单的状态。UPDATEordersSETorder_status4WHEREorder_idIN(ORD001,ORD003);电商实操更新价格在100到200之间的商品库存统一增加10。UPDATEproductsSETstockstock10WHEREpriceBETWEEN100AND200;5.4 使用表达式更新电商实操所有商品价格打9折。UPDATEproductsSETpriceprice*0.9;注意这种操作通常需要配合WHERE限定范围否则全表价格都变了。5.5 安全操作黄金法则每次执行UPDATE前必须先用相同的WHERE条件执行SELECT确认影响行数正确。-- 第一步查看要更新的行SELECT*FROMproductsWHEREpriceBETWEEN100AND200;-- 第二步执行更新UPDATEproductsSETstockstock10WHEREpriceBETWEEN100AND200;-- 第三步验证更新结果SELECT*FROMproductsWHEREpriceBETWEEN100AND200;关联表更新多表更新有时需要根据另一张表的数据来更新当前表。MySQL支持两种关联更新语法。6.1 使用子查询更新电商实操根据用户表中的会员等级更新订单表中用户的会员等级字段假设订单表有冗余字段user_level但实际不推荐冗余仅作示例。-- 先给orders表加一个user_level列用于演示ALTERTABLEordersADDuser_levelTINYINTDEFAULT1;-- 用子查询更新UPDATEorders oSETo.user_level(SELECTu.user_levelFROMusers uWHEREu.user_ido.user_id)WHEREEXISTS(SELECT1FROMusers uWHEREu.user_ido.user_id);6.2 使用多表JOIN更新推荐电商实操根据用户等级给不同等级的用户订单打上不同的折扣标记示例在订单表增加discount_flag字段。-- 增加字段ALTERTABLEordersADDdiscount_flagVARCHAR(10)DEFAULT无折扣;-- 多表关联更新UPDATEorders oJOINusers uONo.user_idu.user_idSETo.discount_flagCASEWHENu.user_level3THEN金卡9折WHENu.user_level2THEN银卡95折ELSE无折扣END;分步操作先写SELECT验证关联关系SELECT o.order_id, u.user_level FROM orders o JOIN users u ON o.user_id u.user_id;将SELECT改为UPDATE并在SET中指定更新逻辑。执行后验证。预期结果订单表的discount_flag字段根据用户等级填充。6.3 电商场景实操根据退款单更新订单状态假设有退款表refunds当退款记录存在时需要将对应订单状态改为“已退款”。-- 创建退款表示例CREATETABLErefunds(refund_idINTPRIMARYKEYAUTO_INCREMENT,order_idVARCHAR(50),refund_amountDECIMAL(10,2));INSERTINTOrefunds(order_id,refund_amount)VALUES(ORD001,299.00);-- 关联更新订单状态UPDATEorders oJOINrefunds rONo.order_idr.order_idSETo.order_status5-- 假设5代表已退款WHEREo.order_statusNOTIN(5);我的踩坑经历第一次做多表关联更新时我忘了写WHERE条件导致所有订单的状态都被更新了。因为JOIN出来的结果集只包含有退款的订单但UPDATE没有WHERE时会更新所有行不匹配的行会被设为NULL实际上MySQL的多表UPDATE语法中如果没有WHERE只会更新JOIN匹配到的行不匹配的行不受影响。但为了明确意图最好还是加上WHERE条件。综合实操案例双11大促后批量数据修正7.1 案例背景双11大促结束后服饰类目店铺需要完成以下数据修正任务所有参与活动的商品库存减去实际销售量模拟。将物流状态为“待发货”且订单状态为“已支付”的订单批量更新为“已发货”。根据用户累计消费金额更新用户会员等级累计消费1000为金卡500为银卡。批量修正一批订单的收货地址模拟。7.2 准备工作创建必要的表和测试数据。-- 商品表已有增加一个sold字段表示销量ALTERTABLEproductsADDsoldINTDEFAULT0;-- 订单表增加累计消费金额字段实际应从订单聚合这里简化ALTERTABLEusersADDtotal_amountDECIMAL(10,2)DEFAULT0;-- 模拟一些数据UPDATEproductsSETsold30WHEREproduct_id1;UPDATEproductsSETsold50WHEREproduct_id2;UPDATEproductsSETsold20WHEREproduct_id3;UPDATEusersSETtotal_amount1200WHEREuser_id1;UPDATEusersSETtotal_amount300WHEREuser_id2;7.3 分步操作步骤1批量更新商品库存减去销量-- 先查看要更新的商品SELECTproduct_id,stock,soldFROMproducts;-- 更新库存UPDATEproductsSETstockstock-soldWHEREsold0;-- 验证SELECTproduct_id,stock,soldFROMproducts;预期结果库存减少对应的销量。步骤2批量更新物流状态-- 先查看符合条件的订单SELECTorder_id,order_status,logistics_statusFROMordersWHEREorder_status2ANDlogistics_status待发货;-- 更新UPDATEordersSETlogistics_status已发货WHEREorder_status2ANDlogistics_status待发货;步骤3根据累计消费更新用户等级-- 使用CASE WHEN批量更新UPDATEusersSETuser_levelCASEWHENtotal_amount1000THEN3WHENtotal_amount500THEN2ELSE1END;验证查询用户表确认等级已更新。步骤4批量修正订单地址模拟假设有一批订单需要修改收货地址可以用IN列表。-- 假设订单ORD001和ORD003地址有误UPDATEordersSETlogistics_status地址修正WHEREorder_idIN(ORD001,ORD003);7.4 完整脚本与验证所有更新操作执行完毕后使用SELECT验证每项任务的结果。-- 验证库存SELECTproduct_name,stockFROMproducts;-- 验证物流状态SELECTorder_id,logistics_statusFROMorders;-- 验证用户等级SELECTuser_name,total_amount,user_levelFROMusers;本章踩坑清单与合规总结8.1 新手常见踩坑错误后果正确做法忘记写WHERE全表数据被修改先写WHERE再写UPDATE先SELECT验证关联更新时JOIN条件写错更新了错误的数据先用SELECT测试关联结果更新时数据类型不匹配报错或隐式转换确保新值类型与列类型一致事务未提交在事务中执行未提交其他会话看不到执行COMMIT或设置自动提交更新前未备份出错无法恢复更新前CREATE TABLE backup LIKE 原表; INSERT INTO backup SELECT * FROM 原表;8.2 电商数据合规红线生产环境更新必须审批任何UPDATE操作尤其是批量更新需经业务负责人和DBA审批。敏感字段禁止批量更新如用户手机号、地址不得通过UPDATE批量修改应通过应用层逐条处理并记录日志。保留审计日志重要更新操作应记录到日志表update_log包括操作人、时间、影响行数、WHERE条件。使用事务对于多表关联更新或重要更新用START TRANSACTION、COMMIT、ROLLBACK保证原子性。STARTTRANSACTION;UPDATEproductsSETstockstock-soldWHEREsold0;UPDATEordersSETlogistics_status已发货WHEREorder_status2ANDlogistics_status待发货;-- 检查无误后提交COMMIT;-- 如有错误则回滚-- ROLLBACK;结语UPDATE是SQL中风险最高但也最实用的语句之一。掌握它你就能在数据出错时及时修正在业务变化时批量调整。但永远记住权限越大责任越大。每次更新前先SELECT再UPDATE最后验证。有问题的评论区留言我看到会回复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2514549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…