首先,查询中涉及到的两个表,一个user和一个order表,具体表的内容如下:

    user表:

    

    order表:

    

  in

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

    具体sql语句如下:

 1 SELECT2     *3 FROM4     `user`5 WHERE6     `user`.id IN (7         SELECT8             `order`.user_id9         FROM
10             `order`
11     )

    这条语句很简单,通过子查询查到的user_id 的数据,去匹配user表中的id然后得到结果。该语句执行结果如下:

    

    它的执行流程是什么样子的呢?让我们一起来看一下。

    首先,在数据库内部,查询子查询,执行如下代码:

        SELECT`order`.user_idFROM`order`

    执行完毕后,得到结果如下:

    

    此时,将查询到的结果和原有的user表做一个笛卡尔积,结果如下:

    

    此时,再根据我们的user.id IN order.user_id的条件,将结果进行筛选(既比较id列和user_id 列的值是否相等,将不相等的删除)。最后,得到两条符合条件的数据。
    

  exists

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

    具体sql语句如下:

 1 SELECT2     `user`.*3 FROM4     `user`5 WHERE6     EXISTS (7         SELECT8             `order`.user_id9         FROM
10             `order`
11         WHERE
12             `user`.id = `order`.user_id
13     )

    这条sql语句的执行结果和上面的in的执行结果是一样的。

    

    但是,不一样的是它们的执行流程完全不一样:

    使用exists关键字进行查询的时候,首先,我们先查询的不是子查询的内容,而是查我们的主查询的表,也就是说,我们先执行的sql语句是:

     SELECT `user`.* FROM `user`

    得到的结果如下:

    

    然后,根据表的每一条记录,执行以下语句,依次去判断where后面的条件是否成立:

EXISTS (SELECT`order`.user_idFROM`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要快。

sql查询中使用in和exits比较和区别相关推荐

  1. oracle查数据存入数组,如何在SQL查询中使用Oracle关联数组

    ODP.Net公开了将关联数组作为参数从C#传递到Oracle存储过程的能力.除非您尝试在sql查询中使用该关联数组中包含的数据,否则它是一个很好的功能. 原因是它需要上下文切换 – SQL语句需要S ...

  2. SQL查询中having和where的异同点

    SQL查询中having与where 的异同点 在sql查询中, having与where类似,可以筛选数据,where后的表达式怎么写,having后就怎么写. 1. where针对表中的列发挥作用 ...

  3. Laravel SQL查询中first、pluck、lists方法的使用

    Laravel SQL查询中first.pluck.lists方法的使用

  4. 读书笔记:SQL 查询中的SQL*Plus 替换变量(DEFINE变量)和参数

    本文为"SQL*Plus 替换变量 - 在 SQL 查询中定义变量和参数"的读书笔记. 此文主要是讲替换变量,也称为DEFINE变量,但也涉及了绑定变量和SQL Plus系统变量. ...

  5. vba ado 执行多条mysql 语句,Excel VBA+ADO+SQL入门教程003:SQL查询中字段技巧的总结...

    原标题:Excel VBA+ADO+SQL入门教程003:SQL查询中字段技巧的总结 本章概要: 1,几个概念 1.1, 数据库和Excel工作簿 1.2,数据表和Excel工作表 1.3,记录.字段 ...

  6. SQL Server中SET赋值和SELECT赋值的区别

    2019独角兽企业重金招聘Python工程师标准>>> 一.SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值 SELECT @VAR1='Y',@VAR ...

  7. mysql and 和where,关于mysql:连接sql查询中where和and子句的区别

    本问题已经有最佳答案,请猛点这里访问. 下面两个SQL查询有什么区别 和 号 根据以下两个测试结果 速度更快(237比460).据我所知,这是一个标准. . 氧化镁 不,有细微的差别,你不能说没有差别 ...

  8. java sql 查询中的转义序列不对_在 JDBC 中使用 SQL 转义序列 - SQL Server | Microsoft Docs...

    使用 SQL 转义序列Using SQL escape sequences 08/12/2019 本文内容 按照 JDBC API 的定义,Microsoft JDBC Driver for SQL ...

  9. sql查询中截取字符串

    SQL 语句中查询结果字符截取left,right,substrng用法 在SQL的实际用途中,经常会碰到需要对查询结果值需要做字段的一些截取,下面列举经常用到的三种常用截取方式. 1.LEFT(st ...

最新文章

  1. mysql限制小数位_Mysql中设置小数点用什么数据类型 decimal
  2. 使用单元测试测试简单的首页
  3. IP地址分类及CIDR划分方法
  4. 6D姿态估计从0单排——看论文的小鸡篇——Learning Analysis-by-Synthesis for 6D Pose Estimation in RGB-D Images...
  5. 变量声明和函数声明的意义详解
  6. MongoDB 聚合
  7. YBTOJ洛谷P1407:稳定婚姻(强连通分量)
  8. Spring Boot工作笔记-RabbitMQ中Unsupported major.minor version 52.0问题
  9. [转载]超酷代码-使用 ASP.NET AJAX 进行拖放
  10. 谷歌修复已遭利用的 Chrome 0day
  11. POJ1338 Ugly Numbers(解法二)
  12. 专业生物信息linux系统,Evvail | Bio-Linux:生物信息专用Linux系统 | Omics - Hunter
  13. 使用group by查询时报错ORDER BY clause is not in GROUP BY..this is incompatible with sql_mode=only_full_grou
  14. 华为U8500刷了2.2后自定义铃声,短信通知音,闹铃音的方法
  15. vue百度地图自定义标记图标
  16. matlab中Svmtrain和Svmpredict的用法
  17. win7下设置 WiFi AP
  18. 参加 TechEd 2004
  19. 万字详解用户行为分析
  20. 线阵CCD FPGA CCD测量 直径测量 FPGA代码 CCD光学传感器 TCD1501

热门文章

  1. Python MySQL选择
  2. python重复元素判定_30段极简Python代码:这些小技巧你都Get了么
  3. excel怎么更改坐标轴刻度_如何用excel制作帕累托图
  4. linux删除文件_Linux中删除特殊名称文件的多种方式
  5. opencv roberts算子_边缘检测 Roberts算子
  6. opencv Mat push_back
  7. 浏览器解析JavaScript的原理
  8. 期货大赛项目|九,fileinput插件的应用
  9. 洛谷1417烹调方案——动态规划:价值受时间影响
  10. 两点之间最短路径:弗洛伊德算法