首页
学习
活动
专区
圈层
工具
发布

数据库 SQL中IN和EXISTS用法的区别

in: in是把外表和内表做hash连接,先查询内表,再把内表结果与外表匹配,他是先将数据督导内存中,然后取与外表匹配。...他要执行的次数是外表的长度*内表结果的长度 exists: exists是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表的查询使用的索引,他只需要执行的次数是外表的长度...-------------------------- select * from A where id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有...id字段并缓存起来.之后,检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录....如:A表有10000条记录,B表有1000000条记录,那么exists()会执行10000次去判断A表中的id是否与B表中的id相等.

1.9K30

SQL中的in与not in、exists与not exists的区别以及性能分析

1、in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。...end if end loop 对于in 和 exists的性能区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用...例如下面语句,看他们的区别: select x,y from t; 查询x和y数据如下: x y ------ ------ 1 3 3 1 1 2 1 1 3 1 5 使用not...所以要具体需求来决定 对于not in 和 not exists的性能区别: not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大...如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN 在基于成本的应用中较好

3.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    SQL 中的in与not in、exists与not exists的区别以及性能分析

    1、in 和 exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。...end if  end loop  对于in 和 exists的性能区别 ---- 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大...例如下面语句,看他们的区别: select x,y from t;  查询x和y数据如下: x y  ------ ------  1 3  3 1  1 2  1 1  3 1  5  使用not in...对于not in 和 not exists的性能区别: not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多...如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN 在基于成本的应用中较好

    2.9K00

    SQL中的in与not in、exists与not exists的区别以及性能分析

    1、in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。...end if end loop 对于in 和 exists的性能区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用...例如下面语句,看他们的区别: select x,y from t; 查询x和y数据如下: x y ------ ------ 1 3 3 1 1 2 1 1 3 1 5 使用not...所以要具体需求来决定 对于not in 和 not exists的性能区别: not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大...如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN 在基于成本的应用中较好

    1.4K30

    SQL中的in与not in、exists与not exists的区别以及性能分析

    1、in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。...end if end loop 对于in 和 exists的性能区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用...例如下面语句,看他们的区别: select x,y from t; 查询x和y数据如下: x y ------ ------ 1 3 3 1 1 2 1 1 3 1 5 使用not...所以要具体需求来决定 对于not in 和 not exists的性能区别: not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大...如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN 在基于成本的应用中较好

    10.5K20

    SQL 中 EXISTS 用法详解

    EXISTS 语句是对外表作 loop 循环,每次 loop 循环再对内表进行查询。或许你一直认为 EXISTS 比 IN 语句的效率要高,这种说法是不准确的。 那到底该如何选择呢?...如果查询的两个表大小相当,那么用 EXISTS 和 IN 差别不大 如果两个表中一个较小,一个是大表,则子查询表大的用 EXISTS,子查询表小的用 IN 来看两个示例,假设 表 t1 为小表,表 t2...where exists(select id from t1 where id=t2.id) //效率低,用到了 t1 表上 id 列的索引。...上述示例中,在大表查询中使用了索引的用法效率更高。 NOT EXISTS 就像 EXIST 可以用来替换 IN 一样, NOT IN 也可以用 NOT EXIST来替换。...如果查询语句使用了 NOT IN 那么内外表都进行全表扫描,没有用到索引;而 NOT EXISTS 的子查询依然能用到表上的索引。

    18.3K21

    SQL优化——IN和EXISTS谁的效率更高

    IN和EXISTS被频繁使用在SQL中,虽然作用是一样的,但是在使用效率谁更高这点上众说纷纭。下面我们就通过一组测试来看,在不同场景下,使用哪个效率更高。...从两次测试来看,并不能说明谁的效率更高,而应该具体情况具体分析: 首先来看IN和EXISTS的执行原理: IN是做外表和内表通过Hash连接,先查询子表,再查询主表,不管子查询是否有数据,都对子查询进行全部匹配...原理 exists()的执行过程中,并没有对每一条内表的数据都进行查询,而是存在该条数据的时候会将结果集存起来,到最后的时候同一输出结果集。...A表有10000条记录,B表有1000000条记录, 那么exists()会执行10000次去判断A表中的id是否与B表中的id相等。...# 总结 # 1、IN查询在内部表和外部表上都可以使用到索引; 2、EXISTS查询仅内部表上可以使用到索引,外表会全表扫描;当子查询结果集很大,而外部表较小的时候,EXISTS的Block Nested

    6.9K30

    MySQL(七)|MySQL中In与Exists的区别(1)

    t2 WHERE t1.task_id = t2.id); 这里涉及到IN和EXISTS的区别。...select * from user where exists (select 1); 对user表的记录逐条取出,由于子条件中的select 1永远能返回记录行,那么user表的所有记录都将被加入结果集...使用了t2(B)表索引 三、结论 MySQL中的in语句是把外表和内表作join连接,而exists语句是对外表作nest loop循环,每次loop循环再对内表进行查询。...《高性能MySQL》书籍上对于in和exists的描述 书上说,MySQL会把in的查询语句改成exists再去执行(实际上我们在没有索引情况下,他们的执行过程确实是一致的) 在《MySQL技术内幕:SQL...不过对于下次处理类似的问题时,我已经有对应的处理方案: 根据具体的业务情况,分析出它对应可用的经验法则,再进行不断的测试和调优,选出最优的SQL。 而不仅仅是选择相信经验法则。

    19.2K71

    MySQL(八)|MySQL中In与Exists的区别(2)

    关于In与Exists的比较,先说结论,归纳出IN 和Exists的适用场景: 1)IN查询在内部表和外部表上都可以使用到索引。 2)Exists查询仅在内部表上可以使用到索引。...以下是原文,之前和我一起讨论这个问题的朋友在跟他公司DBA讨论并做了几次实验之后整理的文章如下: ---- 背景介绍 最近在写SQL语句时,对选择IN 还是Exists 犹豫不决,于是把两种方法的SQL...实验过程 实验针对相同结果集的IN和Exists 的SQL语句进行分析。...原因分析 两者的索引使用情况跟第一次实验是一致的,唯一区别是子查询筛选结果集的大小不同,但实验结果已经跟第一次的不同了。...MySQL查询语句中的IN 和Exists 对比分析 实验结论 根据上述两个实验及实验结果,我们可以较清晰的理解IN 和Exists的执行过程,并归纳出IN 和Exists的适用场景: IN查询在内部表和外部表上都可以使用到索引

    5.6K40

    图解sql中的where和on的区别

    经常会有读者有疑问,sql中关联条件是放where后面好,还是on后面好?今天就通过图形的方式给大家来解决这个问题。 之前两章我们通过图解SQL的执行顺序和JOIN的原理知道了这两步的执行过程。...我们还是以上一章的例题来讲解: 因为在sql的内连接阶段,左表(a)和右表(b)通过笛卡尔积生成的虚表VT-A1, VT-A1 在经过内连接后会将虚表VT-A1中符合条件 (a.CustomerID=b.CustomerID...表)未关联上的其它所有数据都要添加到虚表VT-B1-1中的,所以在执行完LEFT动作之后,它的结果变成了虚表VT-B2。...在理解了LEFT JOIN,RIGHT JOIN和INNER JOIN的原理后,再来看WHERE和ON的区别就比较容易理解了。...结论 1、对于内连接(inner join),sql过滤条件放在where或者on后面没有区别 2、对于左右连接(left/right join),sql过滤条件放在where或者on后面有很大的区别。

    2K11

    SQL Server 性能优化之——T-SQL NOT IN 和 NOT Exists

    这次介绍一下T-SQL中“Not IN” 和“Not Exists”的优化。 Not IN 和 Not Exists 命令 : 有些情况下,需要select/update/delete 操作孤立数据。...孤立数据:不存在主表中而存在其关联表中。 操作这样的数据,一般第一反应是利用“Not in” 或 “Not Exists”命令。...选择NOT IN 还是 NOT Exists 现在SQL Server 中有两个命令可以使用大数据的插入、更新、删除操作,性能方面比NOT IN有很大的提高,语法简单比NOT Exists好很多,写出来的语句看上去很清爽...但是Merge 和Except 两个命令在大数据的处理方面的性能,要比 Not IN 好很多,代码简洁程度上,要比和Not EXISTS好很多。不管你信不信,反正我信了!!!  ...上测试数据喽:Test1中有400000条数据,Test2中有500000条数据其中100000条数据的name是不同  Select Not IN:18秒 ?

    4.9K71

    SQLServer 中 exists 和 except 用法

    内容声明本文仅用于技术分享和学习交流,内容不包含任何广告、推广、引流、付费课程或外链信息。所有示例和配置均为技术实践,欢迎参考和自定义。...EXCEPT 自动去重,NOT EXISTS 则不会,文中附相关 SQL 示例与测试数据。一、exists1.1 说明EXISTS (包括 NOT EXISTS) 子句的返回值是一个 BOOL 值。...,只要 exists 引导的子句有结果集返回,那么 exists 这个条件就算成立了,大家注意返回的字段始终为 1,如果改成 select 2 from grade where ......EXISTS = IN,意思相同不过语法上有点点区别,好像使用 IN 效率要差点,应该是不会执行索引的原因。.../INTERSECT 的「查询开销」会比 NOT EXISTS/EXISTS 大很多。

    66410

    如何用外部程序优化SQL语句中的IN和EXISTS

    数据结构 IN 和 EXISTS 是 SQL 中常见的复杂条件,在将 SQL(存储过程)转换成库外计算获取高性能时也会面对这些问题。...此例中的 ORDERS 表和 LINEITEM 表是按照 ORDERKEY 同序存放,可以利用此方法来做优化。...集算器实现(1): 集算器实现(2): EXISTS 等值条件 此章节的优化思路和 IN 子查询的优化思路是相同的,事实上这种 EXISTS 也都可以用 IN 写出来(或者倒过来,把 IN 用...此例中的 ORDERS 表和 LINEITEM 表是按照 ORDERKEY 同序存放,可以利用此方法来做优化。...集算器实现: 总结 在没有空值的时候带子查询的 IN 都可以用 EXISTS 描述,同一个查询需求用 IN 描述和用 EXISTS 描述翻译成的集算器代码是相同的,所以我们只要弄清楚 EXISTS

    1.6K10

    MyBatis的SQL映射文件中,`#`和`$`符号的区别

    在MyBatis的SQL映射文件中,#和$符号用于处理SQL语句中的参数替换,但它们的工作方式和使用场景有所不同。#{} 符号预编译参数:#{} 被用来作为预编译SQL语句的占位符。...示例:SELECT * FROM ${tableName} WHERE status = 'active'在这个例子中,${tableName}将被直接替换为具体的表名字符串。...使用建议尽量使用#{},因为它更安全,可以防止SQL注入。只有当你确实需要动态地构建SQL语句的一部分(比如表名、列名等)时,才使用${},并且要确保这部分输入是安全可控的,以避免SQL注入风险。...实际应用中的考虑在你的SQL映射文件中,如果涉及到条件判断并根据不同的情况选择使用#还是$,请务必小心。...对于非'STRING'类型的处理,则安全地使用了#{item.value}。确保在使用${}时已经采取了足够的措施来验证和净化数据,以保护应用程序免受SQL注入攻击。

    99910

    sql中的过滤条件放在on和where的区别

    最近遇到相关业务,想揪一下sql的中的left join 或者right join 或者inner join 中的 on和where的区别,想了解这个首先我们要了解两个基础的知识。...1.join的三种连接方式的区别: left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录...笛卡尔积:两个[集合]*X*和*Y*的笛卡尓积(Cartesian product),又称[直积],表示为*X* × *Y*,第一个对象是*X*的成员而第二个对象是*Y*的所有可能[有序对]的其中一个成员...| 6 | 8 | 111 | | 7 | 11 | 222 | | 8 | 13 | 12 | +----+------+--------+ 下面我们来执行sql...和 where 是没有区别的 下面我们来执行sql语句看看 left join select a.

    5.4K10
    领券