SQL语句——exists和in区别
表结构及数据
user表

order表

in
select * from table A where id in (xxxxxxxxxxx):满足条件的数据会被查出来;
先查询子查询的表,然后将内表、外表做一个笛卡尔积,然后按条件进行筛选。所以相对内表较小的时候,in的速度比较快;
SELECT
m.*
FROM
user m
WHERE
m.id IN
(
SELECT
user_id
FROM
order n )
这条语句通过子查询到order表的user_id的数据,去匹配user表的id,结果如下

执行流程如下:
1)在数据库内部执行子查询
SELECT
user_id
FROM
order n
执行结果

2)将子查询结果和user表做笛卡尔积,结果如下:

3)再根据我们的条件:m.id IN order.user_id,将结果进行筛选(即比较id列和user_id列值是否相等,不相等的删除)
4)得到符合条件的数据

exists
select * from table B where exists (xxxxxxxxxxx):满足不满足都会查出来
指定一个子查询,检测行的存在。遍历循环外表,然后看外表中记录有没有和内表数据一样。匹配上就将结果放入结果集中。
SELECT
user.*
FROM
user
WHERE
EXISTS (
SELECT
order.user_id
FROM
order
WHERE
user.id = order.user_id
)
这条sql执行结果和上面的in结果一样。

但是,执行流程不一样:
使用exists关键字进行查询时候,首先查询的不是子查询,而是查询主表,也就是说,我们先执行的sql语句是:
SELECTuser.*FROMuser
得到结果:

然后,根据表的每一条记录,执行以下语句,一次去判断where后面的条件是否成立:
EXISTS (
SELECT
order.user_id
FROM
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语句——exists和in区别的更多相关文章
- sql语句exists 用法
参考:SQL语句exists用法,Sql语句中IN和exists的区别及应用 现在有三张表 学生表S: sno ,sname 课程表C:cno ,cname 学生选课表SC: sno ,cno 查询选 ...
- SQL语句exists用法
首先头脑中有三点概念: 1 . EXISTS子查询找到的提交 NOT EXISTS 子查询中 找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2 . 建立程序循环的概念,这是一个动态的查 ...
- sql语句中#{}和${}的区别
#---将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的 ...
- 在myeclipse中写sql语句的细节问题
注意类型,varchar 和int 在java中表示为sql语句中的细微区别!! 下面的REGISEAT_NUM为int 类型 custid为varchar类型 String sql1= ...
- sql中exists和notexists用法总结(并和in的比较)
首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOT EXISTS 子查询中 找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如 ...
- Sql语句中IN和exists的区别及应用
表展示 首先,查询中涉及到的两个表,一个user和一个order表,具体表的内容如下: user表: order表: in 确定给定的值是否与子查询或列表中的值相匹配.in在查询的时候,首先查询子查询 ...
- Sql 语句中 IN 和 EXISTS 的区别
IN 语句:只执行一次 确定给定的值是否与子查询或列表中的值相匹配.in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选.所以相对内表比较小的时候,in的速度较快 ...
- SQL语句中exists和in的区别
转自https://www.cnblogs.com/liyasong/p/sql_in_exists.html 和 http://blog.csdn.net/lick4050312/article/d ...
- SQL语句中in 与 exists的区别
SQL语句中in 与 exists的区别 SQL中EXISTS检查是否有结果,判断是否有记录,返回的是一个布尔型(true/false); IN是对结果值进行比较,判断一个字段是否存在于几个值的范围中 ...
随机推荐
- LocalDate
java中做时间处理时一般会采用java.util.Date,但是相比于Date来说,还有更好的选择 -- java.time.LocalDate. 这是jdk8中新增的日期处理类,同时新增的还有ja ...
- express 随笔
#express 1.使用Express 应用生成器 npm install express-generator -g 2.创建一个命名为 myapp 的应用 express myapp 3.安装所有 ...
- 使用vue实现tab栏的点击切换样式
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- set和 map 数据结构
set/map数据结构 创建: var s=new Set(); 添加成员 s.add(1) 遍历 for of s.froEach 删除 s.delete() 判断存在 s.has() 清除 s. ...
- Python_tkinter(4)_上传文件
1.上传单个文件 import tkinter as tk from tkinter import filedialog def upload_file(): selectFile = tk.file ...
- match 和 lastIndex 字符串检测差异
match .replace .search 这写不能识别特殊字符 indexOf .indexof 能识别特殊字符 str.lastIndexOf('a') > -1 // 通过lastInd ...
- 使用STS创建springboot项目pom.xml文件报错org.apache.maven.archiver.MavenArchiver.getManifest
首先我的STS版本时:3.7.3 解决办法:->help->Install New Software -> add->location ->输入: http://repo ...
- 用jquery获取A标签href参数
<a href="echo.php?id=14">提交</a> 取href中的id值14 <script> $(function () { $( ...
- emqx源码编译
1 下载 github上下载 2 找台虚拟机,安装编译所需的环境,erlang make等 3 执行make命令 重点说一下第3步: 主要是make命令报错 解释:执行make命令后,依赖 ...
- ReLU激活函数的缺点
训练的时候很”脆弱”,很容易就”die”了,训练过程该函数不适应较大梯度输入,因为在参数更新以后,ReLU的神经元不会再有激活的功能,导致梯度永远都是零. 例如,一个非常大的梯度流过一个 ReLU 神 ...