工作中遇到需要将一个表中的数据按照对应规则填入别的表中的情况

例如

表1 a

a1    a2

11     90889

32     31241

12     52123

表2 b

b1     b2

11

12

13

其中a1与b1是同一个字段(比如存的都是姓名)

a2与b2是同一字段

需求:现在需要通过a1,b1将a2导入到b2中

条件:a1,b1一一对应,且每一条a1都有对应b1与之对应

例句子查询方式

update
balancesheet b
set
b.cs=
(
      select stockCode from company c
      where c.id=b.comid
)

explain

5w条数据用时0.7s

联合查询方式

update
balancesheet b
inner join
company c
using(stockCode)
set
b.cs=c.stockCode

explain

用时0.8s

由于更新的目标表只有一个,优化器没有办法改变关联的顺序。在有合适的索引的情况下,子查询的效率反而高于关联查询!跟我们的刻板印象不同!

条件:a1,b1一一对应,并不是每一条a1都有对应b1与之对应

例句子查询方式

update 
balancesheet b
set 
b.cs=
(
      select stockCode from company c
      where c.id=b.comid
)

经过漫长的等待之后,

提示子查询返回超过一条结果??

[Err] 1242 - Subquery returns more than 1 row

可以推算到原因应该是不是每一条a1都能找到b1,优化器的执行路径发生了变化!

这时只能寄希望于联合查询

联合查询方式

update 
balancesheet b
inner join
company c
using(stockCode)
set 
b.cs=c.stockCode

结果是可以顺利执行!!ok!!

这里我们可以看到不同索引,不同的数据对应条件对sql的执行路径产生了无法预估的影响。

刻板影响也不一定是正确的!

对于sql语句的效率一般来说还是需要经过测试才能的出想要的解。

而对于问题而言,联合查询的方式是更加通用的!!子查询的方式逻辑容易理解,部分可以使用的情况下有更好的效率。

mysql 下的update select from的两种方式比较的更多相关文章

  1. ASP.NET MVC 下拉框的传值的两种方式

    以前使用WebForm变成时,下拉框传值只需直接在后台绑定代码就可以了.现在我们来看看在MVC中DropDownList是如果和接受从Controller传过来的值的. 第一种:使用DropDownL ...

  2. 获取select文本框的下拉菜单文字内容的两种方式

    <body> <div class="box"> <select id="sel"> <option value=&q ...

  3. select 标签的两种方式(以动态插入为例)

    标准形式: html <select id="sorte_piceid_copy" name="tea" style="display:none ...

  4. IIS下自定义错误页面配置的两种方式(亲测可行)--IIS服务器

    网站自定义错误页面的设置,大家应该都知道它的重要性……不多说,下面带大家一步步在IIS下设置网站自定义错误页面…… 1.首先进入你的网站主页,找到[错误页](注意是IIS下的错误页不是.NET错误页) ...

  5. mysql存储过程中遍历数组字符串的两种方式

    第一种:多次使用substring_index()的方法 DELIMITER $$ DROP PROCEDURE IF EXISTS `array`$$ CREATE  PROCEDURE `arra ...

  6. 第一课:Centos下配置java环境变量的两种方式(jdk1.8)

    配置java环境(yum安装) 1.查出java1.8的全部版本 yum list java-1.8* 2.安装你需要的java1.8 版本(安装的名字根据查询出来的结果输入这里只是举例) yum i ...

  7. ASP.NET MVC 下拉框的传值的两种方式(第二种方式未完成)

    控制器代码: public ActionResult Index() { List<SelectListItem> sli = new List<SelectListItem> ...

  8. mysql批量更新的两种方式效率试验<二>

    Mysql两种批量更新的对比 简介: mysql搭载mybits框架批量更新有两种方式,一种是在xml中循环整个update语句,中间以‘:’隔开,还有一种是使用case when 变相实现批量更新, ...

  9. Spring Boot配置过滤器的两种方式

    过滤器(Filter)是Servlet中常用的技术,可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,常用的场景有登录校验.权限控制.敏感词过滤等,下面介绍下Spring Boot配置过 ...

随机推荐

  1. Python学习第七课

    Python学习第七课 'Alex' "Alex"print('hello'*5) #重复输出字符串 print('hellowold'[2:]) #类似于切片操作:会取出 llo ...

  2. linux 保存git的账号密码

    今天在弄jenkins一建发版,遇到了git下载每次都要输入账号密码,所以百度一下,使用一下方法,搞定 一.通过文件方式 1.在~/下, touch创建文件 .git-credentials, 用vi ...

  3. CMake 笔记

    1. configure_file configure_file()让你可以在代码文件中使用CMake中定义的变量. configure_file(<input> <output&g ...

  4. Unity3D UGUI实现Toast

    项目中有些信息需要以Toast的形式体现出来,不需要交互,弹出后一段时间后消失,多个Toast会向上重叠,下面是一个UGUI Toast的实现,动画部份用到了Dotween来实现 首先需要制作Toas ...

  5. celery使用rabbitmq报错[Errno 104] Connection reset by peer.

    写好celery任务文件,使用celery -A app worker --loglevel=info启动时,报告如下错误: [2019-01-29 01:19:26,680: ERROR/MainP ...

  6. Sql Server数据字典

    1:添加字段属性或者表属性 execute sys.sp_addextendedproperty @name = N'MS_Description', @value = N'要添加的属性信息', @l ...

  7. POJ1064 Cable master(二分 浮点误差)

    题目链接:传送门 题目大意: 给出n根长度为1-1e5的电线,想要从中切割出k段等长的部分(不可拼接),问这个k段等长的电线最长可以是多长(保留两位小数向下取整). 思路: 很裸的题意,二分答案即可. ...

  8. MySQL 8.0常见问题

    1.连接问题: 1.1:8.0的驱动地址更换由原来的com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver 1.2:8.0以后访问地址要加上时区.编码等属性jd ...

  9. linux 下 mysql 常用命令

    linux 下 mysql 常用命令   阅读目录 ====================== 1.开启和关闭 1.1.开启 1.2.关闭 1.3.重启 2.登录 2.1.密码明文 2.2.密码密文 ...

  10. 在Unity 3D中加入Image图片

    在Unity 3D中加入Image图片,我在刚开始是加不进去的,为什么呢?因为没有图片,图如下: 原因就是我们没有把图片设置为Script,图片的格式还是默认的那个,这只能作为贴图使用.我们将图片进行 ...