inner join 还是 left join 什么区别啊

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了inner join 还是 left join 什么区别啊相关的知识,希望对你有一定的参考价值。

inner join和left join区别为:返回不同、数量不同、记录属性不同。

一、返回不同

1、inner join:inner join只返回两个表中联结字段相等的行。

2、left join:left join返回包括左表中的所有记录和右表中联结字段相等的记录。

二、数量不同

1、inner join:inner join的数量小于等于左表和右表中的记录数量。

2、left join:left join的数量以左表中的记录数量相同。

三、记录属性不同

1、inner join:inner join不足的记录属性会被直接舍弃。

2、left join:left join不足的记录属性用NULL填充.。

参考技术A 1 WHERE子句中使用的连接语句,在数据库语言中,被称为隐性连接。INNER JOIN……ON子句产生的连接称为显性连接。(其他JOIN参数也是显性连接)WHERE和INNER JOIN产生的连接关系,没有本质区别,结果也一样。但是!隐性连接随着数据库语言的规范和发展,已经逐渐被淘汰,比较新的数据库语言基本上已经抛弃了隐性连接,全部采用显性连接了。a inner join:理解为“有效连接”,两张表中都有的数据才会显示left join:理解为“有左显示”,比如on a.field=b.field,则显示a表中存在的全部数据及a\\b中都有的数据,A中有、B没有的数据以null显示b right join:理解为“有右显示”,比如on a.field=b.field,则显示B表中存在的全部数据及a\\b中都有的数据,B中有、A没有的数据以null显示c full join:理解为“全连接”,两张表中所有数据都显示,实际就是inner (left-inner) (right-inner)3 join可以分主次表 外联接有三种类型:完全外联,左联,右联.完全外联包含两张表的所有记录.左联是以左边的表为主,右边的为辅,右联则相反4一般要使得数据库查询语句性能好点遵循一下原则:在做表与表的连接查询时,大表在前,小表在后不使用表别名,通过字段前缀区分不同表中的字段查询条件中的限制条件要写在表连接条件前尽量使用索引的字段做为查询条件本回答被提问者采纳 参考技术B 通常是 Left join 比 Inner Join 要快些
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行

Left JOIN 更快还是 Inner Join 更快?

【中文标题】Left JOIN 更快还是 Inner Join 更快?【英文标题】:Left JOIN faster or Inner Join faster? 【发布时间】:2010-12-21 02:16:19 【问题描述】:

那么...哪个更快(NULl 值不是问题),并且被索引。

SELECT * FROM A
  JOIN B b ON b.id = a.id
  JOIN C c ON c.id = b.id 
 WHERE A.id = '12345'

使用左连接:

SELECT * FROM A
 LEFT JOIN B ON B.id=A.bid
 LEFT JOIN C ON C.id=B.cid
WHERE A.id = '12345'

这是实际的查询 这是..两者都返回相同的结果

Query (0.2693sec) :
    EXPLAIN EXTENDED SELECT * 
    FROM friend_events, zcms_users, user_events, 
    EVENTS WHERE friend_events.userid = '13006'
    AND friend_events.state =0
    AND UNIX_TIMESTAMP( friend_events.t ) >=1258923485
    AND friend_events.xid = user_events.id
    AND user_events.eid = events.eid
    AND events.active =1
    AND zcms_users.id = user_events.userid

EXPLAIN

    id select_type table type possible_keys key key_len ref rows Extra 
    1 SIMPLE zcms_users ALL PRIMARY NULL NULL NULL 43082 
    1 SIMPLE user_events ref PRIMARY,eid,userid userid 4 zcms_users.id 1 
    1 SIMPLE events eq_ref PRIMARY,active PRIMARY4 user_events.eid 1 Using where
    1 SIMPLE friend_events eq_ref PRIMARY PRIMARY 8 user_events.id,const 1 Using where



    LEFTJOIN QUERY: (0.0393 sec)

    EXPLAIN EXTENDED SELECT * 
    FROM `friend_events` 
    LEFT JOIN `user_events` ON user_events.id = friend_events.xid
    LEFT JOIN `events` ON user_events.eid = events.eid
    LEFT JOIN `zcms_users` ON user_events.userid = zcms_users.id
    WHERE (
    events.active =1
    )
    AND (
    friend_events.userid = '13006'
    )
    AND (
    friend_events.state =0
    )
    AND (
    UNIX_TIMESTAMP( friend_events.t ) >=1258923485
    )


