文档章节

为什么我在SQL中选择INNER JOIN 而不选择 WHERE a.id = b.a_id

耒耒耒耒耒
 耒耒耒耒耒
发布于 2016/11/21 15:12
字数 505
阅读 196
收藏 0

在多表查询的sql中,很多开发人员喜欢选择where作为连接条件; 如:

SELECT
	a.id,
	a.basic_salary,
	p.position_name
FROM
	salary_plan a,
	salary_position p
WHERE
	a.position_id = p.id

这样其实是存在一个很大的效率问题的,究竟如何请听我细细道来。

缺点:在上面这个sql中其实是创建了两张表的笛卡尔乘积的,所有有可能的集合都会被组合起来。在上表中如果 a表有1000条记录,p表有1000条记录,那么笛卡尔乘积的结果就是1000,000条记录。然后在生成的1000, 1000 记录中选择符合条件的1000条记录。这样使得数据库多做了1000倍的工作,对资源的浪费不言而喻的。如果是表的数据量小的话,还感觉不到什么压力。但是当表数据量大的话,压力就可想而知了。

在实际生产中我往往喜欢使用inner join来避免笛卡尔乘积的创建,上述sql我往往会使用这样的方法来解决

SELECT
	a.id,
	a.basic_salary,
	p.position_name
FROM
	salary_plan a INNER JOIN
	salary_position p
ON
	a.position_id = p.id

优点:避免了笛卡尔乘积的创建,使用上述sql只会产生1000条目标数据,大大提高了查询效率。

PS:虽然有些数据库的优化器会自动识别出第一条sql优化为第二条sql。但是这只是很少的一部份,至于哪些数据库有,我也不知道。至少我使用的mysql5.6是没有该功能的。但是inner join 是所有数据库都能支持的。因此在实际生产中DBA往往会建议使用inner join来进行查询优化。

注意: join 与 inner join效果相同

mysql查看优化器执行后sql语句可以参考该文章:

http://blog.csdn.net/wangjun5159/article/details/51227831

© 著作权归作者所有

共有 人打赏支持
耒耒耒耒耒

耒耒耒耒耒

粉丝 17
博文 57
码字总数 11060
作品 0
成都
程序员
私信 提问
mysql inner join on where 的查询区别

有2个表,有关联字段,然后查询 1 select * from table1 a inner join table2 b on a.id=b.a_id and a.name='' 2 select * from table1 a inner join table2 on a.id = b.a_id where a.name......

初级屌丝
2018/06/21
495
7
oracle 表连接

左连接显示左边全部的和右边与左边相同的 右连接显示右边全部的和左边与右边 相同的 内连接是只显示满足条件的! ...... ----------------------------------------------------------------...

SKYCOBS
2015/12/11
24
0
MySQL数据库基础知识学习笔记(二)

sql语句实战--表连接 (多表查询) 标准SQL语句格式有以下4种: ü 表内连接 Select col1,col2...from tab1,tab2 where tab1.col3=tab2.col3; Col1 列名 tab1表名 where tab1.col3=tab2.col3 ...

dusuqin
2018/04/19
0
0
【MySQL】Delete,Update连表(left join)删除,更新语法

普通的单表更新或删除sql大家肯定滚瓜烂熟,但你有用过连表更新或删除的sql吗, 这个在表间关联来做更新和删除操作非常有用. 本文分表介绍了如何用update ,delete做联表操作的方法, php程序员站...

磊神Ray
2012/03/26
0
0
mybatis-sql builder class

在拼接sql的时候,经常遇到字符串写的太长无法辨别的情况 String sql = "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULLNAME, " "P.LASTNAME,P.CREATEDON, P.UPDATEDON " + "FROM PERSON P, ......

writeademo
2018/07/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

值得收藏:一份非常完整的MySQL规范

一、数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命...

Java干货分享
29分钟前
3
0
VirtualBox中CentOS7主机适配器(Host-only Adapter)网络配置

最近使用 VirtualBox 安装 CentOS 7 虚拟集群环境,为实现主机网络访问虚拟机、虚拟机与虚拟机之间网络互访,VirtualBox 默认的 NAT 网络连接方式是肯定不能满足了,以前常用的桥接网络方式这...

calmsnow
32分钟前
2
0
TechDay公开课实录:PaddlePaddle车牌识别实战和心得

车牌识别作为一种常见的图像识别的应用场景,已经是一个非常成熟的业务了,在传统的车牌识别中,可以使用字符分割+字符识别的方式来进行车牌识别,而深度学习兴起后,出现了很多端到端的车牌...

深度学习之桨
54分钟前
3
0
关于SeekBar 拖动区域小的解决办法

//seekbarLayout 是seekBar对象statusSeekbar的父层布局seekbarLayout = mStatusViewLayout.findViewById(R.id.id_seekbar_layout);seekbarLayout.setOnTouchListener(new View.OnTouchL......

东街小霸王
今天
2
0
python实现下载网络视频资源

项目需求: 有时候我们做爬虫的时候,需要把爬取到的视频资源保存到我们本地,以防爬取的视频链接被原来资源主人变更,所以就需要把好不容易拿到的资源永久变为自己的,就需要把视频链接下载到我们...

银装素裹
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部