sql查询中使用in和exits比较和区别

article/2025/10/31 2:51:16

首先,查询中涉及到的两个表,一个user和一个order表,具体表的内容如下:

    user表:

    

    order表:

    

 

  in

    确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

    具体sql语句如下:

 1 SELECT2     *3 FROM4     `user`5 WHERE6     `user`.id IN (7         SELECT8             `order`.user_id9         FROM
10             `order`
11     )

    这条语句很简单,通过子查询查到的user_id 的数据,去匹配user表中的id然后得到结果。该语句执行结果如下:

    

    它的执行流程是什么样子的呢?让我们一起来看一下。

    首先,在数据库内部,查询子查询,执行如下代码:

        SELECT`order`.user_idFROM`order`

    执行完毕后,得到结果如下:

    

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

    

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

  exists

    指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。

    具体sql语句如下:

 1 SELECT2     `user`.*3 FROM4     `user`5 WHERE6     EXISTS (7         SELECT8             `order`.user_id9         FROM
10             `order`
11         WHERE
12             `user`.id = `order`.user_id
13     )

    这条sql语句的执行结果和上面的in的执行结果是一样的。

    

    但是,不一样的是它们的执行流程完全不一样:

    使用exists关键字进行查询的时候,首先,我们先查询的不是子查询的内容,而是查我们的主查询的表,也就是说,我们先执行的sql语句是:

     SELECT `user`.* FROM `user` 

    得到的结果如下:

    

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

