在SQL查询中如何使用in和exists
接触sql已经很久了,三大sql产品(sqlServer,mysql,oracle)也都用过,平时使用过程中最常用到的是oracle,但以前总是将条件查询in和exists相混淆,随意使用。在小规模数据和场景下可能影响不大,但在大表中,选择正确的关键字对查询语句的效率有极大的影响。
设A,B为数据
A的数据规模为1000W行
B的数据规模为1000行
#sql1
select a.id from A a
where a.id in (
select b.id from B
)
#sql2
select a.id from A a
where exists(
select b.id from B b,A a where a.id = b.id
)
对sql1和sql2进行效率分析:
- sql1中的select b.id from B将只执行一次,子查询的结果将被缓存至子集rs1中,select a.id from A a查询的结果将循环比对rs1中的记录,如存在则将记录加入到最终的结果集rs中,所以select b.id from B查询一次,条件遍历1000W*1000次。
- sql2中select b.id from B b,A a where a.id = b.id 将执行1000W次,每次执行不缓存结果集,因为每次子查询的where条件不一样,exists不关心结果集的内容,只关注是否存在结果。
使用建议:
- 关键字in用于A数据规模较大,B表数据规模较小的情况
- 关键字exists用于A表数据规模较小,B表数据规模较大的情况
- 当A、B表的数据规模相当时,两者的区别不大