MySQL 更新数据 不同条件(批量)更新不同值

一般在更新时会遇到以下场景:1.全部更新;2.根据条件更新字段中的某部分内容;3.根据不同的条件更新不同的值,以下是几种场景中常用的update方法。

一、方法分类

更新数据方法分类

二、具体用法

(1)根据条件更新值

  • 根据指定条件更新(多列)(全部更新)

把表中 [符合条件的行的] 列名1字段中的值全部修改为值1 [,列名2字段中的值修改为值2]。

update 表名 
set 列名1 = 值1 [,列名2=值2]
[where 条件];
  • 替换指定值(多列)(部分更新)

把表中 [符合条件的行的] 列名1字段中的查找内容全部修改为替换内容 [,列名2字段中的查找内容全部修改为替换内容]。

update 表名 
set 列名1 = replace(列名1, '查找内容', '替换内容') [,列名2 = replace(列名2, '查找内容', '替换内容')] 
[where 条件];

(2)按照不同条件(批量)更新不同值

  • 使用 if

把表中 [符合条件的行的] 列名1字段中符合条件1的内容修改为值1,否则修改为值2 [,列名2字段中符合条件2的内容修改为值3,否则修改为值4]。

update table 
set 
	列名1 = if(条件1,值1,值2),
    列名2 = if(条件2,值3,值4)
[where 条件];
  • 使用 case when

把表中 [符合条件的行的] 列名1字段中符合条件1的内容修改为值1 [,符合条件2的修改为值2,...] [,列名2字段中符合条件21的内容修改为值21,符合条件22的修改为值22,...] 。

update table 
set 列名1 =
    case
        when 条件1 then 值1
        when 条件2 then 值2
        when 条件3 then 值3
        ...
    end,
    列名2 =
    case
        when 条件21 then 值21
        when 条件22 then 值22
        when 条件23 then 值23
        ...
    end
[where 条件];

三、实例

students 表 (id表示主键,name是姓名,score是平均成绩)

id name score
1 李明 99
2 张三 74
3 孙华 59

(1)根据条件更新值

  • 把 students 表中 name 为张三的 score 字段的值全部修改为100。
#使用where
update students 
set score = 100
where name = '张三';
id name score
1 李明 99
2 张三 100
3 孙华 59
  • 把 students 表中 id 大于等于2的所有行中 score 中59的部分全部修改为0,name 中三的部分全部修改为四。
#使用replace
update students 
set score = replace(score,59,0),
	name = replace(name,'三','四')
where id >= 2;

注意:张三替换之后是张四,并不是只有字段等于三时才能替换。

id name score
1 李明 99
2 张四 74
3 孙华 0

(2)按照不同条件更新不同值

  • 请把students表中score小于60的score字段全部改为0,否则改为100,name字段中的名字改为不及格,否则改为及格。
#批量更新多值 + if
update students 
set 
    score = if(score < 60,0,100),
    name = if(score < 60,'不及格','及格');
id name score
1 及格 100
2 及格 100
3 不及格 0

注意:更新的值要满足建表时的字段类型。比如score是int类型就不能更新为char类型。

  • 请把students表中score小于60的score字段全部改为0,name字段中的名字改为不及格;score大于等于90的score字段全部改为2,name字段中的名字改为优秀;score大于等于60小于90的score字段全部改为1,name字段中的名字改为良好。
#批量更新多值 + case when
update students 
set 
    name = case
        when score < 60 then '不及格'
		when score >= 90 then '优秀'
        else '良好'
    end,
		score = case
        when score < 60 then 0
		when score >= 90 then 2
        else 1
    end;

注意:更新的时候是按照代码语句的先后顺序更新的。可以尝试先更新score后更新name,结果是不一样的。

id name score
1 优秀 2
2 良好 1
3 不及格 0
本文转载于网络 如有侵权请联系删除

