2、数量较小,如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。 3、如果子查询中返回的任意一条记录含有空值,则IN查询将不返回任何记录,这点需注意。 4、返回数据是两个表的多个字段数据,建议使用关联查询。不仅速度快,而且返回数据可以自定义。
2、数量较小,如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。 3、如果子查询中返回的任意一条记录含有空值,则IN查询将不返回任何记录,这点需注意。 4、返回数据是两个表的多个字段数据,建议使用关联查询。不仅速度快,而且返回数据可以自定义。
not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in, 例如:查询那些班级中没有学生的, select * from class where cid not in(select distinct cid from stu) 当表中cid存在null值,not in 不对空值进行...
not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,并使用anti hash join. 如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is...
select * from t1 where phone not in (select phone from t2) 1. 直接就把我跑傻了。。。 十几分钟,检查了一下 phone在两个表都建了索引,字段类型也是一样的。原来 not in 是不能命中索引的。。。 改成NOT EXISTS 之后查询 20s ,效率真的差好多。 select...
十几分钟,检查了一下 phone在两个表都建了索引,字段类型也是一样的。原来 not in 是不能命中索引的…… 改成NOT EXISTS 之后查询 20s ,效率真的差好多。 select * from t1 where not EXISTS (select phone from t2 where t1.phone =t2.phone) ...
首先说明,in的效率就不高,not的效率更底,所以二者结合就效率不高了。至于为什么,从大了说,in和not都跟索引没有关系,而且就算相关字段有索引二者也都不会走,走的都是全表查询,那么这肯定不会快。再说语句本身,not in 首先要判断是不是in,然后在判断not,这是两个过程,相当于一个补集,等于判断了两次,那么自然...
正如所看到的,not in出现了不期望的结果集,存在逻辑错误。如果看一下上述两个select 语句的执行计划,也会不同,后者使用了hash_aj,所以,请尽量不要使用not in(它会调用子查询),而尽量使用not exists(它会调用关联子查询)。 如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录。如果子查询字段有非...
项目中遇到这么个情况: t1表 和 t2表 都是150w条数据,600M的样子,都不算大。 但是这样一句查询 ↓ select * from t1wherephone notin(select phone from t2) 直接就把我跑傻了。。。十几分钟,检查了一下 phone在两个表都建了索引,字段类型...
1、用 EXISTS 或 NOT EXISTS 代替 2、用JOIN 代替 WHY? IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢? 1、效率低 项目中遇到这么个情况: t1表 和 t2表 都是150w条数据,600M的样子,都不算大。 但是这样一句查询 直接就把我跑傻了。。。十几分钟,检查了一下 phone在两个表都建了索引,字段类...