mysql exist和in的区别
表展示
首先,查询中涉及到的两个表,一个user和一个order表,具体表的内容如下:
user表:
order表:
in
确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。
具体sql语句如下:
SELECT*FROM`user`WHERE`user`.id IN (SELECT`order`.user_idFROM`order`)
这条语句很简单,通过子查询查到的user_id 的数据,去匹配user表中的id然后得到结果。该语句执行结果如下:
它的执行流程是什么样子的呢?让我们一起来看一下。
首先,在数据库内部,查询子查询,执行如下代码:
SELECT
`order`.user_id
FROM
`order`
执行完毕后,得到结果如下:
此时,将查询到的结果和原有的user表做一个笛卡尔积,结果如下:
此时,再根据我们的user.id IN order.user_id的条件,将结果进行筛选(既比较id列和user_id 列的值是否相等,将不相等的删除)。最后,得到两条符合条件的数据。
exists
指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
具体sql语句如下:
SELECT`user`.*FROM`user`WHEREEXISTS (SELECT`order`.user_idFROM`order`WHERE`user`.id = `order`.user_id)
这条sql语句的执行结果和上面的in的执行结果是一样的。
但是,不一样的是它们的执行流程完全不一样:
使用exists关键字进行查询的时候,首先,我们先查询的不是子查询的内容,而是查我们的主查询的表,也就是说,我们先执行的sql语句是:
SELECT `user`.* FROM `user`
得到的结果如下:
然后,根据表的每一条记录,执行以下语句,依次去判断where后面的条件是否成立:
EXISTS (
SELECT
`order`.user_id
FROM
`order`
WHERE
`user`.id = `order`.user_id
)
如果成立则返回true不成立则返回false。如果返回的是true的话,则该行结果保留,如果返回的是false的话,则删除该行,最后将得到的结果返回。
区别及应用场景
in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
mysql exist和in的区别相关推荐
- mysql社区版与cluster 区别_MySQL版本Enterprise/Community/Cluster等版本的区别
MySQL分为多种版本如Community.Enterprise.Cluster和Workbench等,MySQL不同版本有什么区别?LAMPLNMP分享: MySQL版本区别 ● MySQL Com ...
- SQL Server 和 MySql 语法和关键字的区别
(1) MySQL的ifnull()函数对应sql的isnull()函数; (2) mysql的存储过程中变量的定义去掉@; (3) mysql的每句结束要用";" ...
- php里面sql是什么意思,MySQL和SQL是什么?MySQL和SQL之间的区别有哪些
MySQL和SQL之间的区别有哪些?很多PHP的初学者,对MySQL,MyAdmin和SQL有什么区别并不是很清楚?下面 第一PHP社区 就带领大家来学习一下MySQL和SQL之间的区别.[推荐阅读: ...
- oracle数据库跟mysql的区别_关于Oracle数据库与MySQL数据库的几点区别
Oracle数据库与MySQL数据库的区别是本文我们主要要介绍的内容,接下来我们就开始介绍这部分内容,希望能够对您有所帮助. Oracle与MySQL的区别: 1.在Oracle中用select * ...
- MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
深入理解MySQL的数据库引擎的类型 作者: 字体:[增加 减小] 类型:转载 本篇文章是对MySQL的数据库引擎的类型进行了详细的分析介绍,需要的朋友参考下 你能用的数据库引擎取决于mysql在 ...
- MySQL - change 和 modify 的区别
表描述 MySQL 中 change 和 modify 区别 更改列名 change: alter table 表名 change 旧列名 新列名 类型 只更改列属性 change: alter ta ...
- SQL、MySQL与HiveSQL的使用区别ing
SQL.MySQL与HiveSQL的使用区别 1 查询结果前10条数据 2 返回是周几的函数 3 查看表结构数量 4 获取当前时间 5 从数据库定位到某张表 6 分号字符: 7 IS [NOT] NU ...
- mysql 、oracle存储过程语法区别
mysql .oracle存储过程语法区别 1. 条件语句:mysql使用elseif关键字,oracle是elsif关键字: oracle: if表达式 then 表达式: elsif 表达式: ...
- MySQL与Oracle的应用区别
关系型数据库(Oracle与MySQL优缺点.使用区别) MySQL的特点 1.性能卓越,服务稳定,很少出现异常宕机: 2.开放源代码无版本制约,自主性及使用成本低: 3.历史悠久,社区和用户非常活跃 ...
- mysql社区版与cluster 区别_MySQL版本Enterprise/Community/Cluster有何区别
MySQL版本Enterprise/Community/Cluster有何区别 发布时间:2020-05-28 14:23:34 来源:PHP中文网 阅读:278 作者:三月 下面讲讲关于MySQL版 ...
最新文章
- SQL优化的一些知识
- 高级指令——kill指令、ifconfig指令、reboot指令、shutdown指令、uptime指令、uname指令
- Spring配置文件中bean标签的scope属性
- php推送示例wordpress,给WordPress的编辑后台添加提示框的代码实例分享
- 渭南师范计算机科学与技术,渭南师范学院计算机科学与技术专业2016年在陕西理科高考录取最低分数线...
- 2017 年度编程语言榜,Java 最流行、JavaScript 最没价值?
- php中文分词类 关键词提取,php如何使用PHPAnalysis提取关键字中文分词
- colorWithAlphaComponent
- foxmail邮件加载失败重试_Foxmail提示错误的解决方案
- 【Chromium中文文档】线程
- 经典排序算法(十二)--地精排序Gnome Sort
- mvc+EF实现简单的登陆功能
- java读取资源文件(Properties)
- jvm 字节码jclasslib解读
- 互联网晚报 | 9月1日 星期四 |​ 刘畊宏带货假燕窝公司已被吊销;比亚迪回应巴菲特减持;华为打车将全国扩张...
- 禅道和xxd(喧喧)两台主机服务器采坑记!
- [SHELL]: ln 命令详解
- Linux通过wine运行QQ,Ubuntu安装wine运行QQ和微信
- 怎么将sql文件加载到数据库
- Android插件化动态加载apk
热门文章
- 阿里2018校招编程题
- 线程中yield的用法
- SpringMVC——架构,搭建,SSM搭建,POST请求乱码问题,参数转换器
- 201709020工作日记--synchronized、ReentrantLock、读写锁
- Git:常用命令记录
- (转载)Android开发在路上:少去踩坑,多走捷径
- Silverlight 2初尝及我的例子:Fanfou.com客户端——EatSilverlight
- [Reference][Castle AR] 1. Starter
- Python 用下划线作为变量前缀和后缀指定特殊变量
- JMS学习十一(ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer))