in和exists执行时,in是先执行子查询中的查询,然后再执行主查询。而exists查询它是先执行主查询,即外层表的查询,然后再执行子查询。

exists 和 in 在执行时效率单从执行时间来说差不多,exists要稍微优于in。在使用时一般应该是用exists而不用in

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

not exists 和 not in 比较时,not exists 的效率比较高。

为了说明测试结果,我把emp1表中的数据到了315392条。emp2中删除只有2条件数据。测试的依据是执行的时间来说明的。

emp1中的数据记录情况。

SQL> select count(*) from emp1;

COUNT(*)

----------

315392

emp2中的数据记录情况:

SQL> select count(*) from emp2;

COUNT(*)

----------

2

1、  执行exists查询,要求在emp1中查询出所有存在于emp2的数据总数

SQL> select count(*) from emp1 where exists ( select null from emp2 where emp1.ename = emp2.ename);

COUNT(*)

----------

45056

执行次数十次,最大的一次为0.125S

2、    使用not exists查询出所在不在emp2中的数据总数

SQL> select count(*) from emp1 where not exists ( select null from emp2 where emp1.ename = emp2.ename);

COUNT(*)

----------

270336

执行次数十次,最大的一次为0.141S

3、执行in 查询,要求在emp1中查询出所有存在于emp2的数据总数

SQL> select count(*) from emp1 where ename in ( select ename from emp2);

COUNT(*)

----------

45056

执行十次,最大的一次为0.141S

4、使用not in查询出所在不在emp2中的数据总数

SQL> select count(*) from emp1 where ename not in ( select ename from emp2 );

COUNT(*)

----------

270336

执行十次,最长一次为0.328S

5、使用in查询,调用外层与子查询的位置,要求查询出存在于emp2中,且存在于emp1中的数据记录数

SQL> select count(*) from emp2 where ename in (select ename from emp1 );

COUNT(*)

----------

2

执行次数十次,最长的一次为0.047S

6、使用exists查询,调用外层与子查询的位置,要求查询出存在于emp2中,且存在于emp1中的数据记录数

SQL> select count(*) from emp2 where ename in (select ename from emp1 );

COUNT(*)

----------

2

执行次数十次,最长的一次为0.047S

综上所述:在使用in 和 exists时,个人觉得,效率差不多。而在not in 和 not exists比较时,not exists的效率要比not in的效率要高。

当使用in时,子查询where条件不受外层的影响,自动优化会转成exist语句,它的效率和exist一样。(没有验证)

如select * from t1 where f1 in (select f1 from t2 where t2.fx='x') 这时,认为in 和 exists效率一样。

IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

转载于:https://www.cnblogs.com/csl0910/p/4936344.html

sql中 in , not in , exists , not exists效率分析相关推荐

  1. 浅谈sql中的in与not in,exists与not exists的区别以及性能分析

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

  2. sql中 in 、not in 、exists、not exists 用法和差别

    exists (sql 返回结果集为真) not exists (sql 不返回结果集为真) 如下: 表A ID NAME 1    A1 2    A2 3  A3 表B ID AID NAME 1 ...

  3. 浅谈sql中的in与not in,exists与not exists的区别

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

  4. SQL中distinct的用法(四种示例分析)

    在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只 用它来返回不重复记录的条数,而不是用它来返回不重记录的 ...

  5. java i 什么时候变_Java中i++与++i的区别(效率分析)

    自增运算符是困扰 C 语言与 Java 语言初学者的一大难点,在我最初学习 C 语言时,一直无法理解 i++ 与 ++i 的区别. 几年的语言学习,特别是对 Java 语言的学习,对一些基本知识点有了 ...

  6. Oralce 使用SQL中的exists 和not exists 用法详解

    exists表示() 内子查询返回结果不为空,说明where条件成立就会执行sql语句:如果为空,表示where条件不成立,sql语句就不会执行. not exists和  exists相反,子查询语 ...

  7. sql中exists,not exists的用法

    exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:   select name from student where sex = 'm' and mark exists(selec ...

  8. SQL中IN与EXISTS的比较

    为什么80%的码农都做不了架构师?>>>    由于要使用 in,后来在网上找找了,发现有如下文章,大家共享一下.一起进步啦. 使用in的话,如果存在索引,和使用 join 性能差别 ...

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

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

  10. sql中exists替换in的区别

    在sql中使用exists替换in查询时要注意使用exists时一定要关联主查询和子查询的关联不然查询会得不到相应的结果如下语句:  语句一使用in查询:  select realname from ...

最新文章

  1. Maven实践:版本管理 SNAPSHOT
  2. 关于jquery动态改变css样式后,对象获取不到的解决办法
  3. python【力扣LeetCode算法题库】5- 最长回文子串
  4. Python发送邮件以及对其封装
  5. WPF 关于鼠标事件和坐标
  6. C#设计模式之单例模式
  7. 在Outlook中设置类似Foxmail带日期的签名
  8. vsphere通用配置_vSphere各版本功能对比及简介
  9. 个人课中所学vlan相关知识整理
  10. 软件工程的持续交付(CDF)和规范
  11. 软件开发有哪些规范和标准_车辆,机械专业如何从事汽车电子软件开发
  12. 拒绝LOW ---青鸟影院购票系统
  13. quartus联合仿真步骤
  14. 随便写了个猪八戒网的任务小助手“小八戒”,需要的拿去
  15. 时序动作检测SSAD《Single Shot Temporal Action Detection》
  16. python tkinter ttk的使用(下)
  17. 国际象棋棋盘 java_java绘制国际象棋与中国象棋棋盘
  18. 暴雪中国:《魔兽世界》团队正与国服地区新的潜在发行合作伙伴进行洽谈
  19. 上海国际能源交易中心大户持仓报告制度 操作指南
  20. Java基础教程--安卓入门教程(七)

热门文章

  1. django ModuleNotFoundError: No module named 'tinymce***'
  2. python web开发 HTML基础
  3. LeetCode 2017. 网格游戏(前缀和)
  4. TensorFlow 2.0 - tf.distribute 分布式训练
  5. LeetCode 1263. 推箱子(BFS+DFS / 自定义哈希set)
  6. LeetCode 1626. 无矛盾的最佳球队(最大上升子序DP)
  7. LeetCode 186. 翻转字符串里的单词 II
  8. LeetCode 1180. 统计只含单一字母的子串
  9. LeetCode 1029. 两地调度(贪心)
  10. LeetCode 496. 下一个更大元素 I(哈希)