in和exists区别

如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

exists 与 in 最大的区别在于 in引导的子句只能返回一个字段;

exists : 强调的是是否返回结果集,不要求知道返回什么;

多字段in、not in在db2数据中可以执行,SQL Server不行
exists、not exists在db2,SQL Server均可执行
而且总体上用exists,not exists 效率都很高,建议大家还是用好exists,not exists吧!
把表yyy的不同记录添加到XXX表中(两个表结构相同)
insert into xxx select merchant_id(这里应该把除了自增ID外的字段都写入) from yyy a
where not exists (select * from yyy b where a.card_id=b.card_id and a.value=b.value)

in 和 exists的区别::如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in;反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。

其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键)

如果是exists,那么以外层表为驱动表,先查询主查询再将结果和内表中的子查询进行对比。详细执行步骤如下:使用exists关键字进行查询的时候,首先,我们先查询的不是子查询的内容,而是查我们的主查询的表。然后,根据表的每一条记录,再去子查询的内表中依次去判断where后面的条件是否成立:如果成立则返回true不成立则返回false。如果返回的是true的话,则该行结果保留,如果返回的是false的话,则删除该行,最后将得到的结果返回。

如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。详细执行步骤如下:首先,在数据库内部将先进行查询子查询。然后,将子查询到的结果和原有的外表做一个笛卡尔积。最后,再根据IN设置的条件,将结果进行筛选后返回。

你可能感兴趣的:(in和exists区别)