MySQL 使用JOIN优化子查询
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优化子查询的更多相关文章
- MySQL 通过semi join 优化子查询
半连接是MySQL 5.6.5引入的,多在子查询exists中使用,对外部row source的每个键值,查找到内部row source匹配的第一个键值后就返回,如果找到就不用再查找内部row sou ...
- paip.sql索引优化----join 代替子查询法
paip.sql索引优化----join 代替子查询法 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.n ...
- MySql优化子查询
用子查询语句来影响子查询中产生结果rows的数量和顺序. For example: SELECT * FROM t1 WHERE t1.column1 IN (SELECT column1 FROM ...
- mysql update不支持子查询更新
先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...
- SQL Server中INNER JOIN与子查询IN的性能测试
这个月碰到几个人问我关于"SQL SERVER中INNER JOIN 与 IN两种写法的性能孰优孰劣?"这个问题.其实这个概括起来就是SQL Server中INNER JOIN与子 ...
- join和子查询的一点点思考
代码和表设计过程中,为了考虑数据库的范式,通常导致需要join多张表或子查询, 如报表场景, 可此种方式在大数据量的 情况下,效率较低. 如果能做适量的数据冗余,便可以减少join或子查询,效率较高 ...
- Mysql-SQL优化-子查询替代LEFT JOIN
表A:批次信息表, 表B:实际批次明细表, Mysql版本:5.6.36 两表之间的数据体量差异:表B是表A的10000倍. 经过结转,表B通常保留 1千5百万数据.表A就是1千多条数据. 计算近24 ...
- Mysql查询优化器之关于子查询的优化
下面这些sql都含有子查询: mysql> select * from t1 where a in (select a from t2); mysql> select * from (se ...
- 为什么MySQL不推荐使用子查询和join
前言: 1.对于mysql,不推荐使用子查询和join是因为本身join的效率就是硬伤,一旦数据量很大效率就很难保证,强烈推荐分别根据索引单表取数据,然后在程序里面做join,merge数据. 2.子 ...
随机推荐
- 重温Servlet学习笔记--servletContext对象
一个项目中只有一个ServletContext对象,我们可以在多个servlet中获取这个唯一的对象,使用它可以给多个servlet传递数据,我们通常成servletContext为上下文对象.这个对 ...
- mybatis入门基础(七)----延迟加载
一.什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: ...
- Java进击C#——语法之知识点的改进
本章简言 上一章我们讲到关于面向对象思想上C#和JAVA之差别.笔者分别从面向对象的三大特性入手.而本章主要讲一些C#改进的知识点.在.NET Framework 2.0之后出现很多新的知识点.这些知 ...
- 实现iOS图片等资源文件的热更新化(三):动态的资源文件夹
简介 此文,将尝试动态从某个不确定的文件夹中加载资源文件.文章,会继续完善自定义的 imageNamed 函数,并为下一篇文章铺垫. 这么做的意义 正如我们经常所说的那样,大多数情景知道做事的意义往往 ...
- FreeRTOS 中断优先级嵌套错误引发HardFault异常解决(转)
最近在使用FreeRTOS的时候,突然发现程序在运行了几分钟之后所有的任务都不再调用了,只有几个中断能正常使用,看来是系统挂掉了,连续测试了几次想找出问题,可是这个真的有点不知所措. 我 ...
- EntityFrame Work 6 Code First 配置字段为varchar 类型
EntityFrame Work 6 配置字符串属性是否支持Unicode 内容 默认情况下,字符串为Unicode(SQLServer 中的nvarchar).您可以使用IsUnicode 方法指定 ...
- 家族/亲戚(relation)
题目描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是 ...
- 【转】c#获取网页地址参数
假设当前页完整地址为:http://www.jbxue.com/aaa/bbb.aspx?id=5&name=kelli则: "http://"是协议名"www. ...
- 使用SwipeListView实现滑动效果
QQ的滑动删除效果很不错,要实现这种效果,可以使用SwipeListView.1. 下载com.fortysevendeg.swipelistview这个项目(以前GitHub上有,现在GitHub上 ...
- eclipse 突然 一直在loading descriptor for XXX (XXX为工程名)
问题: eclipse 启动后,啥也不干,就一直在loading descriptor for XXX (XXX为工程名),,其他什么操作都不能操作. 如下图所示,保存文件也无法保存. 这个怎么办? ...