in和exists的区别
新建两个表
user表
account表
in
SELECT * FROM user u where u.id in (select user_id from account )
查询结果
查询过程:
- 先查子查询,即执行
select user_id from account
- 查父查询,即执行
SELECT * FROM user u
- 两个查询形成笛卡尔积,按照条件
u.id = user_id
进行筛选,也就是对于父查询的每一条记录,如果其中的u.id在子查询的结果集合中,则输出这条记录。
exists
select * from user u where exists(select * from account a where u.id = a.id )
查询结果
结果与in相同
查询过程
- 先进行父查询,即
select * from user u
- 对于父表的每一条记录都进行子查询,即
select * from account a where u.id = a.id
对每一次子查询都进行判断,如果查出结果,返回true,输出父查询的语句。
注意:
这里的子查询select和from之间可以是任意字段,因为exists返回的是true和false,不是结果集。只是证明它存在。
总结
in
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in
exists
如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists