当前位置: 移动技术网 > IT编程>数据库>MSSQL > SQLIN,NOTIN,EXISTS,NOTEXISTS实例讲解

SQLIN,NOTIN,EXISTS,NOTEXISTS实例讲解

2018年09月14日  | 移动技术网IT编程  | 我要评论

顾静柳,安卓论坛下载,ghost32

in与exists执行流程

in:在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。(in时不对null进行处理)

exists:在查询的时候,遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。使用exists关键字进行查询的时候,首先查询的不是子查询的内容,而是查主查询的表,

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

例如:表a(小表),表b(大表)

1:

select * from a wherea in(selectb fromb)

效率低,用到了a表上a列的索引;

select* from a whereexists (select b fromb whereb=a.a)

效率高,用到了b表上b列的索引。

2:

select* from b where b in(selecta froma)

效率高,用到了b表上b列的索引;

select* from b where exists(selecta froma wherea=b.b)

效率低,用到了a表上a列的索引。

in与exists应用场景

in和exists的区别:

如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,

反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。

in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。

简易口诀:子查询相对小,用in,否则用exists.

not in与not exists

有了前面in与exists的分析,对not in与not exists就好理解了,

如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;

而not exists的子查询依然能用到表上的索引。

所以无论那个表大,用not exists都比not in要快。

简易口诀:否定用not exists.

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网