数据库中in和exists关键字的区别
1. 数据库中in和exists关键字的区别
in 是把外表和内表作hash join,⽽exists是对外表作loop,每次loop再对内表进⾏查询。
⼀直以来认为exists⽐in效率⾼的说法是不准确的。
如果查询的两个表⼤⼩相当,那么⽤in和exists差别不⼤。
如果两个表中⼀个较⼩,⼀个是⼤表,则⼦查询表⼤的⽤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列的索引。
带in的关联⼦查询是多余的,因为in⼦句和⼦查询中相关的操作的功能是⼀样的。如:
select staff_name from staff_member where staff_id in
(select staff_id from staff_func where staff_member.staff_id=staff_func.staff_id);
为⾮关联⼦查询指定exists⼦句是不适当的,因为这样会产⽣笛卡乘积。如:
select staff_name from staff_member where staff_id
exists (select staff_id from staff_func);
not in 和not exists
如果查询语句使⽤了not in 那么内外表都进⾏全表扫描,没有⽤到索引;
⽽not extsts 的⼦查询依然能⽤到表上的索引。
所以⽆论哪个表⼤,⽤not exists都⽐not in要快。
尽量不要使⽤not in⼦句。使⽤minus ⼦句都⽐not in ⼦句快,虽然使⽤minus⼦句要进⾏两次查询:
select staff_name from staff_member where staff_id in (select staff_id from staff_member minus select staff_id from staff_func where func_id like '81%');
in 与 "=" 的区别
select name from student where name in ('zhang','wang','li','zhao');join和in哪个查询更快
select name from student where name='zhang' or name='li' or name='wang' or name='zhao'
的结果是相同的。

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