广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中exists和in的区别
  • 917
分享到

MySQL中exists和in的区别

mysqlsql中inexists 2023-09-10 08:09:12 917人浏览 薄情痞子
摘要

一、in关键字 确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。 select * from A w

一、in关键字

确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

select * from A where id in (select id from B)

#等价于

  • for select id from B:先执行;
  • 子查询 for select id from A where A.id = B.id:再执行外面的查询;

执行过程:in是先查询内表【select id from B】,再把内表结果与外表【select * from A where id in …】匹配,对外表使用索引,而内表多大都需要查询,不可避免,故外表大的使用in,可加快效率。 

小总结:当A表的数据集大于B表的数据集时,用in优于exists。【in适合外部表数据大于子查询的表数据的业务场景】

二、exists关键字 

指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。

语法格式:

select ... from table where exists (subquery);

可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或者 FALSE)来决定主查询数据结果是否得到保留。

如下:

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

#等价于

  • for select id from A:先执行外层的查询;
  • for select id from B where B.id = A.id:再执行子查询;

执行过程:exists是对外表【select * from A where exists …】做loop循环,每次loop循环再对内表(子查询)【select 1 from B where B.id = A.id】进行查询,那么因为对内表的查询使用的索引(内表效率高,故可用大表),而外表有多大都需要遍历,不可避免(所以尽量用小表),故内表大的使用exists,可加快效率。

例如:

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

提示

T 清单, 因此没有区别;EXISTS (subquery) 只返回 True 或 False , 因此查询的 SELET * 也可以是SELET 1 或其他,官方说法是执行时会忽略SELEC

EXISTS 子查询的实际执行过程可能经过了优化而不是我们理解的逐条比对,如果担忧效率问题,可以进行实际检验以确定是否有效率问题;

EXISTS 子查询往往也可以使用条件表达式、其他子查询或者 JOIN 来代替,何种最优化需要具体分析;

小总结:当A表的数据集小于B表的数据集时,用exists优于in。【exist适合子查询中表数据大于外查询表中数据的业务场景】

三、in 与 exists 的区别

exists、not exists 一般都是与子查询一起使用,In 可以与子查询一起使用,也可以直接in (a,b.....)

exists 会针对子查询的表使用索引,not exists 会对主子查询都会使用索引。in 与子查询一起使用的时候,只能针对主查询使用索引,not in 则不会使用任何索引

  注意:一直以来认为 exists 比 in 效率高的说法是不准确的。

  in 是把外表和内表作 hash 连接,而 exists 是对外表作 loop 循环,每次 loop 循环再对内表进行查询。

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

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

四、总结

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

如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in;反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。

  其实我们区分 in 和 exists 主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。(都是以小表驱动大表);

in 是把外表和内表作 hash 连接,而 exists 是对外表作 loop 循环,每次 loop 循环再对内表进行查询。一直以来认为 exists 比 in 效率高的说法是不准确的。

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

来源地址:https://blog.csdn.net/m0_50370837/article/details/124239171

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中exists和in的区别

