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

例如

表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. ngix匹配规则

    语法规则: location [=|~|~*|^~] /uri/ { … } =:开头表示精确匹配 ^~:开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因 ...

  2. Gravatar 头像使用

    Gravatar :如果在Gravatar的服务器上放置了你自己的头像,那么在任何支持Gravatar的blog或者留言本上留言时,只要提供你与这个头像关联的email地址,就能够显示出你的Grava ...

  3. MT4 取K线

    目标:动态获取最新K线并通过DLL发送出去,symbols和periods可配置. //+------------------------------------------------------- ...

  4. frag

    <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=&qu ...

  5. Spock - Document - 03 - Data Driven Testing

    Data Driven Testing Peter Niederwieser, The Spock Framework TeamVersion 1.1 Oftentimes, it is useful ...

  6. Android DrawerLayout侧滑菜单

    本教程已经录制视频,欢迎大家观看我在CSDN学院录制的课程:http://edu.csdn.net/lecturer/944

  7. ubuntu18安装网易云音乐

    1.打开ubuntu软件搜索网易云安装 2.解决ubuntu18.04下网易云音乐打不开的问题 修改/etc/sudoers文件 sudo vi /etc/sudoers 在最后增加一行: usern ...

  8. JavaList列表的一些方法

    import java.util.ArrayList;import java.util.Iterator;import java.util.List; public class Test1 { pub ...

  9. 30天学会绘画 (Mark Kistler 著)

    第一课 球形 (已看) 第二课 重叠的球 (已看) 第三课 更多排列的球 (已看) 第四课 立方体 (已看) 第五课 空心立方体 (已看) 第六课 堆放的桌子 (已看) 第七课 堆放更多的立方体 (已 ...

  10. Django学习笔记之URL与视图cookie和session

    cookie和session cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了 ...