加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql能够用什么代替in

发布时间:2022-03-01 13:06:01 所属栏目:MySql教程 来源:互联网
导读:这篇文章主要介绍mysql可以用什么代替in,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! Mysql中用exists代替in;exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当exists里的条件语句能够返回记录行时,条件就为
       这篇文章主要介绍mysql可以用什么代替in,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
 
       Mysql中用exists代替in;exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当exists里的条件语句能够返回记录行时,条件就为真,返回当前loop到的这条记录。
 
       exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录,反之如果exists里的条 件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件,当能返回结果集则为true,不能返回结果集则为 false
 
如下:
 
select * from user where exists (select 1);
       对user表的记录逐条取出,由于子条件中的select 1永远能返回记录行,那么user表的所有记录都将被加入结果集,所以与 select * from user;是一样的
 
又如下
 
select * from user where exists (select * from user where userId = 0);
可以知道对user表进行loop时,检查条件语句(select * from user where userId = 0),由于userId永远不为0,所以条件语句永远返回空集,条件永远为false,那么user表的所有记录都将被丢弃
 
not exists与exists相反,也就是当exists条件有结果集返回时,loop到的记录将被丢弃,否则将loop到的记录加入结果集
 
总的来说,如果A表有n条记录,那么exists查询就是将这n条记录逐条取出,然后判断n遍exists条件
 
select * from user where userId not in (1, 2, 3);
等效于
 
select * from user where userId != 1 and userId != 2 and userId != 3;
总的来说,in查询就是先将子查询条件的记录全都查出来,假设结果集为B,共有m条记录,然后在将子查询条件的结果集分解成m个,再进行m次查询
 mysql能够用什么代替in
值得一提的是,in查询的子条件返回结果必须只有一个字段,例如
 
select * from user where userId in (select id from B);
而不能是
 
select * from user where userId in (select id, age from B);
而exists就没有这个限制
 
大概就是这么个意思,其实可以看到,查询1主要是用到了B表的索引,A表如何对查询的效率影响应该不大
 
假设B表的所有id为1,2,3,查询2可以转换为
 
select * from A where A.id = 1 or A.id = 2 or A.id = 3;
这个好理解了,这里主要是用到了A的索引,B表如何对查询影响不大
 
下面再看not exists 和 not in
 
1. select * from A where not exists (select * from B where B.id = A.id);
 
2. select * from A where A.id not in (select id from B);
 
看查询1,还是和上面一样,用了B的索引
 
而对于查询2,可以转化成如下语句
 
select * from A where A.id != 1 and A.id != 2 and A.id != 3;
可以知道not in是个范围查询,这种!=的范围查询无法使用任何索引,等于说A表的每条记录,都要在B表里遍历一次,查看B表里是否存在这条记录
 
故not exists比not in效率高
 
mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!