SQLIN,NOTIN,EXISTS,NOTEXISTS实例讲解

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.

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