本文链接: https://www.lsjlt.com/news/402148.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • MySQL中exists和in的区别
    一、in关键字 确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。 select * from A w...
    99+
    2023-09-10
    mysql sql中in exists
  • MySQL中in和exists区别详解
    一、提前准备 为了大家学习方便,我在这里面建立两张表并为其添加一些数据。 一张水果表,一张供应商表。 水果表 fruits表 f_id ...
    99+
    2022-05-30
    MySQL in exists
  • mysql中in和exists的区别是什么
    这篇文章主要介绍mysql中in和exists的区别是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!exists和in的区别有:in是把外表和内表做hash连接,先查询内表;ex...
    99+
    2022-10-18
  • mysql中exists 和in的区别是什么
    今天就跟大家聊聊有关mysql中exists 和in的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  MySQL中in和exists的性...
    99+
    2022-10-18
  • in与exists和not in 与 not exists的区别
    in 与 exists:   外表大,用IN;内表大,用EXISTS;   原理:   用in:外表使用了索引,直接作hash连接;   用exists:内表使用...
    99+
    2022-01-25
    in与exists和not in not exists的区别
  • in和exists的区别以及exists和distinct去重的区别?
    小编相信大家都知道in和exists的区别:1、运用情况不同sql中in适用于子查询得出的结果集记录较少,主查询中的表较大且又有索引的表,。sql中exist适用于外层的主查询记录较少,子查询中的表大,又有...
    99+
    2022-10-18
  • Oracle中in和exists的区别是什么
    本篇文章给大家分享的是有关Oracle中in和exists的区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、第一种情况selec&...
    99+
    2022-10-18
  • MySQL中in与exists的使用及区别介绍
    先放一段代码 for(int i=0;i<1000;i++){ for(int j=0;j<5;j++){ System.out.println("hello"); } } for...
    99+
    2022-10-18
  • in, not in , exists , not exists它们有什么区别
    本篇内容介绍了“in, not in , exists , not exists它们有什么区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
    99+
    2022-10-18
  • sql中not in与not exists的区别有哪些
    这篇文章主要为大家展示了“sql中not in与not exists的区别有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“sql中not in与not ex...
    99+
    2022-10-19
  • mysql中in和or的区别有哪些
    这篇文章主要讲解了“mysql中in和or的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql中in和or的区别有哪些”吧! ...
    99+
    2022-10-19
  • 对比分析MySQL语句中的IN 和Exists
    背景介绍 最近在写SQL语句时,对选择IN 还是Exists 犹豫不决,于是把两种方法的SQL都写出来对比一下执行效率,发现IN的查询效率比Exists高了很多,于是想当然的认为IN的效率比Exists好,...
    99+
    2022-10-18
  • mysql中EXISTS和IN的使用方法比较
    1、使用方式: (1)EXISTS用法 select a.batchName,a.projectId from ucsc_project_batch a wher...
    99+
    2022-11-11
  • MySQL中exists、in及any的基本用法
    【1】exists 对外表用loop逐条查询,每次查询都会查看exists的条件语句。 当 exists里的条件语句能够返回记录行时(无论记录行是多少,只要能返回),条件就为真 ,...
    99+
    2022-11-11
  • innerjoin 和 exists的执行效率区别
    今天在实现业务时发现经常使用exists语句竟然执行效率低下根本不出结果,反而innerjoin可以瞬间得到结果。后来发现是因为exsits需要从40万的数据集中去匹配200条数据是非常消耗资源的。总结:首...
    99+
    2022-10-18
  • mysql查询条件not in 和 in的区别及原因说明
    先写一个SQL SELECT DISTINCT from_id FROM cod WHERE cod.from_id NOT IN (37, 56, 57) 今天在写SQL的时候,发现这个查的结...
    99+
    2022-05-30
    mysql 查询条件 not_in in
  • Mysql中关于on,in,as,where的区别
    目录Mysql on,in,as,where的区别Mysql语句问题解决1、left join数据筛选问题2、相同数据重复筛选使用问题3、根据某个字段排序取每个类别最后三条...
    99+
    2023-03-20
    Mysql中on Mysql中in Mysql中as Mysql中where
  • Mysql中on,in,as,where的区别是什么
    这篇文章主要讲解了“Mysql中on,in,as,where的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mysql中on,in,as,where的区别是什么...
    99+
    2023-07-05
  • python中in和is的区别点总结
    1、区别说明 in:一方面可以用于检查序列(list,range,字符串等)中是否存在某个值。也可以用于遍历for循环中的序列。 is:用于判断两个变量是否是同一个对象,如果两个对象是同一对象,则返回True,否则返...
    99+
    2022-06-02
    python in is
  • python中in和is有哪些区别
    这篇文章主要介绍了python中in和is有哪些区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、区别说明in:一方面可以用于检查序列(list,range,字符串等)中...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作