Oracle中EXISTS NOT EXISTS的使用

news2025/6/2 10:02:31

目录

1.IN与EXISTS

EXISTS用法总结 

2.NOT IN与NOT EXISTS 

3.not in 中 null的用法

4.EXISTS和IN的区别 (面试常问)


1.IN与EXISTS

示例:在 DEPT 表中找出在 EMP 表中存在的部门编号;

方法一:使用in

select DEPTNO
from DEPT
where DEPTNO in (select distinct DEPTNO from EMP);

方法二:使用exists

select DEPTNO
from DEPT d
where exists(select 1 from EMP e where d.DEPTNO = e.DEPTNO);

上面两种方法结果都是一样的: 

IN和EXISTS的区别:IN是将子查询的内容拿到select里面,EXISTS是将值带入子查询

exists要求返回的是一个布尔类型true/false

SELECT deptno FROM emp e WHERE e.deptno=40  --false
SELECT deptno FROM emp e WHERE e.deptno=30  --true
SELECT deptno FROM emp e WHERE e.deptno=20  --true
SELECT deptno FROM emp e WHERE e.deptno=10  --true

1=1 --true
1=2 --false

EXISTS用法总结 

  1. EXISTS基本都是放在 WHERE 后面作为过滤条件使用;
  2. EXISTS括号里面 SELECT 对应的值无意义,SELECT 任何值都可以;
  3. EXISTS后面可以接其它条件; 

2.NOT IN与NOT EXISTS 

示例:在 DEPT 表中找出在 EMP 表中不存在的部门编号 

-- not in
select DEPTNO
from DEPT
where DEPTNO not in (select DEPTNO from EMP group by DEPTNO);

-- not exists
select DEPTNO
from DEPT d
where not exists(select 1 from EMP e where d.DEPTNO = e.DEPTNO);

比较下面两个表: 

CREATE TABLE t2(ID NUMBER);
CREATE TABLE t1(ID NUMBER);

INSERT INTO t2 VALUES(1);
INSERT INTO t2 VALUES(NULL);
INSERT INTO t1 VALUES(1);
INSERT INTO t1 VALUES(2);
INSERT INTO t1 VALUES(NULL);

SELECT * FROM t1;
SELECT * FROM t2;

                 

--从t1找到t2有的值 in
select ID from t1 where ID in (select ID from t2);
-- 1

--从t1找到t2有的值 exists
select ID from t1 where exists (select ID from t2 where t2.ID = t1.ID);
-- 1

--从t1找到t2没有的值 not in
select * from T1 where ID not in (select id from T2);
-- 没有返回值

--从t1找到t2没有的值 not exists
select ID from T1 where not exists(select ID from t2 where t2.ID = t1.ID);
-- null
-- 2

为什么上面使用not in的时候没有结果,而使用not exists的时候有结果呢?

3.not in 中 null的用法

        NULL在SQL中被视为一种特殊值,它既不等于任何值,也不不等于任何值,包括它自己。

        这意味着,当比较任何值与NULL时,结果都不是TRUE,这样的比较总是未知(NULL)

结论:

        NOT IN 子查询返回NULL,那么整个NOT IN表达式的结果将是NULL

        NOT EXISTS 不会因为子查询返回NULL而影响结果,它只关心子查询是否有结果返回。

        当子查询返回的结果是null时,表示false,前面再加上not exists,双重否定表示肯定,就是true,因此null被成功返回。

场景EXISTS结果NOT EXISTS结果
子查询返回至少一行TRUEFALSE
子查询返回空集FALSETRUE
--从t1找到t2有的值 exists
select ID from t1 where exists (select ID from t2 where t2.ID = t1.ID);
-- 1
  • 对于t1.ID = 1,子查询找到t2.ID = 1,返回1,因此t1的第一行被选中。
  • 对于t1.ID = 2,子查询未找到匹配,返回空,因此t1的第二行被过滤。
  • 对于t1.ID = NULL,子查询中的t2.ID = NULL永远为UNKNOWN,子查询返回空,因此t1的第三行被过滤。并且返回null也表示false,exists不会返回,exists只会返回子查询结果为true的

4.EXISTS和IN的区别 (面试常问)

IN 是内表驱动外表,适合 内表 比 外表 数据量小的情况

EXISTS 是外表驱动内表, 适合 内表 比 外表 数据量大的情况

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

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

相关文章

01.认识Kubernetes

什么是Kubernets 套用官方文档对Kubernetes的定义,翻译成中文的意思是: Kubernetes,也称为k8,是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。 它将组成应用程序的容器分组为逻辑单元,以便于管理和发现…

【PostgreSQL 02】PostgreSQL数据类型革命:JSON、数组与地理信息让你的应用飞起来

PostgreSQL数据类型革命:JSON、数组与地理信息让你的应用飞起来 关键词 PostgreSQL高级数据类型, JSONB, 数组类型, PostGIS, 地理信息系统, NoSQL, 文档数据库, 空间数据, 数据库设计, PostgreSQL扩展 摘要 PostgreSQL的高级数据类型是其区别于传统关系数据库的核心…

Acrobat DC v25.001 最新专业版已破,像word一样编辑PDF!

在数字化时代,PDF文件以其稳定性和通用性成为了文档交流和存储的热门选择。无论是阅读、编辑、转换还是转曲,大家对PDF文件的操作需求日益增加。因此,一款出色的PDF处理软件不仅要满足多样化的需求,还要通过简洁的界面和强大的功能…

桥 接 模 式

