SQL中in与exist的区别
exist
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录,反之如果exists里的条 件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件,当能返回结果集则为true,不能返回结果集则为 false
in
in查询相当于多个or条件的叠加,这个比较好理解,比如下面的查询
select * from user where userId in (1, 2, 3);
等效于
select * from user where userId = 1 or userId = 2 or userId = 3;
总的来说,in查询就是先将子查询条件的记录全都查出来,假设结果集为B,共有m条记录,然后在将子查询条件的结果集分解成m个,再进行m次查询
in 和 exist 区别
select * from A where id in(select id from B)
以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录.
它的查询过程类似于以下过程
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;
可以看出,当B表数据较大时不适合使用in(),因为它会B表数据全部遍历一次.
如:A表有10000条记录,B表有1000000条记录,那么最多有可能遍历100001000000次,效率很差.
再如:A表有10000条记录,B表有100条记录,那么最多有可能遍历10000100次,遍历次数大大减少,效率大大提升.
结论:in()适合B表比A表数据小的情况
select a.* from A a where exists(select 1 from B b where a.id=b.id)
以上查询使用了exists语句,exists()会执行A.length次,它并不缓存exists()结果集,因为exists()结果集的内容并不重要,重要的是结果集中是否有记录,如果有则返回true,没有则返回false.
它的查询过程类似于以下过程
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;
当B表比A表数据大时适合使用exists(),因为它没有那么遍历操作,只需要再执行一次查询就行.
如:A表有10000条记录,B表有1000000条记录,那么exists()会执行10000次去判断A表中的id是否与B表中的id相等.
如:A表有10000条记录,B表有100000000条记录,那么exists()还是执行10000次,因为它只执行A.length次,可见B表数据越多,越适合exists()发挥效果.
再如:A表有10000条记录,B表有100条记录,那么exists()还是执行10000次,还不如使用in()遍历10000*100次,因为in()是在内存里遍历比较,而exists()需要查询数据库,我们都知道查询数据库所消耗的性能更高,而内存比较很快.
结论:exists()适合B表比A表数据大的情况
当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用.
查询例子
求至少选修了学号为“090120206”的学生所选修全部课程的学号和姓名。
select sno,sname from student s where not exist
(select * from student_course sc1 where sno = "“090120206" and not exist
(select * from student_course sc2 where s.sno = sc2.sno and sc1.ccno = sc2.ccno))
/查询至少选修两门课程的学生学号/
select sno,count(ccno) 选修门数 from SC
group by sno
having count(ccno)>=2
SQL中in与exist的区别相关推荐
- sql中exits和in的区别
sql中exits和in的区别 转:http://hi.baidu.com/delphi_relive/blog/item/d7c0034a49c4932208f7ef21.html in 和 exi ...
- SQL中where与having的区别
SQL中where与having的区别 目录 SQL中where与having的区别 创建表 插入数据 进行聚合操作 # WHERE是在聚合之前进行数据行的过滤而HAVING实在聚合之后进行新数据的过 ...
- SQL中modify和alter用法区别
SQL中modify和alter用法区别 1. 所属能力大小不同: modify:只能用于修改字段的属性 例如:把age字段变为非空(针对persons表中的age这一个字段进行修改) ALTER T ...
- 数据库查询语句SQL中like、%、-的区别
数据库查询语句SQL中like.%.-的区别 数据库查询语句SQL中like.%.-的区别 %百分号通配符:表示任何字符出现任意次数(可以是0次) SQL 语句选取 name 以字母 "k& ...
- sql中=null和is null区别
sql中=null和is null区别 前言 关于sql语句对null的处理尤其小心,这个null处理的知识点我看了好几次,但是很容易再次犯错,这次记录一个点, 因为这个错误是我看一个帖子看到的错误的 ...
- sql中exists替换in的区别
在sql中使用exists替换in查询时要注意使用exists时一定要关联主查询和子查询的关联不然查询会得不到相应的结果如下语句: 语句一使用in查询: select realname from ...
- 《小常识-23》sql中any与some的区别
#在 SQL 中 ANY 和 SOME 是同义词,所以下面介绍的时候只使用 ANY,SOME 的用法 #和功能和 ANY 一模一样.和 IN 运算符不同,ANY 必须和其他的比较运算符共同使用,而 # ...
- sql中in和exist语句的区别?
两者都能实现表功能查询,主要区别如下: 1.适用表的类型不同. in是子查询为驱动表,外面的表为被驱动表,故适用于子查询结果集小而外面的表结果集大的情况. exists是外面的表为驱动表,子查询里面的 ...
- sql中 set 和select 的区别
SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT. 对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们 并没有注意,其实这 ...
最新文章
- 【组队学习】10月份微信图文索引
- Paxos算法之旅(四)zookeeper代码解析--转载
- Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd
- 手机的次世代竞争年代
- 分布式服务常见问题—访问量统计如何做?
- HDU - 6184 Counting Stars(思维+三元环)
- 为什么用链路聚合_H3C ComwareV7平台网络设备可靠性配置——链路聚合
- scala中的match
- Js 模式对话框(转)
- 【证明】两个自变量的二阶线性方程经过可逆变换后方程的类型不会改变
- Centos7#Linux基础富文本笔记
- Eclipse Paho MQTT客户端Java源码分析
- ORACLE表空间和表碎片分析及整理方法
- 高压带电显示器局放检测面板式四合一局放在线监测/带电故障显示/无线测温装置
- win10 OCX控件的注册
- 【MockJS】使用MockJS模拟数据 (超级详细)
- 5、使用bean的scop属性来配置bean的作用域
- android 11.0 12.0app应用安装白名单
- 张岩 - 老家 和 林青 - 老家
- 关于请求URL过长报414的问题