SQL中如何使用EXISTS替代IN

2023-11-03

        我们在程序中一般在做SQL优化的时候讲究使用EXISTS带替代IN的做法,理由是EXISTS执行效率要比IN高。
  之前我一直挺懵懂的一件事情是如何使用EXISTS来替换IN呢,二者表示的意义又是什么呢?今天就我个人理解记录一下
  IN表示范围,指某一字段在某一范围之内,这个范围一般使用子查询来获取,由此可知IN子查询返回的结果应该就是这个范围集。
  EXISTS表示存在,指至少存在一处,这个条件由EXISTS子查询来完成,但是在这里EXISTS子查询返回的结果却不再是一个结果集,而是一个布尔值(true或false),其实这个挺好理解的,EXISTS就表示如果子查询能查到值则返回true,则执行EXISTS之前的语句。
举个栗子
  假如有一个表user,它有两个字段id和name,我们要查询名字中带a的用户信息:
  最简单的SQL:select * from user where name like '%a%';
  使用IN的SQL:select u.* from user u where u.id in (select uu.id from user uu where uu.name like '%a%');
  我们现在将使用IN的SQL修改为使用EXISTS的SQL该怎么写呢?
  一开始我直接将u.id in 替换为EXISTS,获得如下语句 :
    select u.* from user u where exists(select uu.id from user uu where uu.name like '%a%');
  经过测试发现输出结果错误,该语句将所有的用户全部一个不漏的查询出来了,相信你也发现了问题,后来我对上述语句做了修改如下:
    select u.* from user u where exists (select uu.id from user uu where uu.name like '%a%' and uu.id=u.id);
  如你所见,只是在子查询中添加了“and uu.id=u.id”,结果查询结果正确。
  那么原因为何呢?
  总结:EXISTS子查询可以看成是一个独立的查询系统,只为了获取真假逻辑值,EXISTS子查询与外查询查询的表是两个完全独立的毫无关系的表(当第二个表中的name中有包含a的姓名存在,那么就执行在第一个表中查询所有用户的操作),当我们在子查询中添加了id关联之后,EXISTS子查询与外查询查询的表就统一了,是二者组合组建的虚表,是同一个表(这样当子查询查询到虚表中当前行的uu.name中包含a时,则将虚表当前行中对应的u.id与u.name查询到了)
  所以一切的重点就在这个ID关联之上,添加ID关联,数据库会先将两张表通过ID关联组合成一张虚表,所有的查询操作都在这张虚表上完成,操作的是同一张表,当然就不会出现之前的那种情况了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL中如何使用EXISTS替代IN 的相关文章

  • mysql中的按位移位

    如何在 MySQL 中进行按位移位 有没有具体的指令或者操作符 如果不是 如何最佳地模拟它 看一下按位运算符MySQL first http dev mysql com doc refman 5 0 en bit functions htm
  • 如何使组合键唯一?

    I am making a database of students in one school Here is what I have so far 如果您不喜欢阅读 请跳至 简而言之 部分 问题是我对这个设计并不满意 我想要的组合gra
  • 如何在 PHP MYSQL 中将数据库表和每条记录从一台数据库服务器复制到另一台数据库服务器?>

    您好 我编写了一段代码 可以将数据库表从一个服务器复制到另一个服务器 但是每个表的记录没有复制 如何编写一个可以将表和每个记录从一个数据库服务器复制到另一个数据库服务器的函数 这是我的示例代码
  • MySQL - 查询合并具有相同 id 的行并保留该 id 的所有条目但作为一条记录

    我一直在处理本地保存在 wamp 服务器上的 mysql 数据库中的表 我正在使用 wamp 中的 phpmyadmin 区域来运行查询 我正在尝试获取数据来执行以下操作 谁能帮我制作一张包含许多植物记录的表格 植物可以有多个名称 表格将其
  • 尝试通过比较不同的表从 SQL 查询输出正确的值

    我对 SQL 非常陌生 需要有关如何使用正确的查询完成此任务的帮助 我有 2 张桌子需要使用 表 TB1 有 id Name 1 bob 2 blow 3 joe 表 TB2 有 compid property 1 bob 2 blow 我
  • 为什么涉及用户变量的表达式的求值顺序未定义?

    From MySQL手册 http dev mysql com doc refman 5 7 en user variables html以下查询的输出不保证始终相同 SET a 0 SELECT a AS first a a 1 AS s
  • 从 Yii2 中的联结表检索数据

    我试图从 Yii2 中的连接表获取数据无需额外查询 我有 2 个模型 用户 组 通过连接表 user group 关联 在 user group 表中 我想存储此关系的额外数据 管理标志 将数据添加到连接表的最佳方法是什么 link 方法接
  • 什么时候应该使用 XML 而不是 SQL? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用全文搜索查找精确匹配

    使用 Sql Server 2008 如何使用全文搜索来实际找到精确的字符串匹配 我对此感到非常困难 而且我在网上找不到令人满意的解决方案 例如 如果我正在搜索字符串 Bojan Skrchevski 我希望第一个结果正是如此 到目前为止
  • 使用 SqlDataReader.IsDBNull 时使用列名

    我已经得到了从 SQL DB 读取数据的代码 我不知道应该如何编辑它 以便我可以使用原始列名称而不是列索引 string query SELECT FROM zajezd WHERE event thisrow AND year klien
  • Mac OS X Yosemite/El Capitan 上自动启动 MySQL 服务器

    我想在启动时自动启动 MySQL 服务器 这在小牛队是可能的 但在优胜美地似乎不起作用 edit 似乎这也适用于 El Capitan dcc 非常接近 这是 MySQL 在 Yosemite 上再次自动启动的方式 The com mysq
  • 使用 Hibernate 和 MySQL、全局和本地进行 Spring 事务管理

    我正在使用 MySQL Server 5 1 Spring 3 0 5 和 Hibernate 3 6 开发 Web 应用程序 我使用 Springs 事务管理 我是新手 所以如果我问一个容易回答的问题 请耐心等待 1 我读到了有关全局 x
  • grails/mysql 时区更改

    完成更改应用程序时区的最佳方法是什么 在我看来 必须发生以下情况 服务器 TZ 已被系统管理员更改 mysql必须重新启动 数据库中每个基于时间的列都必须使用convert tz 或等效方法更新所有值 因此 要么必须编写一个 mysql 脚
  • 显示包含特定表的所有数据库名称

    我的 SQL Server 中有很多数据库 我必须只搜索包含特定表名的数据库名称Heartbitmaster 我有很多数据库 例如Gotgold DVD等 我只想从包含此表的查询中查找数据库名称Heartbitmaster 我搜索我尝试查询
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • 按每月时间为用户标记标签

    数据源 User ID Visit Date 1 2020 01 01 12 29 15 1 2020 01 02 12 30 11 1 2020 04 01 12 31 01 2 2020 05 01 12 31 14 Problem 我
  • 返回年份数组作为年份范围

    我正在尝试查询一个包含以下内容的表character varying 年份列 并将这些年份作为逗号分隔的年份范围字符串返回 年份范围将由数组中存在的连续年份确定 不连续的年份 年份范围应以逗号分隔 数据类型的原因是character var
  • 对带有空白 NVARCHAR 或 NULL 检查的 VARCHAR 索引进行 Count(*) 会导致返回的行数加倍

    我有一张桌子 上面有VARCHAR列及其上的索引 每当一个SELECT COUNT 是在这张表上完成的 该表检查了COLUMN N OR COLUMN IS NULL它返回双倍的行数 SELECT 与相同的where子句将返回正确的记录数
  • 表达与空列表相同的 IN 条件的可移植方式是什么?

    例如 工作于sqllite3 select from orders where custid and status in 但它失败了postgres ksysdb select code applicable objecttype from
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat

