IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL in和exists 查询分析 -> 正文阅读

[大数据]MySQL in和exists 查询分析

大家好,我是神韵,是一个技术&生活博主。出文章目的主要是两个,一是好记忆不如烂笔头,记录总结中提高自己。二是希望我的文章可以帮到大家。欢迎来点赞打卡,你们的行动将是我无限的动力。
本篇主题是:MySQL in和exists 查询分析

看到了就简单记录一下,以后忘了可以回来看~

目录

exists原理:

in原理:

例子:

not exists解法(同一个表也能用哦~)

not in

总结:


以前一直没使用过exists这个关键字,现在才知道它基本上来说,如果不计数据量大小,其实比in查询还快,下面先介绍in和exists查询原理。

exists原理:

select * from A a
where exists (
    select 1 from B b where a.id = b.id
);

  1. 首先执行外查询select * from A a,然后从外查询的数据取出一条数据传给内查询。
  2. 内查询执行select * from B b,外查询传入的数据和内查询获得数据根据where后面的条件做匹对,如果存在数据满足a.id=b.id则返回true,如果一条都不满足则返回false。
  3. 内查询返回true,则外查询的这行数据保留,反之内查询返回false则外查询的这行数据不显示。外查询的所有数据逐行查询匹对。

总结:先查外查询,然后用外查询数据去内查询根据where做匹配,如果存在则保留外查询记录。如果外查询数据量小,内查询数据量大,使用exists效果比in查询高。

not exists和exists的用法相反,就不继续啰嗦了。

in原理:

select * from A
where id in (
    select id from B
);
  1. 首先执行内查询select id?from B,然后将查询符合的所有数据的id传给外查询。
  2. 外查询根据内查询返回的所有id, 执行select * from A where id in查询符合的数据返回。

总结:先查内查询,然后用内查询数据做外查询返回符合记录。如果外查询数据量大,内查询数据量小,并且有索引情况,使用in比exists查询效率高。

not in和in的用法相反,就不继续啰嗦了。

例子:

下面是力扣的一道题目-寻找用户推荐人

?这道题有很多解法,我这里介绍用not in和not exists两种解法

not exists解法(同一个表也能用哦~)

select name
from customer c1
where not exists (
    select 1 from customer c2 where referee_id = 2 and c1.id = c2.id
);

查询过程:

1、先在外customer c1查询出所有的记录

2、依次将六条记录传入内查询customer c2

? ? ? ? 2.1、id=1时,不符合查询条件,结果返回false,not exists识别是false,外层保留记录1

? ? ? ? 2.2、id=2时,不符合查询条件,结果返回false,not exists识别是false,外层保留记录2

? ? ? ? 2.3、id=3时,referee_id=2符合查询条件,结果返回true,not exists识别是true,外层跳过不保留记录3

? ? ? ? ....剩下三条跳过记录6,保留记录4.5

总的就保留了记录12、45,跳过了3、6

3、将保留的所有结果返回

not in

select name 
from customer c1
where id not in 
(select id from customer c2 where referee_id = 2)

?查询过程:

1、先在内customer c2查询出所有符合的记录id=3、6

2、将id=3、6放到外层查询进行查询

查询语句就变成

select name 
from customer c1
where id not in (3,6)

3、外查询将过滤掉id为3,6的其它数据返回

总结:

  • in和exists执行时,in是先执行内查询,然后再执行外查询。而exists查询它是先执行外查询,然后再执行内查询(这里的内外查询不理解可以结合上面的分析理解)。
  • exists和in在执行时效率单从执行时间来说差不多,exists要稍微优干in,在使用时一般应该是用exists而不用in。
  • 如果内查询得出的结果集记录较少,外查询中的表较大且又有索引时应该用in,反之如果外查询记录较少,内查询中的表大,又有索引时使用exists。
  • in只能返回一个字段,exists可以返回多个字段,但是exists返回的是啥是没有任何意义的,通常返回1就行。

?

上面就是对in和exists的讲解,知识相对比较入门。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:18:22  更:2022-09-04 01:20:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:46:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码