Mysql中用exists代替in;exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当exists里的条件语句能够返回记录行时,条件就为真,返回当前loop到的这条记录。

本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。
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
乐活途购物分享社区
beta v1.1版本为第一个版本,简单的整合了基础功能,各位站长拿到程序后,不要纠结后台的功能简单,后续将不断更新扩展。在beta v1.1版本使用过程中遇到什么问题,请登录 www.loftto.com 进行反馈! 安装说明######重要提醒:程序不支持二级目录安装,请使用一级目录或二级目录绑定!#第一步,确定你的服务器支持PHP+mysql。#第二步,确定你的服务器开启了gd库。#第三步,
0
查看详情
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视频教程
以上就是mysql用什么代替in的详细内容,更多请关注其它相关文章!
# 的是
# seo的构思图
# 品牌网站优化资质
# 宜昌网站建设推广优化
# 福利网站建设方案怎么写
# 保山网络营销推广企业
# 杭州高级seo优化师
# 鹤壁优化网站排名哪里好
# 保定seo网站优化高手
# 网站建设的公司有几家
# 词排名seo系统
# mysql
# 主要是
# 空集
# 效率高
# 就为
# 则为
# 将被
# 表上
# 这条
# 镜像
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
Linux如何优化系统启动流程_Linux启动项优化方案
vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足
哔哩哔哩在线观看入口 B站官网免费进入
mysql离线安装后如何启动_mysql离线安装完成后启动服务的方法
Pandas中基于动态偏移量实现DataFrame列值位移的策略
曝《丝之歌》DLC有望开发!开发商还有神秘新企划
百度网盘网页入口链接分享 百度网盘官网入口网页登录
《米姆米姆哈》米姆获取及技能攻略
composer 提示 "requires ext-soap" 缺少 SOAP 扩展怎么办?
《随手记》启用语音备注方法
WPS长文档分栏排版不乱方法_WPS分栏+分节符报纸排版教程
更换小红书群背景怎么换?小红书群规则怎么设置?
食品生产用水只要符合国家规定的生活饮用水卫生标准就可以吗
123网页端官方登录页 123邮箱网页版即时通讯服务
电脑双系统如何安装和卸载 Windows和Linux双系统安装教程【详解】
口腔诊所管理软件推荐
鼠标没反应了怎么办 无线/有线鼠标失灵的解决方法【详解】
抖音视频如何添加标题?添加标题有哪些好处?
C++ priority_queue怎么用_C++优先队列底层实现与自定义比较器
《幻兽帕鲁》手游帕鲁捕捉技巧分享
什么是Satis,如何用它搭建一个私有的composer仓库?
Excel宏怎么删除_Excel中删除宏的详细操作流程
mysql镜像配置如何恢复数据_mysql镜像配置数据恢复详细流程
《美篇》取消会员自动续费方法
windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化
《深林》冬季章节图文攻略
J*aScript对象中深度嵌套URL键的查找与更新策略
实现二叉树的层序插入:基于树大小的路径导航
C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧
自定义你的VS Code状态栏,监控关键信息
macosmonterey系统外接显示器驱动怎么安装_macosmonterey外接显示器驱动与分辨率调整
多闪APP官方下载安装入口_多闪最新版本获取入口
C++ optional用法详解_C++17处理可能为空的返回值
邦丰播放器频道搜索设置
发布小红书怎么屏蔽粉丝?屏蔽粉丝能看到吗?
快手极速版在线体验区 快手极速版网页体验入口
J*a中的值传递到底指什么_值传递模型在参数传递中的真正含义说明
《大周列国志》皇帝律令功能介绍
支付宝网页版在线入口 支付宝官网电脑登录入口
使用逻辑应用(Logic Apps)自动处理邮件附件中的XML到Excel
《雷电模拟器》自动点击设置方法
edge浏览器怎么修改语言为中文_Edge界面语言切换教程
123平台官方登录入口 123邮箱网页端在线沟通工具
Python类装饰器动态修改方法时的类型提示:Mypy插件实现精确静态分析
Go语言中方法与接收器:指针和值类型的调用机制详解
繁花漫画使用教程
《万兴喵影》导出视频方法
《崩坏:星穹铁道》3.6版本异相仲裁打法及配队推荐
Lar*el Socialite单设备登录策略:实现用户唯一会话管理
悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口
2020-10-05
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。