当前位置: 首页 > news >正文

Oracle 中什么情况下 可以使用 EXISTS 替代 IN 提高查询效率

为什么 EXISTS 更高效?

EXISTS 提前终止:

     EXISTS 一旦在子查询中找到第一个匹配项,就会立即返回 TRUE,不再继续扫描子查询中的其他记录。IN 必须扫描整个子查询的结果集,将所有结果与主查询的每一行进行对比。

大数据集性能差异大:

     当子查询的数据集很大(如几万到几百万行)时,EXISTS 的提前终止特性会显著减少不必要的扫描。IN 在子查询中会生成临时结果集,这会导致更多的内存占用和性能开销。

🚀 EXISTS 替换 IN 的写法

IN 的原始写法:

SELECT * 
FROM employees e 
WHERE e.department_id IN ( SELECT d.department_id FROM departments d WHERE d.department_name = 'SALES'
);

这段 SQL 查询的逻辑是,查询部门名为 ‘SALES’ 的所有员工。
这里的 IN 先生成一个临时结果集(d.department_id),并与 e.department_id 进行对比。

🔄 使用 EXISTS 替换 IN

SELECT * 
FROM employees e 
WHERE EXISTS ( SELECT 1 FROM departments d WHERE d.department_name = 'SALES' AND d.department_id = e.department_id
);

这段 SQL 查询的逻辑是等价的。
不同点在于:

EXISTS 只要找到一个匹配项(d.department_id = e.department_id)就返回 TRUE,这时主查询中的这条 e 记录就被返回。
子查询中的 SELECT 1,实际上只要返回一行数据就能满足 EXISTS 条件,不需要返回字段值。

⚙️ EXISTS 和 IN 的区别

区别点INEXISTS
子查询结果生成子查询的完整结果集只要找到一个匹配的值就立即返回
子查询数据量适用于小数据集适用于大数据集
效率扫描整个子查询的结果集提前终止,效率高
关联条件主表的每一行与子查询的结果集比较子查询的条件与主表的每一行比较
内存使用子查询的结果集可能存储在临时表中不生成临时表,减少内存开销
索引利用索引不一定有效,可能全表扫描更容易利用索引

🔥 何时使用 EXISTS 替换 IN?

场景推荐使用方式原因
子查询返回大数据量EXISTS子查询中数据大,EXISTS 可以提前终止
子查询返回小数据量IN子查询小数据集,IN 性能也很好
子查询包含 NULL 值EXISTSIN 会因为 NULL 导致结果不匹配
主表数据多EXISTS主表数据多,EXISTS 在行对比上更高效
子查询不依赖主表IN如果子查询不依赖主表,IN 更清晰
子查询依赖主表EXISTS描子查询依赖主表的字段,EXISTS 更高效

🔍 示例 1:替代 IN 的常用场景

原始 SQL (使用 IN):

SELECT e.employee_name 
FROM employees e 
WHERE e.department_id IN (SELECT d.department_id FROM departments d WHERE d.department_name LIKE 'SALES%'
);

替换为 EXISTS:

SELECT e.employee_name 
FROM employees e 
WHERE EXISTS (SELECT 1 FROM departments d WHERE d.department_name LIKE 'SALES%' AND d.department_id = e.department_id
);

🔍 示例 2:避免 NULL 值的坑

原始 SQL (使用 IN):

SELECT * 
FROM employees e 
WHERE e.department_id IN (SELECT d.department_id FROM departments d WHERE d.department_name = 'SALES'
);

替换为 EXISTS:

SELECT * 
FROM employees e 
WHERE EXISTS (SELECT 1 FROM departments d WHERE d.department_name = 'SALES' AND d.department_id = e.department_id
);

🔍 示例 3:子查询依赖主表的场景

原始 SQL (使用 IN):

SELECT * 
FROM orders o 
WHERE o.customer_id IN (SELECT c.customer_id FROM customers c WHERE c.customer_type = o.customer_type
);

替换为 EXISTS:

SELECT * 
FROM orders o 
WHERE EXISTS (SELECT 1 FROM customers c WHERE c.customer_type = o.customer_type AND c.customer_id = o.customer_id
);

💡 总结

场景推荐使用
子查询返回大结果集EXISTS
子查询不依赖主表字段IN
子查询可能返回 NULLEXISTS
子查询依赖主表字段EXISTS
子查询小、主表大EXISTS
主表小、子查询大EXISTS

🚀 小结

  • EXISTS 在数据集较大时性能更高,尤其是子查询的返回数据量较大或包含 NULL 时。
  • EXISTS 避免了 IN 的“NULL 陷阱”,更安全。
  • 当子查询依赖主表的字段时,EXISTS 比 IN 更高效,因为不需要生成中间结果集。
  • EXISTS 可以提前终止子查询,在数据量较大时,性能优势更明显。

相关文章:

Oracle 中什么情况下 可以使用 EXISTS 替代 IN 提高查询效率

