赞
踩
- exists 主要是用作 一对一 或者 一对多的 情况下
-
- 什么是一对一,或者一对多呢
-
- 比如 现在有两个表 部门表,以及员工表。
- 部门表一般都是唯一的,而员工表 就存在 多个员工对应一个部门的情况。
- 在这种情况下,部门表 对 员工表就是一对多的关系。
-
-
-
-
- select * from A where exists(select 1 from B where A.id=B.a) ;
-
- 当B表数据较大时不适合使用in(),因为它会B表数据全部遍历一次.
- 如:A表有10000条记录,B表有1000000条记录,那么最多有可能遍历10000*1000000次,效率很差.
- 再如:A表有10000条记录,B表有100条记录,那么最多有可能遍历10000*100次,遍历次数大大减少,效率大大提升.
-
- 结论:in()适合B表比A表数据小的情况
-
-
- exists()会执行A.length次,它并不缓存exists()结果集,因为exists()结果集的内容并不重要,重要的是结果集中是否有记录,如果有则返回true,没有则返回false.
- 当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()需要查询数据库,我们都知道查询数据库所消耗的性能更高,而内存比较很快.
-
-
- 以上总结就是
-
- (1). select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
-
- T1数据量小而T2数据量非常大时,T1<<T2 时,(1)的查询效率高。
-
- (2). select * from T1 where T1.a in (select T2.a from T2) ;
-
- T1数据量非常大而T2数据量小时,T1>>T2 时, (2) 的查询效率高。
-
-
-
- 去重
-
-
-
- 一对一或者一对多去重的话,可以使用 exists 也可以 使用group by
-
-
-
- 但是 不是 一对一或者一对多去重的话 ,优化就要使用 group by 了
- 或是使用 min(rowid)
-
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。