sql中in()效率低?

我写sql是select~~~where字段notin(select字段~~~~)然后老员工说这样效率低那如果不这么写还能怎么写呢~~~~那用exists和表连接效率就高... 我写sql 是select~~~ where 字段 not in(select 字段 ~~~~)
然后老员工说这样效率低
那如果不这么写 还能怎么写呢~~~~
那用exists和表连接效率就高?
select a.* from a where exists (select 1 from b where a.id<>b.id)不等于not in么
展开
 我来答
wforce
推荐于2017-04-18 · TA获得超过843个赞
知道小有建树答主
回答量:672
采纳率:0%
帮助的人:785万
展开全部
对于in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
lopezzhy
2010-06-11 · TA获得超过4509个赞
知道小有建树答主
回答量:837
采纳率:0%
帮助的人:1135万
展开全部
这个其实是根据SQL SEVER的执行计划来的 举个例子你就明白了

select~~~from 表1 where 字段 not in(select 字段 ~~from 表2~~)
程序的操作过程:
从表1中取出第1条记录 然后再去执行select 字段 ~~from 表2~ 获得结果集 假设是X 比对记录1中的这个值是否存在于结果集X中
取出第2条记录 执行select 字段 ~~from 表2~ 获得结果集X 比对记录2中的这个值是否存在于结果集X中
然后第3条...
看出问题在哪么?
问题是 他每次都执行一遍 "select 字段 ~~from 表2~" 你说速度能快么?

推荐做法

select a.*
from table1 a
left join (select PK from table2) b on a.PK=b.PK
where b.PK is null

这里select PK from table2只需要做一遍 速度要快一些
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
CloudPRose
2010-06-12 · TA获得超过5175个赞
知道大有可为答主
回答量:3175
采纳率:66%
帮助的人:868万
展开全部
还是wforce说的是那么回事,纯粹脱离语境讨论谁效率低是无稽之谈,要真如此,还不如取消IN语句。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
华夏日长兴
2010-06-11 · TA获得超过9592个赞
知道大有可为答主
回答量:6305
采纳率:85%
帮助的人:3685万
展开全部
select a.* from a where a.id in (select b.id from b)
改成

select a.* from a where exists (select 1 from b where a.id=b.id)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式