在玩游戏的时候我们常常会遇到这样的机制:我们可以随意选择不同的角色,搭配不同的武器。这时只有一个抽象上下文的策略模式就不那么适用了,因为一旦我们使用继承的方式,武器和角色总有一方会变得难以扩展。这时,我们就…

基于 Flink+Paimon+Hologres 搭建淘天集团湖仓一体数据链路

摘要:本文整理自淘天集团高级数据开发工程师朱奥老师在 Flink Forward Asia 2024 流式湖仓论坛的分享。内容主要为以下五部分: 1、项目背景 2、核心策略 3、解决方案 4、项目价值 5、未来计划 01、项目背景 1.1 当前实时数仓架构 当前的淘天实时架构是从…

多杆合一驱动城市空间治理智慧化

引言:城市“杆林困境”与智慧化破局 走在现代城市的街道上,路灯、监控、交通信号灯、5G基站等杆体林立,不仅侵占公共空间,更暴露了城市治理的碎片化问题。如何让这些“沉默的钢铁”升级为城市的“智慧神经元”?答案在…

用QT写一个车速表

主要包含以下绘制步骤: 1、绘制画布: /** 绘制画布 */ void Widget::initCanvas(QPainter &painter) {//消除锯齿painter.setRenderHint(QPainter::Antialiasing,true);//设置底色painter.setBrush(QColor(0,0,0));painter.drawRect(rect());//平移…

数控技术应用理实一体化平台VR实训系统

::产品概述:: 目前我国本科类院校学生普遍存在的问题就是缺少对实际工作的了解,一直在学习相关专业的理论知识,对社会的相关企业的用人情况不了解。这也就直接导致了毕业的学生和社会上的用人单位需求有点脱节,这也是由于我国的现行本科教育侧…

C# 将HTML文档、HTML字符串转换为图片

在.NET开发中,将HTML内容转换为图片的需求广泛存在于报告生成、邮件内容存档、网页快照等场景。Free Spire.Doc for .NET作为一款免费的专业文档处理库,无需Microsoft Word依赖,即可轻松实现这一功能。本文将深入解析HTML文档和字符串转图片两…

界面控件DevExpress WinForms v24.2新版亮点:富文本编辑器功能全新升级

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…

华为云Flexus+DeepSeek征文|华为云 Flexus X 加速 Dify 平台落地:高性能、低成本、强可靠性的云上选择

目录 前言 1 一键部署 Dify 平台的完整步骤 1.1 选择模板 1.2 参数配置 1.3 资源栈设置 1.4 配置确认与部署 2 Flexus X 服务器的技术优势 2.1 柔性算力随心配 2.2 一直加速一直快 2.3 越用越省降本多 2.4 安全可靠更放心 3 Flexus X 在 Dify 解决方案中的性能体验…

Jenkins 2.479.1安装和邮箱配置教程

1.安装 在JDK安装并设置环境变量完成后,下载官网对应的war版本,在对应目录下打开命令行窗口并输入 java -jar jenkins.war其余参数感兴趣可以自行查阅,这里启动的 jenkins 服务默认占用8080端口,在浏览器输入 localhost:8080进入…

DFS入门刷题c++

目录 821. 跳台阶 - AcWing题库 ​92. 递归实现指数型枚举 - AcWing题库 ​P1706 全排列问题 - 洛谷 (luogu.com.cn) P1157 组合的输出 - 洛谷 (luogu.com.cn) ​P1036 [NOIP 2002 普及组] 选数 - 洛谷 (luogu.com.cn) P2089 烤鸡 - 洛谷 (luogu.com.cn) P1088 [NOIP 2…

ToolsSet之:十六进制及二进制编辑运算工具

ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用,应用基本功能介绍可以查看以下文章: Windows应用ToolsSet介绍https://blog.csdn.net/BinField/article/details/145898264 ToolsSet中Number菜单下的Hex Operate工具可以进…

【Python训练营打卡】day40 @浙大疏锦行

DAY 40 训练和测试的规范写法 知识点回顾: 1. 彩色和灰度图片测试和训练的规范写法:封装在函数中 2. 展平操作:除第一个维度batchsize外全部展平 3. dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropo…

MCP Server的五种主流架构:从原理到实践的深度解析

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 在AI大模型与外部数据交互的浪潮中,MCP Server(Model Context Protocol Server)已成为连接模型与现实世界的桥梁。本文…

跨协议协同智造新实践:DeviceNet-EtherCAT网关驱动汽车焊接装配效能跃迁

在汽车制造领域,机器人协作对于提升生产效率与产品质量至关重要。焊接、装配等关键环节,需要机器人与各类设备紧密配合。JH-DVN-ECT疆鸿智能的devicenet从站转ethercat主站协议网关,成为实现这一高效协作的得力助手,尤其是在连接欧…

让 Deepseek 写一个尺码计算器

下面是一个简单的尺码计算器微信小程序的代码实现,包含页面布局、逻辑处理和样式。 1. 项目结构 size-calculator/ ├── pages/ │ ├── index/ │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── inde…

代码随想录算法训练营第60期第五十三天打卡

大家好,我们今天来到了最后一章图论,其实图论比较难,涉及的算法也比较多,今天比较重要的就是深度优先搜索与广度优先搜索,后面的迪杰斯特拉算法等算法在我们求最短路都会涉及到,还有最近公共祖先&#xff0…

Nacos实战——动态 IP 黑名单过滤

1、需求分析 一些恶意用户(‏可能是黑客、爬虫、DDoS ؜攻击者)可能频繁请求服务器资​源,导致资源占用过高。针对这种问题,可以通过IP‏ 封禁,可以有效拉؜黑攻击者,防止资源​被滥用,保障合法…