为什么 EXISTS 更高效? EXISTS 提前终止: EXISTS 一旦在子查询中找到第一个匹配项,就会立即返回 TRUE,不再继续扫描子查询中的其他记录。IN 必须扫描整个子查询的结果集,将所有结果与主查询的每一行进行对比。大数据集…...

Spring基础分析08-集成JPA/Hibernate进行ORM操作

大家好,今天和大家一起分享一下Spring集成JPAHibernate进行ORM操作的流程~ JPA(Java Persistence API)作为Java EE标准的一部分,提供了统一的API来管理实体类和持久化上下文;Hibernate则是最流行的JPA实现之一&#x…...

MySQL知识汇总(一)

一些命令行操作注意加 分号 “ ; ” show databases 查看所有数据库 use 数据库名 切换数据库 show tables 查看数据库中所有表 describe 表名 显示表中所有信息 create database [if not exists] 新库名 创…...

PDFMathTranslate 一个基于AI优秀的PDF论文翻译工具

PDFMathTranslate 是一个设想中的工具,旨在翻译PDF文档中的数学内容。以下是这个工具的主要特点和使用方法: 链接:https://www.modelscope.cn/studios/AI-ModelScope/PDFMathTranslate 功能特点 数学公式识别:利用先进的OCR&…...

React+Vite从零搭建项目及配置详解

相信很多React初学者第一次搭建自己的项目,搭建时会无从下手,本篇适合快速实现功能,熟悉React项目搭建流程。 目录 一、创建项目react-item 二、调整项目目录结构 三、使用scss预处理器 四、组件库Ant Design 五、配置基础路由 六、配置…...

@pytest.fixture() 跟 @pytest.fixture有区别吗?

在iOS UI 自动化工程里面最早我用的是pytest.fixture(),因为在pycharm中联想出来的fixture是带()的,后来偶然一次我没有带()发现也没有问题,于是详细查了一下pytest.fixture() 和 pytest.fixtur…...

Google Cloud Architect 认证考试错题集5

Google Cloud Architect 认证考试错题集5 D. Store static content such as HTML and images in a Cloud Storage bucket. Use Cloud Functions to host the APIs and save the user data in Firestore. - Storing static content in a Cloud Storage bucket is a cost-effecti…...

【Maven】基础(一)

【Maven】基础一 1. 虽然工作有段时间了,但是深感maven了解的不深入,所以这次开始深入的学习。 课程地址: https://www.bilibili.com/video/BV1JN411G7gX?spm_id_from333.788.player.switch&vd_source240d9002f7c7e3da63cd9a975639409a&p2 1.…...

多模态抽取图片信息的 Prompt

多模态抽取图片信息的 Prompt 1. 中文版2. 日文版3. 英文原版 下面使用多模态从图片中抽取文章,表格,Flowcharts的Prompt。 1. 中文版 你是一位擅长提取图片、图表、文本并对其进行解释的专家,能够保持原始语言不变。## 指南- 针对输入内容…...

WPF 使用LibVLCSharp.WPF实现视频播放、停止、暂停功能

使用LibVLCSharp.WPF实现视频播放、停止、暂停功能 1, NuGet 添加 VideoLAN.LibVLC.Windows 2. NuGet 添加 LibVLCSharp.WPF 3. wpf 代码如下&#xff1a; <Grid ><Grid.RowDefinitions><RowDefinition Height"*" /><RowDefinition Height&q…...

Java全栈项目 - 校园招聘信息平台

项目介绍 校园招聘信息平台是一个面向高校学生和企业的双向服务平台。该系统帮助企业发布招聘信息,方便学生查询职位并投递简历,同时为学校就业部门提供就业数据分析功能。 技术栈 后端 Spring Boot 2.xSpring SecurityMyBatis PlusMySQL 8.0RedisRabbitMQ 前端 Vue.js 2…...

java导出

请求头获取responseimport com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet;PostMapping("excel/export") ApiOperation(value "党员档案导出", httpMethod "POST")…...

【嵌入式系统】期末试题库,ARM处理器,CortexM3内核,USART,EXTI,GPIO

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...

arcgisPro相接多个面要素转出为完整独立线要素

1、使用【面转线】工具&#xff0c;并取消勾选“识别和存储面邻域信息”&#xff0c;如下&#xff1a; 2、得到的线要素&#xff0c;如下&#xff1a;...

QTday1

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口标题this->setWindowTitle("向日葵远程控制");//设置窗口图标this->setWindowIcon(QIcon("C:\\Users\\Hasee\\Desktop\\pictrue\\mypicture\\logo.png&…...

SAP ALV选择列排序时弹出定义排序顺序窗口问题

需求场景 使用REUSE_ALV_GRID_DISPLAY_LVC生成ALV&#xff0c;发现一个问题&#xff1a;使用it_events的时候选择列排序时会弹出定义排序顺序窗口&#xff0c;如下图所示。&#xff08;正常选择某一列再使用排序功能时会直接排序&#xff0c;不用再选择列&#xff09; CLASS l…...

CSS Backgrounds(背景)

