mysql exist和in的区别

news2024/11/26 12:31:32

一、演示用的表

为了演示二者的区别,先建立两张表 user 表和 order 表
在这里插入图片描述
在这里插入图片描述

二、in 的执行情况

in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

sql 和 执行结果

SELECT
	*
FROM
	`user`
WHERE
	`user`.id IN (
		SELECT
			`order`.user_id
		FROM
			`order`
	)

在这里插入图片描述

执行流程

1、查询子查询

SELECT
	`order`.user_id
FROM
	`order`

在这里插入图片描述

2、此时,将查询到的结果和原有的user表做一个笛卡尔积,结果如下:

SELECT
	u.id,
	u.username,
	u.birthday,
	u.sex,
	u.address,
	o.user_id
FROM
	`user` u
INNER JOIN (
	SELECT
		`order`.user_id
	FROM
		`order`
) o

在这里插入图片描述
3、此时,再根据我们的user.id IN order.user_id的条件,将结果进行筛选(既比较id列和user_id 列的值是否相等,将不相等的删除)。最后,得到两条符合条件的数据。

SELECT
	u.id,
	u.username,
	u.birthday,
	u.sex,
	u.address,
	o.user_id
FROM
	`user` u
INNER JOIN (
	SELECT
		`order`.user_id
	FROM
		`order`
) o on u.id = o.user_id

在这里插入图片描述

三、exist

sql 和执行结果

SELECT
	`user`.*
FROM
	`user`
WHERE
	EXISTS (
		SELECT
			`order`.user_id
		FROM
			`order`
		WHERE
			`user`.id = `order`.user_id
	)

在这里插入图片描述

执行流程

1、使用exists关键字进行查询的时候,首先,我们先查询的不是子查询的内容,而是查我们的主查询的表

SELECT `user`.* FROM `user`

在这里插入图片描述

2、然后,根据表的每一条记录,执行以下语句,依次去判断where后面的条件是否成立:

EXISTS (
		SELECT
			`order`.user_id
		FROM
			`order`
		WHERE
			`user`.id = `order`.user_id
	)

如果返回的是true的话,则该行结果保留,如果返回的是false的话,则删除该行,最后将得到的结果返回。

四、in 和 exists的区别

  • in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询

  • 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in;反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/538736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口测试之Jenkins+Jmeter+Ant实现持续集成

安装Jenkins,见手把手教小白安装Jenkins_程序员馨馨的博客-CSDN博客 一)Linux机器上安装Jmeter 百度一下就好 二)Linux机器上安装Ant 1、下载安装包 进入Apache Ant - Binary Distributions,下载安装包,本次安装的是版…

高仿某东商城flutter版本,个人学习flutter项目

