sql查询中使用in和exits比较和区别
首先,查询中涉及到的两个表,一个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比较和区别相关推荐
- oracle查数据存入数组,如何在SQL查询中使用Oracle关联数组
ODP.Net公开了将关联数组作为参数从C#传递到Oracle存储过程的能力.除非您尝试在sql查询中使用该关联数组中包含的数据,否则它是一个很好的功能. 原因是它需要上下文切换 – SQL语句需要S ...
- SQL查询中having和where的异同点
SQL查询中having与where 的异同点 在sql查询中, having与where类似,可以筛选数据,where后的表达式怎么写,having后就怎么写. 1. where针对表中的列发挥作用 ...
- Laravel SQL查询中first、pluck、lists方法的使用
Laravel SQL查询中first.pluck.lists方法的使用
- 读书笔记:SQL 查询中的SQL*Plus 替换变量(DEFINE变量)和参数
本文为"SQL*Plus 替换变量 - 在 SQL 查询中定义变量和参数"的读书笔记. 此文主要是讲替换变量,也称为DEFINE变量,但也涉及了绑定变量和SQL Plus系统变量. ...
- vba ado 执行多条mysql 语句,Excel VBA+ADO+SQL入门教程003:SQL查询中字段技巧的总结...
原标题:Excel VBA+ADO+SQL入门教程003:SQL查询中字段技巧的总结 本章概要: 1,几个概念 1.1, 数据库和Excel工作簿 1.2,数据表和Excel工作表 1.3,记录.字段 ...
- SQL Server中SET赋值和SELECT赋值的区别
2019独角兽企业重金招聘Python工程师标准>>> 一.SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值 SELECT @VAR1='Y',@VAR ...
- mysql and 和where,关于mysql:连接sql查询中where和and子句的区别
本问题已经有最佳答案,请猛点这里访问. 下面两个SQL查询有什么区别 和 号 根据以下两个测试结果 速度更快(237比460).据我所知,这是一个标准. . 氧化镁 不,有细微的差别,你不能说没有差别 ...
- java sql 查询中的转义序列不对_在 JDBC 中使用 SQL 转义序列 - SQL Server | Microsoft Docs...
使用 SQL 转义序列Using SQL escape sequences 08/12/2019 本文内容 按照 JDBC API 的定义,Microsoft JDBC Driver for SQL ...
- sql查询中截取字符串
SQL 语句中查询结果字符截取left,right,substrng用法 在SQL的实际用途中,经常会碰到需要对查询结果值需要做字段的一些截取,下面列举经常用到的三种常用截取方式. 1.LEFT(st ...
最新文章
- mysql限制小数位_Mysql中设置小数点用什么数据类型 decimal
- 使用单元测试测试简单的首页
- IP地址分类及CIDR划分方法
- 6D姿态估计从0单排——看论文的小鸡篇——Learning Analysis-by-Synthesis for 6D Pose Estimation in RGB-D Images...
- 变量声明和函数声明的意义详解
- MongoDB 聚合
- YBTOJ洛谷P1407:稳定婚姻(强连通分量)
- Spring Boot工作笔记-RabbitMQ中Unsupported major.minor version 52.0问题
- [转载]超酷代码-使用 ASP.NET AJAX 进行拖放
- 谷歌修复已遭利用的 Chrome 0day
- POJ1338 Ugly Numbers(解法二)
- 专业生物信息linux系统,Evvail | Bio-Linux:生物信息专用Linux系统 | Omics - Hunter
- 使用group by查询时报错ORDER BY clause is not in GROUP BY..this is incompatible with sql_mode=only_full_grou
- 华为U8500刷了2.2后自定义铃声,短信通知音,闹铃音的方法
- vue百度地图自定义标记图标
- matlab中Svmtrain和Svmpredict的用法
- win7下设置 WiFi AP
- 参加 TechEd 2004
- 万字详解用户行为分析
- 线阵CCD FPGA CCD测量 直径测量 FPGA代码 CCD光学传感器 TCD1501