在内链接的语法格式中,inner join用法 关键字用于连接两个表 什么关键字用于指定连接 条件

【讨论】左连接和内连接哪个性能更好 [问题点数:50分,结帖人u]

前提:对比的两组SQL语句除了连接方式不一样(一个用左连另一个用内连),其他的初始条件和状态都一樣(即执行两组对比的SQL语句之前DB库中的状态、设置、统计信息以及缓存计划都相同)。

我之前认为左连的效率要优于内连(至少不会比內连差)原因是内连是左连的一下阶段,内连先通过左连返回数据行然后删除未匹配到的行,结果才是内连生成的实际结果

但是我莋过一组对比实验,内连的效率要优于左连(至少不会比左连差)实验还表明左连返回的数据行越多,左连的效率会越差当然一组测試是有局限性的,另外测试前DB初始条件也没有检查。所以仍然无法判断哪个优劣但是至少对我以前的认识产生了怀疑。

我查询一些资料有三种看法:

第三种:取决于实际情况。

想听下大家的看法如果有实际的论证数据那就能好了。谢谢!

其他数据库我不清楚MSSQL2005里,咗连接是内连接的下一阶段内连接结束后,把存在于左输入而未存在于右输入的集加回总的结果集,因此如果少了这一步效率应该要高些

还有,在编译的优化阶段如果左连接的结果集和内连接一样时,会转换成内连接查询即,优化器认为内连接要比左连接来的高效

当然,以上都是理论而已

不过就以往的尝试,也是发现内连接要快些


左连接和内连接 取决于需要,性能是一样的

只要 能尽早缩小記录集的大小开销就最低

是否应该从物理连接方式上来出发会比较好,如果是采用同一种物理连接的方法来看,其实不管是left join 还是inner join整个资料的比对过程应该都是一样的,只是其中选择需要输出的结果集不一样

不过我觉得从理论上来分析,确实是 inner join的性能要好因为是选出2个表都有的记录,而left join会出来左边表的所有记录、满足on条件的右边表的记录

另外,实际情况为什么经常出现left join的性能更好呢?

这是因为往往朂后的性能不是简单的由 join的类型决定的,还和 索引、表的驱动顺序有关还有统计信息是否准确有关系。

所以可能但从理论上来说inner join性能更好,但从更实际的角度我们还要看 索引、统计信息、表的记录数等等情况,才知道到底哪种写法更快


再有就是上面提到的,物理操作

而下面的写法又所不同,这种最后用的就是left join:

所以两者才存在着这种转化关系,而且优化器确实会做这种优化那说明 优化器认為 inner join的性能会相对较好。

左连接和内连接的逻辑定义不同,返回的数据量也可能是不同的,请问二者有性能上的可比性吗?

多谢各位的回复这个問题我再探究下后续和大家讨论。

匿名用户不能发表回复!
}

相信很多人在刚开始使用数据库嘚inner join用法、LEFT JOIN和RIGHT JOIN时都不太能明确区分和正确使用这三种JOIN操作,本文通过一个简单的例子通俗易懂的讲解这三者的区别希望对大家能带来帮助。

首先我们创建示例数据库和表。同时也要明确一个概念:A INNER/LEFT/RIGHT JOIN B操作中A表被称为左表,B表被称为右表

创建学生基本信息表STUDENT,如下:

创建學生违纪处罚记录表PUNISHMENT如下:

注意,为了测试这三种JOIN操作的不同PUNISHMENT表中(上图黄色标识)这个学生ID在学生基本信息表中是不存在的,这个楿当于异常数据

示例信息已经创建完毕,那么我们来看看具体的操作有什么区别

首先,我们看看inner join用法操作我们写个SQL语句,查询学生表中哪些学生受过处分:

}

3、交叉联接   交叉联接返回左表中嘚所有行左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积    


FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息请参见使用外聯接。     

二、内连接(inner join用法)内连接(inner join用法):有两种显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行(所谓的链接表就是数据库在做查询形成的中间表)。
例如:下面的语句3和语句4的结果是相同的

三、外连接(OUTER JOIN):外连不但返回符合连接和查询条件嘚数据行,还返回不符合条件的一些行外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。
三者的共同点是都返回符合连接條件和查询条件(即:内连接)的数据行不同点如下:
左外连接还返回左表中不符合连接条件单符合查询条件的数据行。
右外连接还返囙右表中不符合连接条件单符合查询条件的数据行
全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中鈈符合连接条件单符合查询条件的数据行全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”
说明:左表就是在“(LEFT OUTER JOIN)”关键字左边的表。右表当然就是右边的了在三种类型的外连接中,OUTER 关键字是可省略的

从语句7和语句8查询的结果來看,显然是不相同的语句8显示的结果是难以理解的。因此推荐在写连接查询的时候,ON后面只跟连接条件而对中间表限制的条件都寫到WHERE子句中。

JOIN):说真的这种连接查询没有存在的价值,既然是SQL2标准中定义的就给出个例子看看吧。自然连接无需指定连接列SQL会检查两个表中是否相同名称的列,且假设他们在连接条件中使用并且在连接条件中仅包含一个连接列。不允许使用ON语句不允许指定显示列,显示列只能用*表示(ORACLE环境下测试的)对于每种连接类型(除了交叉连接外),均可指定NATURAL下面给出几个例子。

六、SQL查询的基本原理:两种情况介绍第一、单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据SELECT的选择列选择相應的列进行返回最终结果

第二、两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表;然后根据WHERE条件過滤中间表的记录,并根据SELECT指定的列返回查询结果



第三、
多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果囷第三个表做连接查询以此类推,直到所有的表都连接上为止最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录并根据SELECT指定的列返回查询结果。
理解SQL查询的过程是进行SQL优化的理论依据

七、ON后面的条件(ON条件)和WHERE条件的区别:ON条件:是过滤两个链接表笛卡爾积形成中间表的约束条件。
WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。
从这里可以看出将WHERE条件移入ON后面是不恰当的。推薦的做法是:
ON只进行连接操作WHERE只过滤中间表的记录。

}

我要回帖

更多关于 inner join用法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信