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(not in)、exists(not exists)的选用(图文、代码全版) -> 正文阅读

[大数据]【Mysql】集合运算in(not in)、exists(not exists)的选用(图文、代码全版)

鸣谢

【核心参考】在MySQL里,有个和in一样的东东叫做exists,但是它比in更牛叉,你会么?

【核心参考】萨师煊.王珊代码mysql版本(建库、建表、查询语句)

创建表及数据

【说明】(粗略)建表代码请移步,本"链接"。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

集合运算简介

1.使用的背景

【说明】往往,问题的描述中包含“存在”、“不存在”这种关键词,∈ “集合运算”。 eg,选课表中没有选课的学生 ? 选课表中不存在的学生号
在这里插入图片描述

2. “In”、"exists"在集合运算中的作用。

在这里插入图片描述
在这里插入图片描述

语法及执行原理

1. "In"用法

【说明】"in"语法

# 查询,存在于选课信息的学生名字 ? 有选课的学生姓名
Select student.Sname
From  student
WHERE student.Sno in (SELECT Sno From sc);  

在这里插入图片描述

【说明】“Not in” 语法

# 查询,不存在于选课信息的学生名字 
Select student.Sname
From  student
#【注】"not in"会在右侧集合返回"Null"时无效,采用IfNull做预处理。
# WHERE student.Sno not in (SELECT Sno From sc);   
WHERE student.Sno not in (SELECT IFNULL(Sno,0) From sc);  

【注】原方法
在这里插入图片描述
【注】预防返回Null值后的方法
在这里插入图片描述

2."exists"用法(类似,In的用法)

【说明】"Not exists"用法(exists同理)

# 查询,不在选课信息的学生名字
Select student.Sname
From  student
WHERE Not Exists(SELECT Sno From sc WHERE student.Sno = sc.Sno);  

在这里插入图片描述

3.“Exists” Vs “In”(两者的选用)

??? 由上文,可见,两者其实都能实现“存不存在”这一问题的处理,但是,具体各关键词是否有各自的优势呢?

【口诀】“外层查询表小于子查询表,则用exists。外层查询表大于子查询表,则用in,如果外层和子查询表差不多,则随意。”

【说明】"In"的运行原理

  1. "查询,存在于选课信息的学生名字 ? 有选课的学生姓名"的Sql语句
# "查询,存在于选课信息的学生名字 ? 有选课的学生姓名"的Sql语句
Select student.Sname
From  student
WHERE student.Sno in (SELECT Sno From sc);  
  1. 对应,sql执行语句逻辑
$result = [];
$students = "SELECT * FROM `student`";
$sc_info = "SELECT Sno FROM `sc`";
for($i = 0;$i < $student.length;$i++){
    for($j = 0;$j < $sc.length;$j++){
        // 此过程为内存操作,不涉及数据库查询,其中“sc表记录全会被缓存”。
        if($student[$i].sno == $sc[$j].sno){  
            $result[] = $studnets[$i];
            break;
        }
    }
}

? 【本质】参照上述逻辑(留意循环体),'In’运算中

  • 会遍历子查询表(Eg,sc表)的所有记录,并存储
  • 会遍历外查询表(Eg,student表)的所有记录,并与子查询表记录作笛卡尔积,匹配则为result

【说明】"Exists"的运行原理

  1. "查询,存在于选课信息的学生名字 ? 有选课的学生姓名"的Sql语句
Select student.Sname
From  student
WHERE Exists(SELECT Sno From sc WHERE student.Sno = sc.Sno);  
  1. 对应,sql执行语句逻辑
$result = [];
$students = "SELECT * FROM `student`";
for($i=0;$i<$student.length;$i++){
    if(exists($students[$i].sno)){// 执行“SELECT * FROM `sc` WHERE sc.sno = student.sno”,得结果集,再看student表中的sno是否在此结果集中,
        $result[] = $students[$i];
    }
}

? 【本质】参照上述逻辑(留意循环体),'Exists’运算中:

  • 非内存中计算,∈查询(select)操作。
  • 最大的操作次数,仅与外表(Eg, student表)长度有关,不用做笛卡尔积

【案例】(原理不懂的话)案例理解(记忆)

? 【注】:口诀中,外层查询表——简称“外表(下文例子为:student表)”
? 【注】:口诀中,内层查询表——简称“内表(下文例子为:sc表)”

# @In关键词
# "查询,存在于选课信息的学生名字 ? 有选课的学生姓名"的Sql语句
Select student.Sname
From  student
WHERE student.Sno in (SELECT Sno From sc);  
  • student表有10000条记录,sc表有1000000条记录,那么最多有可能遍历10000*1000000次
  • student表有10000条记录,sc表有100条记录,那么最多有可能遍历10000*100次
# @Exists关键词
# "查询,存在于选课信息的学生名字 ? 有选课的学生姓名"的Sql语句
Select student.Sname
From  student
WHERE Exists(SELECT Sno From sc WHERE student.Sno = sc.Sno);  
  • student表有10000条记录,sc表有1000000条记录,那么exists()会执行10000次去判断student表中的sno是否与sc表中的sno相等.
  • student表有10000条记录,sc表有100条记录,那么exists下依旧执行10000次.

∴“外查询表(student表)记录数 > 内查询表(sc表)记录数”,则用exists。而相反情况下,因为in的运算在内存中,速度更快,所以建议用in。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-25 11:38:09  更:2022-05-25 11:38:36 
 
开发: 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 20:35:10-

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