sqlinjoin
‘壹’ 在sql联表查询的时候,in和inner join各有什么优点
大概举例如下:
比如A1表 100W行 A2表50W行
select a.* from A1 a where a.column1 in (select b.column1 from A2 b where b.column2='xxx');
select a.* from A1 a where exists (select 'x' from A2 b where b.column2=xxx and a.column1=b.column1);
select a.* from A1 a,A2 b where b.column2='xxx' and a.column1=b.column1
在(select b.column from A2 b where b.column2=xxx)的结果集比较小的情况下(比如只有几十条)用in的效率高于关联,如果结果集比较大的情况下则用join的效率高于用in,这里我还列举了exists,这个效率类似于join也是结果集大的情况下适用,至于两者的拐点还需要你在执行计划和统计信息当中去观察以便确定出最优的sql语句。
‘贰’ 在sql语句多表连接中,in、exists、join哪个效率更高一点
EXISTS、IN与JOIN,都可以用来实现形如“查询A表中在(或不在)B表中的记录”的查询逻辑。
在查询的两个表大小相当的情况下,3种查询方式的执行时间通常是:
EXISTS <= IN <= JOIN
NOT EXISTS <= NOT IN <= LEFT JOIN
只有当表中字段允许NULL时,NOT IN的方式最慢:
NOT EXISTS <= LEFT JOIN <= NOT IN
但是如果两个表中一个较小,一个较大,则子查询表大的用exists,子查询表小的用in,因为in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。而无论那个表大,用not exists都比not in要快。这是因为如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。
IN的好处是逻辑直观简单(通常是独立子查询);缺点是只能判断单字段,并且当NOT IN时效率较低,而且NULL会导致不想要的结果。
EXISTS的好处是效率高,可以判断单字段和组合字段,并不受NULL的影响;缺点是逻辑稍微复杂(通常是相关子查询)。
JOIN用在这种场合,往往是吃力不讨好。JOIN的用途是联接两个表,而不是判断一个表的记录是否在另一个表。
‘叁’ sql join有什么作用
表a 表b
a1 a2 b1 b2
a01 张三 a02 数学
a02 李四 a03 语文
a03 王五 a04 英语
selecta.a2,b.b2fromaleftjoinbona.a1=b.b1
张三
李四 数学
王五 语文
selecta.a2,b.b2fromainnerjoinbona.a1=b.b1
李四 数学
王五 语文
selecta.a2,b.b2fromafulljoinbona.a1=b.b1
张三
李四 数学
王五 语文
英语
selecta.a2,b.b2fromarightjoinbona.a1=b.b1
李四 数学
王五 语文
英语
‘肆’ SQL中 join in 怎么用
select * from B as b inner join C as c on b.id=c.id
‘伍’ sql中in 的效能好还是join的效能好
肯定是第一种快啊。
第一种一个语句,和第二种for里面单个语句的执行效率差异不大的。
in 语句,就是相当于 多个 or,执行就是一次数据遍历,而for里面,几个语句是几次遍历。