第一篇blog
决心从今以后把每天学习到的知识,遇到的问题,心得等等等等都写下来,作为积累.
千里之行始于足下,现在开始...
今天在网上读了一些关于in与exist用法的文章,还没来得及亲自去测试加以验证,且先写下自己所理解的.
(一)in
1. in后可接静态值的集合,
如select * from student where id in (1,2,3) or name in ('a','b','c');
这种应该是常态的用法.
2. in后可接子查询,
如select * from student where id in (select c.id from course c);
但凡遇到in后接子查询的情况,默认情况下(没有特意配置过数据库),数据库会采用hash join的方式连接两张表,其中内表会被映射到内存中的hash表上,外表每查出一条数据便会将in左侧的用来过滤的字段(此处是id)的值去哈希表里寻找,找到了则放在结果集中,否则这条记录被过滤掉,大致是这么个原理,因为要被hash到内存中,所以内表较小为好,一般不超过2M,不知道2M是多大的数据量...所以说in适合外表大而内表小,如果内表很大的话,会稍微复杂一些,数据库将采用其他是算法处理,而不单纯是hash join,现在还理解不了那么深,等待日后补全了.
(二)exist
1. exist后接子查询,
如select * from student s where exists (select 1 from course c where s.id=c.id);
exist后接子查询数据库的处理类似于嵌套循环(nested loop),外表查出一条数据,然后将这条数据中有用的部分,也就是子查询中用作比较的字段的值传进子查询中,然后子查询根据这个值去做子查询,如果查到了,能返回结果,则存在为真,那么输出外表中刚查出的这条数据,否则舍弃,而外表接着查下一条数据,大致是这样.因为类似于嵌套循环嘛,很容易理解,外层循环自然是循环次数少为好,故exist适用于外表小而内表大的情形.
当然,哪个更优并非是绝对的,这个是听了众多网友说的,主要依据的还是具体情景,参考数据量.
not in 与 not exists
因为not in会屏蔽索引,而not exists不会,所以无论什么情况,应该使用not exists代替not in.
时间所限,写的不能太翔实,期待今后改进吧.
决心从今以后把每天学习到的知识,遇到的问题,心得等等等等都写下来,作为积累.
千里之行始于足下,现在开始...
今天在网上读了一些关于in与exist用法的文章,还没来得及亲自去测试加以验证,且先写下自己所理解的.
(一)in
1. in后可接静态值的集合,
如select * from student where id in (1,2,3) or name in ('a','b','c');
这种应该是常态的用法.
2. in后可接子查询,
如select * from student where id in (select c.id from course c);
但凡遇到in后接子查询的情况,默认情况下(没有特意配置过数据库),数据库会采用hash join的方式连接两张表,其中内表会被映射到内存中的hash表上,外表每查出一条数据便会将in左侧的用来过滤的字段(此处是id)的值去哈希表里寻找,找到了则放在结果集中,否则这条记录被过滤掉,大致是这么个原理,因为要被hash到内存中,所以内表较小为好,一般不超过2M,不知道2M是多大的数据量...所以说in适合外表大而内表小,如果内表很大的话,会稍微复杂一些,数据库将采用其他是算法处理,而不单纯是hash join,现在还理解不了那么深,等待日后补全了.
(二)exist
1. exist后接子查询,
如select * from student s where exists (select 1 from course c where s.id=c.id);
exist后接子查询数据库的处理类似于嵌套循环(nested loop),外表查出一条数据,然后将这条数据中有用的部分,也就是子查询中用作比较的字段的值传进子查询中,然后子查询根据这个值去做子查询,如果查到了,能返回结果,则存在为真,那么输出外表中刚查出的这条数据,否则舍弃,而外表接着查下一条数据,大致是这样.因为类似于嵌套循环嘛,很容易理解,外层循环自然是循环次数少为好,故exist适用于外表小而内表大的情形.
当然,哪个更优并非是绝对的,这个是听了众多网友说的,主要依据的还是具体情景,参考数据量.
not in 与 not exists
因为not in会屏蔽索引,而not exists不会,所以无论什么情况,应该使用not exists代替not in.
时间所限,写的不能太翔实,期待今后改进吧.