CSS Backgrounds(背景) Introduction(介绍) CSS backgrounds play a crucial role in web design, allowing developers to apply colors, images, and other decorative elements to the background of HTML elements. This enhances the visual appeal of web pages and he…...

欧拉计划 Project Euler 27 题解

欧拉计划 Problem 27 题解 题干思路code 题干 思路 可以先筛1e6的素数出来然后暴力找即可&#xff0c;具体思路看代码 code #include <bits/stdc.h>using namespace std;using ll long long;const int N 1e6 5; bool vis[N]; int pri[N];void getPrime() {memset(v…...

迁移学习--fasttext概述

迁移学习 1、fasttext概述 作为NLP工程领域常用的工具包, fasttext有两大作用&#xff1a;进行文本分类、训练词向量 正如它的名字, 在保持较高精度的情况下, 快速的进行训练和预测是fasttext的最大优势。fasttext工具包中内含的fasttext模型具有十分简单的网络结构。使用fa…...

【数字信号处理】数字信号处理试题及答案,离散序列,Z变换,傅里叶变换

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...

如何高效使用Zettlr:开源写作工具的实用配置与技巧指南

如何高效使用Zettlr&#xff1a;开源写作工具的实用配置与技巧指南 【免费下载链接】Zettlr Your One-Stop Publication Workbench 项目地址: https://gitcode.com/GitHub_Trending/ze/Zettlr 还在为学术写作和知识管理寻找一个功能全面、界面简洁的跨平台工具吗&#x…...

医疗AI智能体:从数据到关怀人文设计:告别冰冷精准,构建有温度的诊疗交互.131

一、智能体的人文设计医疗AI智能体以大模型为核心&#xff0c;串联医学知识图谱、实体识别模块、风险评估模块、话术生成模块、伦理审核模块五大核心组件&#xff0c;最终实现精准医学判断 人性化交互的双重目标。而在医疗场景中&#xff0c;用户的核心需求从来不是单纯的数据…...

ZGC在超大堆(>16TB)下的隐性崩溃风险:JDK17~21版本兼容性断层分析(仅限内测团队知晓)

第一章&#xff1a;ZGC在超大堆&#xff08;>16TB&#xff09;下的隐性崩溃风险&#xff1a;JDK17~21版本兼容性断层分析&#xff08;仅限内测团队知晓&#xff09;当堆内存突破16TB阈值后&#xff0c;ZGC在JDK17至JDK21的多个GA版本中暴露出未公开的元数据结构越界行为——…...

DLSS状态指示器配置完全指南:实用监控工具深度解析

DLSS状态指示器配置完全指南&#xff1a;实用监控工具深度解析 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 在追求极致游戏体验的路上&#xff0c;你是否曾疑惑DLSS是否真正生效&#xff1f;DLSS Swapper作为一款专…...

ide-eval-resetter:突破JetBrains IDE试用期限制的创新方案——2026开发者必备指南

ide-eval-resetter&#xff1a;突破JetBrains IDE试用期限制的创新方案——2026开发者必备指南 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 问题引入&#xff1a;JetBrains IDE试用期限制的痛点分析 作为开发…...

神州数码无线网络(AC+AP)实战部署与优化指南

1. 神州数码ACAP无线网络部署前的规划准备 第一次接触神州数码无线网络方案时&#xff0c;我被它简洁的架构设计惊艳到了。AC&#xff08;无线控制器&#xff09;AP&#xff08;接入点&#xff09;的组网模式&#xff0c;特别适合500-2000平米的中型企业办公环境。但在真正动手…...

MinerU智能文档理解镜像:财务报表自动识别实战体验

MinerU智能文档理解镜像&#xff1a;财务报表自动识别实战体验 1. 引言&#xff1a;财务文档处理的痛点与机遇 在财务工作中&#xff0c;我们经常需要处理各种格式的财务报表——PDF扫描件、Excel截图、纸质文档照片等。传统的手工录入方式不仅效率低下&#xff0c;还容易出错…...

Python与OPC UA实战:高效读写PLC数据

1. 为什么选择Python操作OPC UA&#xff1f; 在工业自动化领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;就像工厂的"大脑"&#xff0c;而OPC UA则是让这个大脑与其他系统对话的"普通话"。作为Python开发者&#xff0c;我们经常需要从PLC读…...

webMAN-MOD终极指南:如何在PS3上安装这款强大的全能插件

webMAN-MOD终极指南&#xff1a;如何在PS3上安装这款强大的全能插件 【免费下载链接】webMAN-MOD Extended services for PS3 console (web server, ftp server, netiso, ntfs, ps3mapi, etc.) 项目地址: https://gitcode.com/gh_mirrors/we/webMAN-MOD 你是否还在为PS3…...

媒体查询、事件绑定、对象拷贝等知识点总结

一、媒体查询&#xff08;CSS3 响应式设计&#xff09;1. 基本语法cssmedia 媒体类型 and (媒体特性) {/* CSS 规则 */ }2. 常用媒体类型值说明screen电脑屏幕、平板、手机等print打印机all所有设备&#xff08;默认&#xff09;3. 常用媒体特性特性说明max-width最大宽度&…...