Mysql之IN和Exists⽤法
1.基本⽤法
IN:后⾯的⼦查询是返回结果集的,换句话说执⾏次序和Exists()不⼀样.⼦查询先产⽣结果集,然后主查询再去结果集⾥去符合要求的字段列表去.符合要求的输出,反之则不输出.
Exists:后⾯的⼦查询被称做相关⼦查询, 他是不返回列表的值的.只是返回⼀个ture或false的结果(这也是为什么⼦查询⾥是 "select 1 "的原因,当然也可以select任何东西) 其运⾏⽅式是先运⾏主查询⼀次。再去⼦查询⾥查询与其对应的结果,如果是ture则输出,反之则不输出.再根据主查询中的每⼀⾏去⼦查询⾥去查询。
2.运⾏过程
Exists执⾏顺序如下:
1.⾸先执⾏⼀次外部查询
2.对于外部查询中的每⼀⾏分别执⾏⼀次⼦查询,⽽且每次执⾏⼦查询时都会引⽤外部查询中当前⾏的值。
3.使⽤⼦查询的结果来确定外部查询的结果集。(如果外部查询返回100⾏,SQL 就将执⾏101次查询,⼀次执⾏外部查询,然后为外部查询返回的每⼀⾏执⾏⼀次⼦查询。但实际上,SQL的查询优化器有可能会到⼀种更好的⽅法来执⾏相关⼦查询,⽽不需要实际执⾏101次查询。)
IN的执⾏过程如下:
1.⾸先运⾏⼦查询,获取⼦结果集
2.主查询再去结果集⾥去符合要求的字段列表,.符合要求的输出,反之则不输出。
3.区别
3.1 IN和Exists
IN是把外表和内表作hash 连接,⽽Exists是对外表作loop循环,每次loop循环再对内表进⾏查询。⼀直以来认为Exists⽐IN效率⾼的说法是不准确的。
如果查询的两个表⼤⼩相当,那么⽤IN和Exists差别不⼤。如果两个表中⼀个较⼩,⼀个是⼤表,则⼦查询表⼤的⽤Exists,⼦查询表⼩的⽤IN:
例如:表A(⼩表),表B(⼤表):
exists的用法 select* from A where cc in(select cc from B)
效率低,⽤到了A表上cc列的索引;
select* from A where exists(select cc from B where )
效率⾼,⽤到了B表上cc列的索引。
相反的:
select* from B where cc in(select cc from A)
效率⾼,⽤到了B表上cc列的索引;
select* from B where exists(select cc from A where )
效率低,⽤到了A表上cc列的索引。
3.2 not IN 和not Exists
not IN 和not Exists如果查询语句使⽤了not in那么内外表都进⾏全表扫描,没有⽤到索引;⽽not extsts 的⼦查询依然能⽤到表上的索引。所以⽆论那个表⼤,
⽤not Exists都⽐not IN要快。
3.3 in与 = 的区别
select name from student where name in('A','S','D','F');
与
select name from student where name='A'or name='S'or name='D'or name='F'
的结果是相同的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论