in的工作原理
select * from A where id in(select id from B);
完全先执行in内的子查询得到缓存整张表B,再执行select * from A 得到表A与缓存的整张B表内字段进行匹配,遍历整张A表后得到结果。过程如下
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;
}
}
}
in适合子查询表内元素较小的情况(比较容易匹配上)
exists的工作原理
select * from A where exists (select 1 from B where A.id=B.id);
exists并不像in会缓存整个子查询表,而是会循环遍历整个A表对B进行直接比对
Array A=(select * from A);
for(int i=0;i<A.length;i++) {
if(exists(A[i].id) {
//执行select 1 from B where B.id=A.id是否有记录返回
resultSet.add(A[i]);
}
}
return resultSet;
exists()适合B表比A表数据大的情况
数据从一个表往另外一个表中插入数据时使用EXISTS,因为exists只返回true或false可以用来判断记录是否存在方便进行
在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 EXISTS 条件句防止插入重复记录。