查询: exists、in、not in 和 not exists

现在两个表`user`和`user_role`表:

user:

 

user_role:

1. 现在需要用 exists 作用子查询来查`user`表

mysql> select * from user t where exists (select * from user_role r where t.id = r.user_id);

2. 我们也可以用 in 来 查询`user`表

mysql> select * from user t where t.id in (select r.user_id from user_role r);


什么时候用 exists?什么时候用 in ?

不管是1,还是2,都要查`user`表的全部,所以主要看`user_role`表,

对于1,exists子查询,每次都需要根据`user`表的id去查询`user_role`表;

对于2,in子查询,mysql其实是在内存中匹配`user`表的id,匹配到的话则返回该条记录,所以mysql会根据

select r.user_id from user_role r

查出`user_role`表的所有user_id,它只查出一次,然后就在内存中做匹配了,所以说,如果user_role表比较小的话,那么使用 in 子查询是快于 exists 子查询的,如果user_role表数据比较大的话,还是使用exists较快的。

3. not in 和 not exists

如果子查询中使用not in,那么内外表都进行全表扫描,没有用到索引;

而使用not exists时,查询还是会使用到索引,not exists会比not in好。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值