1、区别
1、EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。EXISTS 指定一个子查询,检测行的存在,存在则返回True,不存在则返回false。IN则是用于筛选符合规定值的行。
2、IN不对NULL进行处理,exists会对NULL值进行处理。
2、in与exists查询过程
in的查询过程类似于以下过程:
select * from A where cc in (select cc from B);
List resultSet=[];
Array A=(select * from A);
Array B=(select id from B);
for(int i=0;i<A.length;i++) {
for(int j=0;j<B.length;j++) {
if(A[i].id==B[j].id) {
resultSet.add(A[i]);
break;
}
}
}
return resultSet;
exists的查询过程类似于以下过程:
select * from A where exists(select cc from B where cc=A.cc);
List resultSet=[];
Array A=(select * from A)
for(int i=0;i<A.length;i++) {
if(exists(A[i].id) {//执行select 1 from B b where b.id=a.id是否有记录返回
resultSet.add(A[i]);
}
}
return resultSet;
结论:
- in()适合B表比A表数据小的情况;
- exists()适合B表比A表数据大的情况;
- 如果查询的两个表大小相当,那么用in和exists差别不大;
3、in与exists转换
1、in和exists在查询字段有无NULL的情况下可以相互转换。
2、not in和not exists在查询字段都没有NULL值的情况下才可以相互转换。
//select null 返回的数据,就是表中有多少行,就返回多少行列值为null的数据
select * from Person where name in (select NULL); //无数据
select * from Person where exists (select NULL);//相当于select * from Person
//查询结果都为空
select * from ST_SDSJ_R where STCD not in(select null);
select * from ST_SDSJ_R where not exists(select null);
4、not in 和not exists
not in 逻辑上不完全等同于not exists,exists会对NULL值进行处理,IN不对NULL进行处理,若查询子句中出现null值,则会出现不期望的结果集。
如果查询语句使用了not in ,那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。