欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQLIN,NOTIN,EXISTS,NOTEXISTS实例讲解

程序员文章站 2022-03-23 19:36:56
in与exists执行流程 in:在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。(in时不对null进行处理) e...

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.