文档章节

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

耒耒耒耒耒
 耒耒耒耒耒
发布于 2016/11/21 15:12
字数 505
阅读 122
收藏 0
点赞 0
评论 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

© 著作权归作者所有

共有 人打赏支持
耒耒耒耒耒
粉丝 9
博文 50
码字总数 8803
作品 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......

初级屌丝
06/21
0
0
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
04/19
0
0
【MySQL】Delete,Update连表(left join)删除,更新语法

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

磊神Ray
2012/03/26
0
0
MySQL中10个出人意料的操作结果

http://database.itwaka.com/mysql/64342.html #10. 查找一个NULL值 在SQL中,NULL不等于任何其他值,也不等于另外一个NULL。上面的查询不会返回任何值,而且事实上优化器会把这个查询删除掉...

itwaka
2010/11/28
0
1
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
前天
0
0
SQL 左外连接,右外连接,全连接,内连接

联接条件可在 FROM 或 WHERE 子句中指定,建议在 FROM 子句中指定联接条件。WHERE 和 HAVING 子句也可以包含搜索条件,以进一步筛选联接条件所选的行。 联接可分为以下几类: 内联接(典型的...

整俩硬菜
2012/11/07
0
0
SQL 左外连接,右外连接,全连接,内连接

联接条件可在 FROM 或 WHERE 子句中指定,建议在 FROM 子句中指定联接条件。WHERE 和 HAVING 子句也可以包含搜索条件,以进一步筛选联接条件所选的行。 联接可分为以下几类: 内联接(典型的...

索隆
2012/06/26
0
0
mysql inner jion 如何得出结果

没有条件sql:SELECT a.,b. FROM A a INNER JOIN B b 执行结果: 有条件的sql:SELECT a.,b. FROM A a INNER JOIN B b WHERE a.id = b.f_id 执行结果: 总结:从查询结果可以看出,若没有whe...

qimh
06/26
0
0
mysql 内链接/外链接/交叉链接

1.内链接(典型的链接运算,使用=或<>之类的比较运算)内链接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索students和coursesb表中的学生标识号相同的所有行。 2.外链接...

hyhlinux
2016/07/06
52
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Android 复制和粘贴功能

做了一回搬运工,原文地址:https://blog.csdn.net/kennethyo/article/details/76602765 Android 复制和粘贴功能,需要调用系统服务ClipboardManager来实现。 ClipboardManager mClipboardM...

她叫我小渝
23分钟前
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
39分钟前
4
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
56分钟前
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
今天
0
0
Python分析《我不是药神》豆瓣评论

读取 Mongo 中的短评数据,进行中文分词 对分词结果取 Top50 生成词云 生成词云效果 看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任...

猫咪编程
今天
0
0
虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
昨天
1
0
There is no session with id[xxx]

参考网页 https://blog.csdn.net/caimengyuan/article/details/52526765 报错 2018-07-19 23:04:35,330 [http-nio-1008-exec-8] DEBUG [org.apache.shiro.web.servlet.SimpleCookie] - Found......

karma123
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部