EXPLAIN
    id select_type table type possible_keys key key_len ref rows Extra 
    1 SIMPLE friend_events ALL PRIMARY NULL NULL NULL 53113 Using where
    1 SIMPLE user_events eq_ref PRIMARY,eid PRIMARY 4 friend_events.xid 1 Using where
    1 SIMPLE zcms_users eq_ref PRIMARY PRIMARY 4 user_events.userid 1 
    1 SIMPLE events eq_ref PRIMARY,active PRIMARY 4 user_events.eid 1 Using where

【问题讨论】:

你为什么不同时运行它们并告诉我们哪个更快? 这个问题应该改写为“我怎样才能确定哪个查询运行得更快?” 这些事件是否返回相同的结果集? (列,而不是行) @JMD 我不明白他们为什么会返回不同的列。相反,它们很可能会返回不同的行。 @Nathan:LEFT JOIN 示例将返回来自 A 的行,其中 B 和/或 C 中没有行 - B/C 列将为空。所以你会在 LEFT JOIN 结果集中有更多的列。 【参考方案1】:

视情况而定;运行它们以找出答案;然后运行“解释选择”以获得解释。

实际性能差异可能从“几乎不存在”到“相当显着”,具体取决于 A 中有多少行 id='12345' 在 B 和 C 中没有匹配记录。

更新(基于发布的查询计划)

当您使用 INNER JOIN 时,从哪个表开始并不重要(结果方面,而不是性能方面),因此优化器会尝试选择它认为性能最好的表。似乎您在所有适当的 PK / FK 列上都有索引,并且您在 friend_events.userid 上没有索引,或者userid = '13006' 的记录太多并且没有被使用;无论哪种方式,优化器都会选择行数较少的表作为“基础”——在这种情况下,它是zcms_users

当您使用 LEFT JOIN 时,确实重要(结果方面)从哪个表开始;因此friend_events 被选中。现在为什么我不太确定这样会花费更少的时间;我猜friend_events.userid 条件会有所帮助。如果您要在其上添加索引(它真的是 varchar,顺便说一句?不是数字?),您的 INNER JOIN 的行为也可能不同(并且变得更快)。

【讨论】:

我已经运行过了。似乎内部的速度要慢得多。但这不是inner应该比Left join更好吗? 你能发布两个查询的“解释选择”结果吗?【参考方案2】:

INNER JOIN 必须进行额外检查以从 A 中删除在 B 和 C 中没有匹配记录的任何记录。根据最初从 A 返回的记录数,它可能会产生影响。

【讨论】:

【参考方案3】:

使用EXPLAIN 查看查询计划。这两种情况可能是相同的计划,所以我怀疑它是否有很大的不同,假设没有不匹配的行。但这是两个不同的查询,因此比较它们确实没有意义 - 您应该使用正确的查询。

为什么不使用“INNER JOIN”关键字而不是“LEFT JOIN”?

【讨论】:

【参考方案4】:

LEFT JOIN 显示来自A 的所有数据,并且仅当条件为真时才显示来自B/C 的数据。至于INNER JOIN,它必须对tables 做一些额外的检查。所以,我想这就解释了为什么LEFT JOIN 更快。

【讨论】:

以上是关于inner join 还是 left join 什么区别啊的主要内容,如果未能解决你的问题,请参考以下文章

sql left join 和 inner join 效率

SQL——左连接(Left join)右连接(Right join)内连接(Inner join)

SQL语句(inner join,left out join,right out join三者的不同

sql JOINs - JOIN,INNER JOIN,LEFT JOIN,RIGHT JOIN,CROSS JOIN

SQL中left join on 、right join on、inner join on之间的区别

关于SQL 查询效率问题 left join 改成 inner join union