数据库SQL查询效率in、exists、leftjoinon、rightjoinon适⽤场景与⽐较
in 与 join例
select t1.id,sum(t1.num) from (select * from t2 where num =2) as t3 LEFT JOIN t1 on t3.id=t1.id GROUP BY t1.id;
join 时间: 0.005s 0.009s
select id,sum(num) from t1 where id in (select id from t2 where num =2) group by id;
in 时间: 0.013s 0.017s
in和exists(摘录⾃百度)
in 是把外表和内表作hash 连接,⽽exists是对外表作loop循环,每次loop循环再对内表进⾏查询。
如果两个表中⼀个较⼩,⼀个是⼤表,则⼦查询表⼤的⽤exists,⼦查询表⼩的⽤in:
例如:表A(⼩表),表B(⼤表)
1:select * from A where cc in (select cc from B)效率低,⽤到了A表上cc列的索引;
select * from A where exists(select cc from B where )效率⾼,⽤到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from A)效率⾼,⽤到了B表上cc列的索引;
select * from B where exists(select cc from A where )效率低,⽤到了A表上cc列的索引。
not in 和not exists如果查询语句使⽤了not in 那么内外表都进⾏全表扫描,没有⽤到索引;
⽽not extsts 的⼦查询依然能⽤到表上的索引。所以⽆论那个表⼤,⽤not exists都⽐not in要快。
in 与 =的区别
select name from student where name in (‘zhang’,‘wang’,‘li’,‘zhao’);与
select name from student where name=‘zhang’ or name=‘li’ or
name=‘wang’ or name=‘zhao’
join和in哪个查询更快的结果是相同的。
left\right join是外部连接,inner join是内连接
外部连接有主表与从表,主表在left中是左侧表,right中是右侧表,主表数据会全部显⽰,从表数据则只显⽰关联部分匹配的数据,⽆匹配的数据⽤null补全
内连接则只显⽰两表关联条件匹配的数据
注:所谓关联条件即是指on的条件
where 与 inner join是⼀样的,但是多⽤inner join

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。