我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mysql可以用什么代替in

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mysql可以用什么代替in

这篇文章主要介绍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条件

in查询相当于多个or条件的叠加,这个比较好理解,比如下面的查询

select * from user where userId in (1, 2, 3);

等效于

select * from user where userId = 1 or userId = 2 or userId = 3;

not in与in相反,如下

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次查询

值得一提的是,in查询的子条件返回结果必须只有一个字段,例如

select * from user where userId in (select id from B);

而不能是

select * from user where userId in (select id, age from B);

而exists就没有这个限制

下面来考虑exists和in的性能

考虑如下SQL语句

1: select * from A where exists (select * from B where B.id = A.id);

2: select * from A where A.id in (select id from B);

查询1.可以转化以下伪代码,便于理解

for ($i = 0; $i < count(A); $i++) {
  $a = get_record(A, $i); #从A表逐条获取记录
  if (B.id = $a[id]) #如果子条件成立
    $result[] = $a;
}
return $result;

大概就是这么个意思,其实可以看到,查询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语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。

如果查询的两个表大小相当,那么用in和exists差别不大

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

例如:表A(小表),表B(大表)

1:

select * from A where cc in (select cc from B) 效率低,用到了A表上cc列的索引;

select * from A where exists(select cc from B where cc=A.cc) 效率高,用到了B表上cc列的索引。

相反的

2:

select * from B where cc in (select cc from A) 效率高,用到了B表上cc列的索引;

select * from B where exists(select cc from A where cc=B.cc) 效率低,用到了A表上cc列的索引。

not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快

in 与 =的区别

select name from student where name in ('zhang','wang','li','zhao');

select name from student where name='zhang' or name='li' or name='wang' or name='zhao'

的结果是相同的。

以上是mysql可以用什么代替in的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mysql可以用什么代替in

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

sql中的in可以用什么代替

使用 or 运算符可以替代 sql 中的 in 运算符,从而有效率地检查一个值是否包含在指定列表中。or 运算符的优势在于语法直观、易于使用,尤其是在列表值较多时。需要注意的是,or 运算符只能用于比较单个列,且在列表中包含 null 时必
sql中的in可以用什么代替
2024-05-02

sql中的in可以用什么代替数据

对于 sql 中的 in 替代选项,可考虑以下建议:使用 or 代替较小的值集合;用 case when 创建动态查询,根据条件更改值匹配;利用 join 优化涉及多个表的查询,尤其在值集合较大时;借助 exists 检查子查询中是否存在与
sql中的in可以用什么代替数据
2024-05-08

sql中or可以用什么代替

sql 中 or 运算符的替代方案包括:1. union:合并查询结果并丢弃重复记录;2. in:检查值是否包含在指定列表中;3. case when:根据条件返回不同值;4. 子查询:嵌套查询来使用其他查询的结果。SQL 中 or 的替代
sql中or可以用什么代替
2024-05-08

sql中in用什么代替

sql 中 in 运算符的替代方案包括 exists 子查询、case 表达式和 or 运算符。替代方案的选择取决于性能、灵活性、可维护性等因素,通常 in 运算符是首选,但替代方案在某些情况下提供了更好的解决方案。SQL 中 IN 的替代
sql中in用什么代替
2024-05-02

可以使用什么关键字代替 MODIFY 来修改 MySQL 表的列?

我们可以使用关键字 CHANGE 来修改现有表的列。使用 CHANGE 关键字,我们可以更改列的名称及其定义。它的语法与带有 MODIFY 关键字的 ALTER TABLE 的语法有点不同。语法Alter table table_name
2023-10-22

当sessionstorage不可用时,有哪些可替代的方案可以使用?

sessionStorage 是 HTML5 提供的一种用于在客户端存储数据的机制。然而,在某些情况下,sessionStorage 可能无法使用,这可能会导致一些问题。在本文中,我们将探讨一些替代方案,以解决在 sessionstorag
当sessionstorage不可用时,有哪些可替代的方案可以使用?
2024-01-15

软考可以用其他证件代替身份证吗?

  软考可以用其他证件代替身份证吗?软考没有身份证用其他证件可不可以呢?今天编程学习网小编来为大家解答。  软考在报名的时候需要填个人的身份信息,也包括身份证号。那么,软考考试的时候是不是也只能带身份证呢?  参加软考的考生必须携带准考证和有效身份证件,按照准考证上规定的时间到指定的考场参加考试。“两证&rdq
软考可以用其他证件代替身份证吗?
2024-04-18

用什么可以代理阿里云ip

1.使用代理服务器代理服务器是一种位于客户端和目标服务器之间的中间服务器,可以通过转发客户端的请求来隐藏客户端的真实IP地址。你可以使用一些代理服务器来代理阿里云IP,例如:VPN(VirtualPrivateNetwork,虚拟私人网络):通过在客户端和目标服务器之间建立加密隧道,将客户端的请求转发到目标服务器,同时
2023-10-27

SOCKS5代理IP可以干什么

这篇文章主要介绍“SOCKS5代理IP可以干什么”,在日常操作中,相信很多人在SOCKS5代理IP可以干什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SOCKS5代理IP可以干什么”的疑惑有所帮助!接下来
2023-06-20

云服务器cvm实例的计费模式有哪些功能可以用什么代替

按小时计费模式这种计费模式适用于需要实时处理大量数据的云服务器Cvm实例。对于那些需要实时响应用户请求的云服务器Cvm实例,这种计费模式可以提供更高的灵活性和成本效益。例如,对于一些需要高并发的应用程序,如Web服务器或数据库服务器,按小时计费模式可以帮助企业降低成本。按服务计费模式这种计费模式适用于那些只提供某种特定
云服务器cvm实例的计费模式有哪些功能可以用什么代替
2023-10-28

我们可以在 MySQL 过程中使用“IF NOT IN”吗?

让我们首先看看 MySQL 中 IF NOT IN 的语法 -if(yourVariableName NOT IN (yourValue1,yourValue2,........N) ) thenstatement1elsestatem
2023-10-22

有什么办法可以获取代理ip

这篇文章主要讲解了“有什么办法可以获取代理ip”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有什么办法可以获取代理ip”吧!很多人都想用ip,有很多方法,比如,我们去找免费的ip,当然这种方
2023-06-20

什么情况下可以用免费代理服务ip

这篇文章主要讲解了“什么情况下可以用免费代理服务ip”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么情况下可以用免费代理服务ip”吧!通常在网络上使用代理服务器,能在哪里看到它们起作用?许
2023-06-20

编程热搜

目录