您现在的位置是: 堆糖网 > 职场 > exists-sql中exists的用法

exists-sql中exists的用法

2020-03-01 22:46作者:堆糖网 253人阅读

简介一、exists 没有任何区别,都是筛选过滤条件,用法都是跟在后面。里面是一个子查询。 使用in的时候,执行过程不能使用索引;使用的时候,可以使用索引,所定义一般情况下,效率高

一、exists

没有任何区别,都是筛选过滤条件,用法都是跟在后面。里面是一个子查询。

使用in的时候,执行过程不能使用索引;使用的时候,可以使用索引,所定义一般情况下,效率高些。(要看具体情况,如表的大小,驱动表的选择)

是判断是否存在和in类似但效率要比in高

基础表‘‘

基础表‘

这两句效果一样

一exists

以上数据内容来源于:百度exists搜狗exists360exists

二、sql语句exists用法

in和的区别与SQL执行效率分析

本文对in和的区别与SQL执行效率进行了全面整理分析……

最近很多论坛又开始讨论in和的区别与SQL执行效率的问题,

本文特整理一些in和的区别与SQL执行效率分析

SQL中in可以分为三类:

1、形如,应该和以下两种比较效率

1b

或者1f1b

你可能指的不是这一类,这里不做讨论。

2、形如2fxx,

其中子查询的里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成语句,也就是效率和一样。

3、形如2fxt1fx,

其中子查询的里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如。

除了第一类in语句都是可以转化成语句的SQL,一般编程习惯应该是用而不用in,而很少去考虑in和的执行效率

in和的SQL执行效率分析

A,B两个表,

1当只显示一个表的数据如A,关系条件只一个如ID时,使用IN更快:

omB

2当只显示一个表的数据如A,关系条件不只一个如ID,col1时,使用IN就不方便了,可以使用:

3当只显示两个表的数据时,使用IN,都不合适,要使用连接:

所以使用何种方式,要根据要求来定。

这是一般情况下做的测试:

这是偶的测试结果

47行受影响

表。扫描计数1,逻辑读取3次,物理读取0次,预读2次,lob逻辑读取0次,lob物理读取0次,lob预读0次。

表。扫描计数1,逻辑读取3次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。

1行受影响

44行受影响

表。扫描计数47,逻辑读取97次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。

表。扫描计数1,逻辑读取3次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。

1行受影响

419行受影响

表。扫描计数1,逻辑读取10次,物理读取0次,预读15次,lob逻辑读取0次,lob物理读取0次,lob预读0次。

表。扫描计数1,逻辑读取3次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。

1行受影响

419行受影响

表。扫描计数1,逻辑读取10次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。

表。扫描计数1,逻辑读取3次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。

1行受影响

测试结果总体来讲比in的效率高

效率条件因素的索引是非常关键的

把作为条件数据大于

用in

扫描计数47,逻辑读取97次,

扫描计数1,逻辑读取3次

把作为条件的数据少于

比in多预读15次

对此我记得还做过如下测试:

结构

11id主键自增

类别每一千条数据为一个类别

分类id

插入600w条数据

如果要查询每个类别的最大sid的话

的执行效率要高三倍以上。具体的执行时间忘记了。但是结果我记得很清楚。在此之前我一直推崇第二种写法,后来就改第一种了。

in和的sql执行效率分析再简单举一个例子:

10

a语句in的sql写法

b语句的sql写法

两条语句功能都是找到表变量t中v含有重复值的记录

第一条sql语句使用in但子查询中与外部没有连系

第二条sql语句使用但子查询中与外部有连系

大家看SQL查询计划很清楚了

gt1

这条Sql语句它的执行不依赖于主查询主句我也不知道怎么来描述in外面的和里面的暂且这么叫吧大家明白就行

那么SQL在查询时就会优化即将它的结果集缓存起来

即缓存了

后续的操作主查询在每处理一步时相当于在处理当然语句不会这么转化只是为了说明意思也即主查询每处理一行记为时子查询不会再扫描表只会与缓存的结果进行匹配

这一句它的执行结果依赖于主查询中的每一行

当处理主查询第一行时即1时子查询再次被执行扫描全表从第一行记1开始扫描id相同过滤子查询行下移2继续id不同但v值不匹配子查询行继续下移直到7没找到匹配的子查询处理结束第一行1被过滤主查询记录行下移

处理第二行时2子查询第一行1v值不匹配子查询下移第二行id相同过滤第三行到第六行id不同v值匹配找到匹配结果即返回不再往下处理记录主查询下移

处理第三行时,以此类推

sql优化中,使用in和?主要是看你的筛选条件是在主查询上还是在子查询上。

通过分析,相信大家已经对in和的区别、in和的SQL执行效率有较清晰的了解。

二sql语句exists用法

以上数据内容来源于:百度sql语句exists用法搜狗sql语句exists用法360sql语句exists用法

三、sql中exists的用法

"He任意任意1idt"

有一个查询如下:

复制代码代码如下

这里面的是如何运作呢?子查询返回的是字段,可是外面的查询要找的是和字段,这两个字段肯定不在里面啊,这是如何匹配的呢?

用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值或。

指定一个子查询,检测行的存在。语法:。参数是一个受限的语句(不允许有子句和关键字)。结果类型为,如果子查询包含行,则返回。

在子查询中使用仍然返回结果集

这个例子在子查询中指定,并返回结果集,通过使用仍取值为。

复制代码代码如下

比较使用和IN的查询

这个例子比较了两个语义类似的查询。第一个查询使用而第二个查询使用IN。注意两个查询返回相同的信息。

复制代码代码如下

复制代码代码如下

比较使用和ANY的查询

本示例显示查找与出版商住在同一城市中的作者的两种查询方法:第一种方法使用ANY,第二种方法使用。注意这两种方法返回相同的信息。

复制代码代码如下

复制代码代码如下

比较使用和IN的查询

本示例所示查询查找由位于以字母B开头的城市中的任一出版商出版的书名:

复制代码代码如下

复制代码代码如下

使用

的作用与正相反。如果子查询没有返回行,则满足中的子句。本示例查找不出版商业书籍的出版商的名称:

复制代码代码如下

又比如以下SQL语句:

复制代码代码如下

姓名

学号xs学号and课程号kc课程号

把最外层的查询xs里的数据一行一行的做里层的子查询。

中间的语句只做出对上一层的返回或,因为查询的条件都在学号xs学号and课程号kc课程号这句话里。每一个都会有一行值。它只是告诉一层,最外层的查询条件在这里成立或都不成立,返回的时候值也一样回返回上去。直到最高层的时候如果是(真)就返回到结果集。为(假)丢弃。

复制代码代码如下

学号xs学号and课程号kc课程号

这个就是告诉上一层,这一行语句在我这里不成立。因为他不是最高层,所以还要继续向上返回。

姓名(这里的语句收到上一个为的值。他在判断一下,结果就是为(成立),由于是最高层所以就会把这行的结果(这里指的是查询条件)返回到结果集。

几个重要的点:

最里层要用到的醒询条件的表比如xs学号、kc课程号等都要在前面的时候说明一下姓名

不要在太注意中间的语句

把和嵌套时的返回值弄明白

三sql中exists的用法

以上数据内容来源于:百度sql中exists的用法搜狗sql中exists的用法360sql中exists的用法
更多关于exists
更多相关:百度exists搜狗exists360exists

Tags:深圳二手车行

堆糖随机推荐

堆糖探索

网名:堆糖

职业:部落开发工程师

现居:互联网堆糖部落

站点探索