相关文章

  • MySQL二进制日志(binary log)总结

    今天无意中发现了一个云栖社区举行的MySQL“第一季:挑战玄惭之 慢SQL性能优化赛”,在测试服务器上执行其测试脚本写入数据的时候报错提示如下, Multi-statementtransactionrequiredmorethan'max_binlog_cache_size'bytesofstorage,increasethismysqldvariableandtryagagin提示max_binlog_cache_size空间不足,因为开启了二进制日志,之前是默认设置没有大批量的事务性操作,没有遇到该问题,这一次一开始就遇到一个较大的事务性操作就失败了。 之后修改binlog_cache_size的大小之后,问题解决。由于使用的是默认的innodb引擎,开启了二进制日志, 对于事务性的操作,是要事物完成的时候写入二进制日志,事物提交之前,执行的写入性操作会被缓存起来,直到整个事物完成,mysqld进程会将整个事物写入二进制日志。 当事物开始的时候,会按照binlog_cache_size系统变量指定的值分配内容空间,如果指定的binlog_cache_size缓存

  • 又一个布局利器, CSS 伪类 :placeholder-shown

    作者:SamanthaMing 译者:前端小智 来源:medium一般我们常见placeholder伪类选择器用来修改默认样式及文案,忽然发现placeholder-shown伪类选择器,比较官方的解释是CSS伪类表示任何显示占位符文本的form元素。简单来说就是当输入框的placeholder内容显示的时候,输入框干嘛干嘛。兼容性如下,在移动端没什么问题placeholder-show是如何工作的?:placeholder-shownCSS伪类在<input>或<textarea>元素显示placeholdertext时生效,简单的说就是placeholder有值才生效,如下所示://html <inputplaceholder="placeholdertext"/> <textareaplaceholder="placeholdertext"></textarea> //css input:placeholder-shown,textarea:placeholder-shown{

  • Java工具集-ZIP解压工具

    添加依赖 <!--ZIP工具--> <dependency> <groupId>net.lingala.zip4j</groupId> <artifactId>zip4j</artifactId> <version>1.3.1</version> </dependency>复制代码示例packagecom.simple.util.base.extend.zip; importnet.lingala.zip4j.core.ZipFile; /** *@program:simple_tools *@description:ZIP解壓工具 *@author:ChenWenLong *@create:2020-01-0716:52 **/ publicclassZipUtil{ /** *功能描述: *〈解压zip文件〉 * *@params:[zipFilePath,targetPath] *@return:void *@author:cwl *@date:2020/1/716

  • 不要再@微信官方了,自己动手一秒制作头像

    9月24日,相信很多人的朋友圈一大早都被“请给我一面国旗微信官方”刷屏了。然而不少不明真相的网友,跟风在朋友圈发布这句话之后,发现自己的头像并没有国旗标志。其实自己动手给头像加一个国旗简直小菜一碟。#-*-coding:utf-8-*- """ CreatedonTueSep2416:29:322019 @author:czh """ %reset-f %clear #In[*] #-*-coding:utf8-*- importcv2 importos os.chdir('D:\\data\\pic\\weixin') #In[*] #读取图片:微信头像和国旗图片 img_pic=cv2.imread('pic.jpg') img_flag=cv2.imread('flag.jpg') #In[*] w_pic,h_pic=img_pic.shape[:2] w_flag,h_flag=img_flag.shape[:2] #修改比例,可以根据3修改比例,

  • windows下练习linux shell

    <---开始学习linux---记录一下---路漫漫其修远兮---加油吧---萌萌达>使用软件:Cygwin下载地址(免安装版):链接:http://pan.baidu.com/s/1jG6PjEY密码:vyjs解压到任意的位置,博主是放在E:\dev\cygwin运行bash.exe:1.直接在bin目录中运行bash.exe2.cmdcdE:\dev\cygwin\binbash.exe测试shell脚本运行:简单shell脚本地址:http://blog.163.com/hbu_lijian/blog/static/1261291532011113035622113/随便选择一个,新建.sh文件(例如:test.sh)复制粘贴保存。注意文件format,因为inux和window采用不同的编码方式。notepad++编辑:运行shell脚本:在bash.exe中键入./test.sh回车。即可看到运行效果。若出现XXX:commandnotfoundXXX:notavalididentifier配置环境变量:举例说明:cygwin安装在C盘根目录下,那么在环境变量编辑

  • 看完你就会!Python自动化开发必备项目之博客网站全实现

    本文由马哥教育Python自动化实战班6期学员推荐,转载自互联网,作者为lm409,内容略经小编改编和加工,观点跟作者无关,最后感谢作者的辛苦贡献与付出。断断续续终于过了一遍Python教程,于此梳理教程实战作业:搭建一个Blog网站。 由于欠缺前端知识,有些代码直接引用于项目源码,个人做了尽量详尽的注释以帮助理解,希望在今后能够学习HTML、CSS、JavaScript等知识,然后回头重新理解本项目。作品的完整代码,回复公众号:博客神器一、文件结构二、关键技术1.http工作流程1.客户端(浏览器)发起请求2.路由分发请求(这个框架自动帮处理),add_routes函数就是注册路由。3.中间件预处理-打印日志-验证用户登陆-收集Request(请求)的数据4.RequestHandler清理参数并调用控制器(Django和Flask把这些处理请求的控制器称为viewfunctions)5.控制器做相关的逻辑判断,有必要时通过ORM框架处理Model的事务。6.模型层的主要事务是数据库的查增改删。7.控制器再次接管控制权,返回相应的数据。8.Response_factory根据控制器传

  • 为什么SAP默默开始区块链研究测试

    暴走时评:去年世界领先的信息和咨询公司Gartner发布报告称,德国SAP几乎占据世界四分之一的供应链管理软件市场。目前该公司已经开始多个领域的区块链探索,但是公司会通过辨别市场和客户需求,确定公司最终研究方向。作为世界软件开发的主导力量,我们期待SAP的参与会给区块链领域带来具有代表性的商业应用软件。翻译:Annie_Xu比特币的成功激励全球技术公司开始尝试调整底层代码,开发新的商业用例。SAP是1970年一群IBM工程师成立的德国软件公司,它也无一例外的加入区块链领域。去年大半年时间这个位于德国小镇魏恩海姆的公司一直在探索该技术的潜在应用,涉及领域包括金融、支付、供应链管理等。但是像其他同行者一样,SAP不确定区块链的未来会怎样。而且采访公司代表得知,他们只是简单回应不断增长的客户需求以及传统市场参与者与初创企业高涨的激情。在记者采访中,Gross显得很乐观,解释目前SAP正从客户参与度与其对全球企业运作方式的影响的角度,逐步实施早期测试项目。Gross同时公司也在探索自己的方向,SAP有独立完成这个任务的能力。“只有亲自实践才能真正理解这类应用”。目前公司正在逐步实施,并且已初见

  • 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》

    文章目录(更新中…)01thinkphp6的前期开发准备《ThinkPHP6入门到电商实战》 02控制器《ThinkPHP6入门到电商实战》 03数据库查询、模型查询、多库查询《ThinkPHP6入门到电商实战》若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我,若你是真心学习可以送你书籍,指导你学习,给予你目标方向的学习路线,无套路,博客为证。一、数据库连接配置在部署环境下数据库连接在config目录下的database.php文件中进行配置: 根据配置文件中的信息进行数据库连接的编写: 在此我们可以预先通过可视化的数据库管理工具创建数据库: 随后可以在数据库中创建对应的表内容: 此时还差数据表数据,直接通过可视化环境对其进行编辑即可: 有了数据后即可对其进行操作,在此还需要提醒一下,在本地环境中,数据库连接还可以通过.env文件进行配置: 打开.env文件后在其中可以看到对应的配置项: 在此为了方便我们直接使用config下的database.php为其配置即可: 二、静态方式访问数据库在tp6中可以使用Db访问数据库,例如:<?php namespaceap

  • postgresql-shared_buffers

    关于shared_buffers 什么是shred_buffer,我们为什么需要shared_buffers? 1.在数据库系统中,我们主要关注磁盘io,大多数oltp工作负载都是随机io,因此从磁盘获取非常慢。 2.为了解决这个问题,postgres将数据缓存在RAM中,以此来提高性能,即使ssd的情况下RAM也要快很多。 3.shared_buffers是一个8KB的数组,postgres在从磁盘中查询数据前,会先查找shared_buffers的页,如果命中,就直接返回,避免从磁盘查询。 shared_buffers存储什么? 1.表数据 2.索引,索引也存储在8K块中。 3.执行计划,存储基于会话的执行计划,会话结束,缓存的计划也就被丢弃。 什么时候加载shared_buffers? 1.在访问数据时,数据会先加载到os缓存,然后再加载到shared_buffers,这个加载过程可能是一些查询,也可以使用pg_prewarm预热缓存。 2.当然也可能同时存在os和shared_buffers两份一样的缓存(双缓存)。 3.查找到的时候会先在shared_buffers查找是否有

  • 浅谈 EF CORE 迁移和实例化的几种方式

    出于学习和测试的简单需要,使用Console来作为EFCORE的承载程序是最合适不过的。今天笔者就将平时的几种使用方式总结成文,以供参考,同时也是给本人一个温故知新的机会。因为没有一个完整的脉络,所以也只是想起什么写点什么,不通顺的地方还请多多谅解。 本文对象数据库默认为VS自带的LocalDB Normal&Simple 先介绍一种最简单的构建方式,人人都会。 新建Console应用程序,命名自定 安装相关Nuget包 //SqlServerDatabaseProvider Install-PackageMicrosoft.EntityFrameworkCore.SqlServer //提供熟悉的Add-Migration,Update-Database等Powershell命令,不区分关系型数据库类型 Install-PackageMicrosoft.EntityFrameworkCore.Tools 复制 自定义DbContext publicclassMyContext:DbContext { protectedoverridevoidOnC

  • centos7通过docker安装mysql

    1.启动docker systemctlstartdocker;复制 2.查看mysql版本 dockersearchmysql;复制 3.安装最新mysql dockerpullmysql:latest;复制 4.安装最新版本mysql,我安装时最新的版本为8.0.22 dockerpullmysql:latest;复制  5.查看docker镜像,并且为我们的mysql添加容器名称my_mysql,设置密码 dockerimages;复制 dockerrun-itd--namemy_mysql-p3306:3306-eMYSQL_ROOT_PASSWORD=123456mysql;复制 6.查看容器相关信息 dockerps;复制 7.进入mysql,需先进入容器 dockerexec-itmy_mysqlbash;复制 mysql-uroot-p;复制 8.此时如果用navicat去连接可能无法连接成功,因为mysql8需要改变默认的身份认证插件,查看身份认证插件 SELECTHost,User,pluginfromuser;复

  • SE网络编程-通信基础

    网络编程 网络通信的要素 如何实现网络的通信? ip 端口号 192.168.16.124:9892 规则: 网络模型分七层 小结: 网络编程中有两个主要问题 如何准确的定位到网络上的一台或者多台主机 找到主机如何进行通信 ip ip地址:InetAddress 唯一定位一台网络计算机(mac) 127.0.0.1:本机localhost ip地址的分类 ipv4/ipv6 IPV442亿 IPv6fe91::f4f0:c6e4:b11se:2120%5s,128位,8个无符号证书 公网-私网 公网:ABCD类地址 192.168.x.x,专门给组织能不使用的 域名:记忆IP问题 ip:www.vip.com万网 端口 一个端口表示程序的进程 不同的进程有不同的端口号!用来区分软件 被规定0-65535 TCP,UDP65535*2tcp:80单个协议下端口不能冲突 端口分类 共有端口:0-1023 HTTP:80 HTTPS:443 FTP:21 Telet:23 程序注册端口:1024-49151,分配各用户和程序 Tomca

  • Android开源日志库Logger

    开源地址:https://github.com/orhanobut/logger 参考 1.http://www.open-open.com/lib/view/open1427166371418.html 2.http://www.jianshu.com/p/21902079e88f 日志程序提供了:  线程信息Threadinformation  类信息Classinformation  方法信息Methodinformation  漂亮打印的JSON内容Pretty-printforjsoncontent  Cleanoutput  Jumptosourcefeature Gradle  compile'com.orhanobut:logger:1.3'复制 当前的Log系统 Log.d(TAG,"hello");复制 Logger  Logger.d("hello");复制 用法  Logger.d("hello"); Logger.e("hello"); Logger

  • Python: Singleton

        classSingleton: __obj=None __initiated=False def__new__(cls,*args,**kwargs): ifcls.__objisNone: cls.__obj=super(Singleton,cls).__new__(cls) returncls.__obj def__init__(self,name): ifnotself.__initiated: self.name=name a=Singleton('aaa') b=Singleton('bbb') print(a,b) print(a.__dict__,b.__dict__)复制  

  • B - Collisions

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26830#problem/B 题目大意:直线上有n个不计半径的球,有初始坐标和速度,给出公式,问第t秒这些球分别在哪些位置思路:有点麻烦的水题,大致上就是每次算出两个球相撞的最小时间mint,然后计算出mint秒后球球们分别都在什么位置,相撞的都要计算速度(注意:同一时间可能有多对球同时碰撞,我用一个WA证实了这一点……)。还有要注意的事,比如速度相等的、位置相同的球不能用来算最小时间,理由自己想。还有算出来时间不是正数也不能要,不是正数说明两个球没外力干扰的情况下永远不会相撞。 ACCode: 1#include<cstdio> 2#include<cmath> 3 4constintMAXN=110; 5constdoubleEPS=1e-6; 6 7doublex[MAXN],v[MAXN]; 8intm[MAXN]; 9 10intmain(){ 11intn,t; 12scanf("%d%d",&n,&t); 13f

  • caffe常用层:卷积层

    layer{ name:"conv1_1"#表示该层的名称 type:"Convolution"#层类型 bottom:"image"#输入 top:"conv1_1"#输出 param{ lr_mult:1.0#权值的学习率,最终的学习率是这个系数乘以solver.prototxt配置文件中的base_Ir decay_mult:1#权值衰减系数 } param{ lr_mult:2.0#如果有两个Ir_mult,则第二个代表偏置项的学习率,一般来说偏置项的学习率是权值学习率的两倍 decay_mult:0 } convolution_param{ num_output:64#卷积核的个数,convolution_param主要用于设定卷积层的特有参数 pad:1 kernel_size:3 weight_filler{#权值初始化 type:"gaussian"#默认为“constant”,值为0,“gaussian”使用高斯分布初始化权值 std:0.01#std是参数初始化成是高斯分布的标准差,std越小,证明高斯曲线越平滑,各个权重值基本相同 详见https://blog.c

  • webdriver--定位一组元素+iframe表单切换

    定位一组元素:find_elements,返回的是list,所以可以用列表的索引对列表里的某个元素操作,也可以用for循环访问list,依次操作各元素 driver.find_elements_by_name("OpenType")[1].click()#公开类型 #推送范围 forpushindriver.find_elements_by_name("GroupName"): push.click() time.sleep(1)复制 定位一组元素时,形成的是list,所以list的相关语法都可以使用,切片、添加、删除、遍历都可以 iframe表单切换   最开始接触到这个iframe切换的契机是,当时页面有个弹窗,按照网上查找到的弹窗处理方式,获取句柄,然后切到该弹窗,再定位弹窗内的元素。但是怎么都无法成功,定位不到弹窗里的元素。后来问开发,看了看前端代码,原来这个弹窗不是window窗口,而是iframe表单嵌套页面,所以执行出错。webdriver只能在一个页面上对元素识别和定位,对frame/iframe表单内嵌页面的元素无法直接定位,所以也是需要通过swtich_t

  • Warning: Illegal string offset &#39;account&#39; in 解决方法

    比如这段代码: if((!empty($_GPC['uniacid_source'])&&$_GPC['uniacid_source']=='wxapp')){$uniacid=intval($_GPC['uniacid']);if(!empty($uniacid)){isetcookie('__uniacid',$uniacid,7*86400);$cache_lastaccount['account']=$uniacid;cache_write($cache_key,$cache_lastaccount);}}else{$uniacid=$cache_lastaccount['account'];}报错的原因是$cache_lastaccount数组里面有空数组,空数组里没有account这个字段。最终解决办法是:复制 只需要把红色的部分修改成:$uniacid=isset($cache_lastaccount['account'])?$cache_lastaccount['account']:'';复制 还有一个报错的原因是数据库储存的内容不正确,可以删除该字段

  • 2018年Android面试题含答案--适合中高级(上)

    这些面试题是我在今年年初换工作的时候整理,没有重点。包括java基础,数据结构,网络,Android相关等等。适合中高级工程师。由于内容过多,将会分为上下两部分。下部分跳转链接:http://www.cnblogs.com/huangjialin/p/8657696.html 这里是我整理出来的面试题,答案我花了很久的时间。加上我自己的理解整理出来的,作者不易,请谅解。有答案的:https://xiaozhuanlan.com/topic/1493506827   1、java中==和equals和hashCode的区别  2、int与integer的区别  3、String、StringBuffer、StringBuilder区别  4、什么是内部类?内部类的作用 5、进程和线程的区别  6、final,finally,finalize的区别  7、Serializable和Parcelable的区别  8、静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?  9、成员内部类、静态内部类、局部内

  • 集群下通过ntpd同步时间

    方法1.ntp 平滑同步时间 (一)确认ntp的安装 1)确认是否已安装ntp 【命令】 rpm–qa|grepntp复制 若只有ntpdate而未见ntp,则需删除原有ntpdate。如: ntpdate-4.2.6p5-22.el7_0.x86_64 fontpackages-filesystem-1.44-8.el7.noarch python-ntplib-0.3.2-1.el7.noarch复制 2)删除已安装ntp 【命令】 yum–yremoventpdate-4.2.6p5-22.el7.x86_64复制 3)重新安装ntp 【命令】 yum–yinstallntp复制 (二)配置ntp服务 1)修改所有节点的/etc/ntp.conf 【命令】 vi/etc/ntp.conf复制 【内容】 restrict192.168.6.3nomodifynotrapnopeernoquery//当前节点IP地址 restrict192.168.6.2mask255.255.255.0nomodifynotrap//集群所在网段的网关

  • leetcode 42. Trapping Rain Water

    link Given n non-negativeintegersrepresentinganelevationmapwherethewidthofeachbaris1,computehowmuchwateritisabletotrapafterraining. Forexample, Given [0,1,0,2,1,0,1,3,2,1,2,1],return 6.   题意:看文字比较奇怪,看图片很清晰。给出每块的高度,求出往上面倒水那坨东西里可以存放多少水。   思路: 每个bar 能存多少水取决于它左边的最高的bar的高度和右边最高的bar的高度的较小的那个, 与其自身高度的差。 因此方法很简单,从左到右扫一次可以算出每个bar左边的最高高度。从右到左扫一次可以算出每个bar右边的最高的高度。    code: classSolution{ public: inttrap(vector<int>&height){ if(height.size()

相关推荐

推荐阅读