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.
上一篇: mariadb、mysql使用介绍
下一篇: 一个用C语言实现的科学计算器