前言 高仿某东商城flutter版本,个人学习flutter项目 使用flutter_redux状态管理网络使用dio进行了简单的封装使用node项目mock服务端接口(mock_server目录)目前只实现了首页,其他功能持续更新… 同款Android Kotlin版本( https://github.co…

Mysql索引底层原理及其优化方案

1.深入理解Mysql索引底层数据结构与算法 1.1索引结构 索引及其数据结构: 二叉树红黑树Hash表B-Tree 1.1 二叉树 说明:二叉树是建立数据后,会和第一元素进行比对,当比较的元素小于第一个元素时,此时就会走第一个元素…

代码随想录算法训练营第四十三天 | 填满背包有几种方法、背包有两个维度

1049.最后一块石头的重量II 文档讲解:代码随想录 (programmercarl.com) 视频讲解:动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II_哔哩哔哩_bilibili 状态:没想到。 思路 本…

chatgpt如何引入领域知识?mit团队利用gpt4做数据增强来提升小模型在特定领域的效果

一、概述 title:Dr. LLaMA: Improving Small Language Models in Domain-Specific QA via Generative Data Augmentation 论文地址:Paper page - Dr. LLaMA: Improving Small Language Models in Domain-Specific QA via Generative Data Augmentation…

(6)LED点阵屏

LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等 LED点阵屏分类 按颜色:单色、双色、全彩按像素:88、…

Excel模板导入导出功能测试点

近期接触的都是Web项目,有很多导入数据这个功能,导入的文件格式都是Excel,基本流程就是:下载一个Excel模板,填充数据,再将Excel表格导入,导入后可下载列表,想着这类功能的测试点基本…

springboot基于vue的地方美食分享网站

开发技术介绍 Java介绍 JavaScript是一种网络脚本语言,广泛运用于web应用开发,可以用来添加网页的格式动态效果,该语言不用进行预编译就直接运行,可以直接嵌入HTML语言中,写成js语言,便于结构的分离&…

DVWA全级别通关教程

首先选择难度,我们从low开始,如上图所示进行修改 目录 SQL手工注入 过程: low Medium high Impossible SQL 盲注 过程: SQL 工具注入 工具安装过程: 过程: low Medium High: 暴力破解 过…

教室借用-贪婪算法

问题1: 假设你有一个教室(只有一个教室),你有几个来自讲师的使用教室的请求 。应用间隔调度问题来安排尽可能多的请求,以优化教室的使用。 最早开始时间 最早开始时间(Earliest Start Time,简…

一站了解zookeeper的关键知识

ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。 ZooKeeper 的架构通过冗余服务实现高可用性。 Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高…

maven下载和maven配置(以maven3示例)

maven下载和maven配置(以maven3示例) 1.maven下载1.1 直接使用idea捆绑的(很轻松)1.2 手动下载到本机服务器(推荐)1.2.1 官网下载maven1.2.2 选好版本后,选二进制目录 binaries1.2.3 文件选择1.…

Jmeter的Content-Type设置方式

今天调Jmeter脚本遇到一个问题:接口的请求体为Body Data时,没有在HTTP信息头管理加Content-Type参数,Content-Type: application/json,导致脚本一直跑不通,报错,一顿排查,才发现是请求头的原因。…

SpringCloud项目将某个子模块改成以war的形式打包,需要修改的地方

SpringCloud项目将某个子模块改成以war的形式打包&#xff0c;需要修改的地方 在GAV后面添加 《packaging》 war 《/packaging》 在GAV后面添加 《packaging》 war 《/packaging》 添加war打包方式 <packaging>war</packaging>添加之后项目会报错&#xff0c;工程…

Ada学习(2)Statements

文章目录 if statements / expressionif statementsif expression Case Statement / ExpressionCase StatementCase Expression Loop Statement基本循环结构 loopwhile loopFor 循环NoteFor ... loop Control VariableFor ... loop Range EvaluationDeclare block (声明代码块)…

手把手教小白安装Jenkins

一、Jenkins简介 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 简而言之&#xff0c;Jenkins就是一款将构建&#xff0c;打…

例3:模板

例&#xff1a;如图所示流程&#xff0c;乙烷和丙烷混合液进入蒸发器Evaporator&#xff0c;从天然气吸收热量后进入压缩机Compressor&#xff0c;压缩后的气体进入冷凝器Condenser&#xff0c;最后通过J-T阀&#xff08;焦耳-汤姆逊节流膨胀阀&#xff09;回到进入蒸发器前的状…

抖音SEO矩阵营销系统/MVC源码部署二次开发搭建

首先&#xff0c;抖音SEO矩阵系统源码开发&#xff0c;如何做独立部署&#xff0c;首先我们需要深刻理解这个系统的开发逻辑是什么&#xff1f;开发的前言是在抖音平台做流量新增&#xff0c;现在抖音及各大主流短视频平台&#xff0c;流量新增&#xff0c;各大企业需要在短视频…

10- YOLO算法一 (目标检测)

要点&#xff1a; yolo算法属于 One-stage detector 一 YOLO v1 1) 将一幅图像分成SxS个网格(grid cell)&#xff0c;如果某个object的中心 落在这个网格中&#xff0c;则这个网格就负责预测这个object。 2)每个网格要预测B个bounding box&#xff0c;每个bounding box 除了…

springboot配置多个数据源【详解】

springboot配置多个数据源【详解】 前言&#xff0c;什么是数据源与数据库连接池一、配置文件进行配置&#xff1a;1.导入依赖&#xff1a; 二、编写配置类&#xff1a;1.用来指定包扫描、指定sqlSessionTemplateRef2&#xff0c;用来指定mapper.xml的路径3.Mybatis主数据源ds1…