EXISTS (SELECT`order`.user_idFROM`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要快。


http://chatgpt.dhexx.cn/article/Yra52AwV.shtml

相关文章

SQL语句中exits和in的区别

一 表展示 查询中涉及到的两个表,一个user和一个order表,具体表的内容如下: user表: order表: 二 in 演示 确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表&#xff0c…

E. Exits in Excess

题意&#xff1a; 移除最多一半的边使得图没有环。 将所有边分成两部分&#xff0c; 第一部分为 u < v u < v u<v&#xff0c; 第二部分为 v > u v > u v>u&#xff0c; 将小的边集合删去即可。 AC代码&#xff1a; int n, m; vector<int> v1, v2…

20220621 Dual Quaternion

文章目录 对偶数一、对偶数是什么&#xff1f;二、对偶矢量三、对偶四元数 对偶数 一、对偶数是什么&#xff1f; https://zhuanlan.zhihu.com/p/358146509 对偶数是一种特殊的自洽的运算&#xff0c;类似于常用的复数基本单位 i i i &#xff08; i 2 − 1 i^2-1 i2−1&a…

Quaternion

01:欧拉角 1.欧拉角Vector3(x,y,z)代表的是旋转物体&#xff08;若是标准旋转那么是旋转坐标轴x,y,z&#xff0c;转换为旋转物体则旋转角度取反顺序不变&#xff09;&#xff0c;且是将物体从物体坐标系旋转到惯性坐标系&#xff08;世界坐标系中为了渲染&#xff09;&#x…

Quaternion.Euler调整记录

Quaternion.Euler调整 1.运行unity 调整摄像头视角&#xff0c;找到需要的位置&#xff0c;记录下 摄像头的位置和旋转角度。 2.调整空物体的位置 使之位置与需要的位置一致 3.调整Quaternion.Euler 使Quaternion.Euler与旋转数值一致。

Quaternion(四元数)和旋转以及Yaw, pitch, roll 的含义

原文&#xff1a; http://www.linuxgraphics.cn/graphics/opengl_quaternion.html Quaternion(四元数)和旋转 本文介绍了四元数以及如何在OpenGL中使用四元数表示旋转。 Quaternion 的定义 四元数一般定义如下&#xff1a; qwxiyjzk其中 w,x,y,z是实数。同时&#xff0c;有…

Unity3d开发之对Quaternion的使用

上周找到了新公司。这周二来上班。可怕的是我刚去的第二天下午四点领导通知我做一个VRdemo&#xff0c;要求第二天交。我勒个擦。我现在对设备还没熟悉呢。连sdk都没下载而且距离上一次开发vr是在快两年之前了。属实让我措手不及。没错&#xff0c;按剧本走&#xff0c;加班到凌…

【Unity编程】四元数(Quaternion)与欧拉角

欧拉旋转、四元数、矩阵旋转之间的差异 除了欧拉旋转以外&#xff0c;还有两种表示旋转的方式&#xff1a;矩阵旋转和四元数旋转。接下来我们比较它们的优缺点。 欧拉角 优点&#xff1a;三个角度组成&#xff0c;直观&#xff0c;容易理解。优点&#xff1a;可以进行从一个方…

Quaternion类

Euler public static Quaternion Euler(float x, float y, float z); public static Quaternion Euler(Vector3 euler); 功能: 返回Quaternion对应的欧拉角 例子&#xff1a; public class ExampleClass : MonoBehaviour {public Quaternion rotation Quaternion.Euler(0, 30,…

Unity Quaternion

Quaternion 类的属性 eulerAngles 欧拉角 Quaternion 类的实例方法 1、SetFromToRotion 函数 2、SetLookRotation 函数 3、ToAngleAxis 函数 Quaternion 类的静态方法 1、Angle方法 2、Dot方法 3、Euler方法 4、FromToRotation方法 5、Inverse方法 6、Lerp方法 7…

【第018问 Unity中对Quaternion.AngleAxis的理解?】

一、背景 在游戏研发过程中&#xff0c;有时候会对一个物体经过多次围绕不同的轴进行不同角度的旋转&#xff0c;从而计算得到一个方向&#xff0c;以此来检测在该对应的方向上是否有对应的物体或别的对象&#xff0c;因此本节对Quaternion.AngleAxis进行简单的记录&#xff1…

Unity API详解——Quaternion类

Quaternion类又称四元数&#xff0c;由x、y、z和w这4个分量组成&#xff0c;属于struct类型。在Unity中&#xff0c;用Quaternion来存储和表示对象的旋转角度。Quaternion的变换比较复杂&#xff0c;对于GameObject一般的旋转及移动&#xff0c;可以用Transform中的相关方法实现…

Unity3D - 详解Quaternion类[转载]

一、简介 Quaternion又称四元数&#xff0c;由x,y,z和w这四个分量组成&#xff0c;是由爱尔兰数学家威廉卢云哈密顿在1843年发现的数学概念。四元数的乘法不符合交换律。从明确地角度而言&#xff0c;四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话&…

【Unity】Unity常用类:向量Vector3、四元数Quaternion

文章目录 Vector3构造函数静态变量变量运算符常用方法&#xff08;静态&#xff09;OrthoNormalize&#xff08;正交标准化&#xff09;Reflect&#xff08;反射&#xff09;Lerp&#xff08;线性插值&#xff09; Quaternion构造函数静态变量变量常用方法Eular&#xff08;欧拉…

unity学习笔记——Quaternion(四元数)

本篇文章转自https://www.cnblogs.com/driftingclouds/p/6626183.html Quaternion类 Quaternion&#xff08;四元数&#xff09;用于计算Unity旋转。它们计算紧凑高效&#xff0c;不受万向节锁的困扰&#xff0c;并且可以很方便快速地进行球面插值。 Unity内部使用四元数来表…

【Unity编程】Unity中关于四元数的API详解

Unity中关于四元数的API详解 Quaternion类 Quaternion&#xff08;四元数&#xff09;用于计算Unity旋转。它们计算紧凑高效&#xff0c;不受万向节锁的困扰&#xff0c;并且可以很方便快速地进行球面插值。 Unity内部使用四元数来表示所有的旋转。 Quaternion是基于复数&am…

四元数快速入门【Quaternion】

四元数&#xff08;Quaternion&#xff09;是用于旋转和拉伸向量的数学运算符。 本文提供了一个概述&#xff0c;以帮助理解在空间导航等应用程序中对四元数的需求。 推荐&#xff1a;用 NSDT场景设计器 快速搭建3D场景。 可以通过多种方式在空间中准确定位、移动和旋转物体。 …

四元数(Quaternion)食用指南

四元数&#xff08;Quaternion&#xff09;食用指南 “这简直就是黑魔法&#xff01;” 开发时&#xff0c;每次遇到旋转问题时总会心头一震&#xff0c;在欧拉角和四元数这两种处理方式的选择上犹豫不决&#xff0c;不知不觉就陷入了四元数的淤泥中…接下来&#xff0c;我决定…

Unity3D - 详解Quaternion类

一、简介 Quaternion又称四元数&#xff0c;由x,y,z和w这四个分量组成&#xff0c;是由爱尔兰数学家威廉卢云哈密顿在1843年发现的数学概念。四元数的乘法不符合交换律。从明确地角度而言&#xff0c;四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话&…

int 的最大值

int 的最大值 java int 类整数的最大值是 2 的 31 次方 - 1 2147483648 - 1 2147483647 可以用 Integer.MAX_VALUE 表示它&#xff0c;即 int value Integer.MAX_VALUE; Integer.MAX_VALUE 1 Integer.MIN_VALUE -2147483648 再大的数就要用 long &#xff08;最大值 …