随机推荐

  • fiddler接口基础

    为什么要先学fiddler 学习接口测试必学http协议 如果直接先讲协议 我估计小伙伴们更懵 为了更好的理解协议 先从抓包开始 结合抓包工具讲http协议更容易学一些 抓firefox上https请求 fiddler是一个很好的抓包工具
  • 小理解

    一 数组指针 数组名本身就是一个指针 指向数组的首地址 如int p 10 表示一个指向10个int元素的数组的一个指针 注意这是声明定长数组时 其数组名指向的数组首地址是常量 而声明数组并使某个指针指向其值指向某个数组的地址 不一定是首地
  • 堆栈详解

    堆区 1 存储的全部是对象 每个对象都包含一个与之对应的class的信息 class的目的是得到操作指令 2 jvm只有一个堆区 heap 被所有线程共享 堆中不存放基本类型和对象引用 只存放对象本身 栈区 1 每个线程包含一个栈区 栈中只
  • 程序设计的基本概念

    程序设计的基本概念 1 程序 2 结构化程序设计 1 程序 由高级语言编写的程序称为 源程序 由C语言编写的程序扩展名为 C 经过 编译 目标程序 后生成文件的扩展名为 obj 经过 链接 可执行程序 后生成文件的扩展名为 exe C语言源
  • System.Net.HttpListenerException (0x80004005): 拒绝访问。

    C 生成的exe突然报错了 原来是被人改了权限配置 我也没改回来 只需要将生成的exe设置成管理员身份运行 往后就不会再报错了
  • 15个免费学习JavaScript的最佳网站

    JavaScript是Web最流行的语言 对于任何Web开发人员来说 JavaScript现在是必须学习的语言 像追踪树这样的创新已经大大提高了JavaScript的性能 并且它在所有开发人员中越来越受欢迎 如果您想要事业得到进一步的发展
  • Python 基础——range() 与 np.arange()

    range 返回的是range object 而np arange 返回的是numpy ndarray type np arange 10 np ndarray 两者都是均匀地 evenly 等分区间 range尽可用于迭代 而np ara
  • Images之Dockerfile中的命令2

    COPY COPY has two forms COPY chown
  • cocos2dx中毒冰冻shader

    中毒效果 ifdef GL ES precision mediump float endif uniform sampler2D u texture varying vec2 v texCoord varying vec4 v fragme
  • 《深入理解Java函数式编程》系列文章

    Introduction 本系列文将帮助你理解Java函数式编程的用法 原理 本文受启发于JavaOne 2016关于Lambda表达式的相关主题演讲Lambdas and Functional Programming和Refactorin
  • 在Python环境下使用pgmpy构建动态贝叶斯网络并进行参数学习(附详细代码)

    首先列举当前主要构建贝叶斯网络的一些工具 1 软件 Netica SMILE 2 MATLAB包 BNT 3 Python包 pgmpy libpgm pomegranate 4 R包 dbnlearn 如果是单纯的进行贝叶斯网络的学习与推
  • html弹窗代码只弹窗一次,信息弹窗提示一天只弹出一次js代码

    信息弹窗提示一天只弹出一次js代码 通过jquery cookie js实现功能 避免重复弹出 弹窗提示 margin 0 padding 0 alert windows display none position absolute z i
  • 计算机网络第八版详细思维导图复习(可复制修改)

    按照我们学校的教学课本 计算机网络第八版 谢希仁 计算机网络自顶向下第七版 老师习题讲解课件 B站 计算机网络微课堂 有字幕无背景音乐版 王道计算机考研 计算机网络 湖科大深入浅出计算机网络 示范教学包等途径整合而成 有个人总结和自己的思考
  • 使用SVG+React实现飞行仪表仿真

    SVG React实现 演示地址 https liujialun github io i
  • 深入理解Mysql底层数据结构

    一 索引的本质 索引是帮助MySQL高效获取数据的排好序的数据结构 二 索引的数据结构 二叉树 红黑树 Hash表 BTree B Tree mysql的索引采用的是B 树的结构 mysql为什么不用二叉树 因为对于单边增长的数据列 二叉树
  • SSE2介绍及其简单用法举例

    SSE2 全名为Streaming SIMD Extensions 2 是一种IA 32架构的SIMD指令集 SSE2是在2001年随着Intel发表第一代Pentium 4处理器也一并推出的指令集 它延伸较早的SSE指令集 而且可以完全取
  • 腾讯开启薪酬改革,晋升不调薪,需要结合业绩评估

    六月的第一天有媒体爆出 腾讯全员收到邮件 公司开启新一轮的薪酬改革 邮件中的重点内容是 公司认可晋升代表能力提升以及更高的职责要求 同时也要求将能力转化为业绩贡献 所以年度薪资回顾时会结合业绩贡献 能力提升 薪酬竞争力等因素综合评估 腾讯公
  • stable diffusion--二次元福利

    继上次用stable diffusion生成谪仙男子外貌翻车后 痛定思痛 发现用stable diffusion webui这个神器 效果出乎意料的好 01 安装教程 1 pytorch安装 具体安装可查看我之前的图文libtorch导入模
  • Object.defineProperty()方法的使用

    在我们学习到Vue响应式原理的时候 必然要了解到JS里Object defineProperty 方法 底层就是用这个方法来实现的 可以实现对象的简单代理 Object defineProperty 方法会直接在一个对象上定义一个新属性 或
  • SQL中如何使用EXISTS替代IN

    我们在程序中一般在做SQL优化的时候讲究使用EXISTS带替代IN的做法 理由是EXISTS执行效率要比IN高 之前我一直挺懵懂的一件事情是如何使用EXISTS来替换IN呢 二者表示的意义又是什么呢 今天就我个人理解记录一下 IN表示范围