1.数据准备

mysql> select * from student;

+----+--------+----------+---------+-------------+

| id | name   | idCardNo | isCadre | nickname    |

+----+--------+----------+---------+-------------+

|  1 | Tom    | 350020   |       1 | Big T       |

|  2 | Jim    | 350022   |    NULL | PP          |

|  3 | Lucy   | 460311   |    NULL | Little girl |

|  4 | Liming | 733098   |       1 | NULL        |

+----+--------+----------+---------+-------------+

mysql> select * from cadre;

+----+--------+----------+-----------+

| id | name   | idCardNo | nickname  |

+----+--------+----------+-----------+

|  1 | Tom    | 350020   | Last Tom  |

|  2 | Max    | 636095   | Hand      |

|  3 | Liming | 733098   | China Boy |

+----+--------+----------+-----------+

要求:查询出student表中所有人员信息及其在cadre表中的nickname

① 子查询方式

SELECT a.idcardNo, a.name, a.nickname, (SELECT b.nickname FROM cadre b WHERE b.name=a.name) AS nickname_b FROM student a;

+----------+--------+-------------+------------+

| idcardNo | name   | nickname    | nickname_b |

+----------+--------+-------------+------------+

| 350020   | Tom    | Big T       | Last Tom   |

| 350022   | Jim    | PP          | NULL       |

| 460311   | Lucy   | Little girl | NULL       |

| 733098   | Liming | NULL        | China Boy  |

+----------+--------+-------------+------------+

子查询的方式中,针对student表的每条记录都会对cadre表进行一次查询,效率较低。

② 使用JOIN优化方式

SELECT a.idCardNo, a.name, a.nickname, b.nickname FROM student a LEFT JOIN cadre b ON a.name=b.name;

+----------+--------+-------------+-----------+

| idCardNo | name   | nickname    | nickname  |

+----------+--------+-------------+-----------+

| 350020   | Tom    | Big T       | Last Tom  |

| 733098   | Liming | NULL        | China Boy |

| 350022   | Jim    | PP          | NULL      |

| 460311   | Lucy   | Little girl | NULL      |

+----------+--------+-------------+-----------+

 

MySQL 使用JOIN优化子查询的更多相关文章

  1. MySQL 通过semi join 优化子查询

    半连接是MySQL 5.6.5引入的,多在子查询exists中使用,对外部row source的每个键值,查找到内部row source匹配的第一个键值后就返回,如果找到就不用再查找内部row sou ...

  2. paip.sql索引优化----join 代替子查询法

    paip.sql索引优化----join 代替子查询法 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.n ...

  3. MySql优化子查询

    用子查询语句来影响子查询中产生结果rows的数量和顺序. For example: SELECT * FROM t1 WHERE t1.column1 IN (SELECT column1 FROM ...

  4. mysql update不支持子查询更新

    先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...

  5. SQL Server中INNER JOIN与子查询IN的性能测试

    这个月碰到几个人问我关于"SQL SERVER中INNER JOIN 与 IN两种写法的性能孰优孰劣?"这个问题.其实这个概括起来就是SQL Server中INNER JOIN与子 ...

  6. join和子查询的一点点思考

    代码和表设计过程中,为了考虑数据库的范式,通常导致需要join多张表或子查询, 如报表场景, 可此种方式在大数据量的 情况下,效率较低.  如果能做适量的数据冗余,便可以减少join或子查询,效率较高 ...

  7. Mysql-SQL优化-子查询替代LEFT JOIN

    表A:批次信息表, 表B:实际批次明细表, Mysql版本:5.6.36 两表之间的数据体量差异:表B是表A的10000倍. 经过结转,表B通常保留 1千5百万数据.表A就是1千多条数据. 计算近24 ...

  8. Mysql查询优化器之关于子查询的优化

    下面这些sql都含有子查询: mysql> select * from t1 where a in (select a from t2); mysql> select * from (se ...

  9. 为什么MySQL不推荐使用子查询和join

    前言: 1.对于mysql,不推荐使用子查询和join是因为本身join的效率就是硬伤,一旦数据量很大效率就很难保证,强烈推荐分别根据索引单表取数据,然后在程序里面做join,merge数据. 2.子 ...

随机推荐

  1. 关于replace()方法中第二个参数的转义问题

    如果你想通过Javascript代码在网页中呈现 \ 字符,则在JS代码中你必须输入两个反斜杠 \\,否则会报错.比如: var a = "\"; alert(a); //chro ...

  2. PHP实现新浪长链接转化成短链接API

    我们经常收到类似于这样的短信(如下图),发现其中的链接并不是常规的网址链接,而是个短小精悍的短链接,产品中经常需要这样的需求,如果在给用户下发的短信中是一个很长的连接,用户体验肯定很差,因此我们需要实 ...

  3. HTML5+CSS3实现图片可倾斜摆放的动画相册效果

    先看看效果:其中鼠标悬浮在图片上会有动态效果图 直接上代码: css文件 @CHARSET "UTF-8"; *{ padding:0px; margin:0px; } div{ ...

  4. Android APP压力测试(三)之Monkey日志自动分析脚本

    Android APP压力测试(三) 之Monkey日志自动分析脚本 前言 上次说要分享Monkey日志的分析脚本,这次贴出来分享一下,废话不多说,请看正文. [目录] 1.Monkey日志分析脚本 ...

  5. github生成静态博客

    github生成静态博客很简单. 1.确认你知道你github的用户名,我的叫做chenxing12 2.创建一个项目名字叫做:用户名.github.io 我的用户名叫做chenxing12,所以我创 ...

  6. .Net语言 APP开发平台——Smobiler学习日志:如何在手机上显示类似EXCEL表格

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...

  7. C#冒泡排序法

    基本原理 比较两个相邻的数的大小,每次比较完后把最大的数放到本轮的末尾.假设有数组: 258,445,131,97,22,36,17,38,28,28,第一轮:258和445比较,位置不用交换.第二轮 ...

  8. javaweb学习总结(三十八)——事务

    一.事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句  update from account set mone ...

  9. css的三种样式

    1.行间样式 顾名思义就是直接写在div对里面的样式   2.内部样式 把样式写在一对<style></style>标签对中 这个标签对是放在html页面里面的   3.外联样 ...

  10. mybatis中的#和$的区别(转)

    #相当于对数据 加上 双引号,$相当于直接显示数据 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sq ...