not in 和 not exists 比较和用法
尽量不要使用not in(它会调用子查询),而尽量使用not exists(它会调用关联子查询)。
查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in 要快。
NOT IN 查询返回空结果:
即使在子查询中过滤掉了 NULL 值,NOT IN 仍然可能返回空结果,特别是当 employees 表中的 department_id 为 NULL 时。
NOT EXISTS 查询返回结果:
NOT EXISTS 不受 NULL 值的影响,能够正确返回没有对应 department_id 的员工。
【解决方法】
由于本人,在没有使用COALESCE,导致每一次的查询 not in 和 not exists 返回行不匹配,后来查询才得知在null 处理上有问题导致的。
为了确保 NOT IN 查询也能正确返回结果,我们需要考虑 employees 表中的 department_id 为 NULL 的情况。我们可以使用 COALESCE 函数来处理 NULL 值。
COALESCE 函数:
COALESCE 函数用于返回第一个非 NULL 的表达式值。在这里,我们将 NULL 值替换为 -1,以确保 NULL 值不会影响查询结果。
子查询:
子查询中也使用 COALESCE 函数将 NULL 值替换为 -1,以确保子查询结果集中不包含 NULL 值。
SQL> -- 使用 NOT IN 并处理 NULL 值
SQL> SELECT e.employee_id, e.first_name, e.last_name
2 FROM employees e
3 WHERE COALESCE(e.department_id, -1) NOT IN (
4 SELECT COALESCE(d.department_id, -1)
5 FROM departments d
6 );
EMPLOYEE_ID FIRST_NAME LAST_NAME
----------- -------------------- -------------------------
178 Kimberely Grant
2 Bob Johnson

COALESCE 函数的使用:
使用 HASH JOIN ANTI SNA 可能会导致额外的内存开销,特别是在数据量较大的情况下。
但是,COALESCE 版本可以处理 NULL 值,确保 NOT IN 条件正确
SQL>
SQL> -- 使用 NOT EXISTS
SQL> SELECT e.employee_id, e.first_name, e.last_name
2 FROM employees e
3 WHERE NOT EXISTS (
4 SELECT 1
5 FROM departments d
6 WHERE d.department_id = e.department_id
7 );
EMPLOYEE_ID FIRST_NAME LAST_NAME
----------- -------------------- -------------------------
2 Bob Johnson
178 Kimberely Grant

SELECT e.employee_id, e.first_name, e.last_name
FROM employees e
WHERE NOT EXISTS (
SELECT *
FROM departments d
WHERE d.department_id = e.department_id
);
not in 和 not exists 比较和用法的更多相关文章
- SQLServer中exists和except用法
一.exists 1.1 说明 EXISTS(包括 NOT EXISTS)子句的返回值是一个BOOL值.EXISTS内部有一个子查询语句(SELECT ... FROM...),我将其称为EXIST的 ...
- SQL中EXISTS和IN用法
SQL中EXISTS的用法 指定一个子查询,检测行的存在. 语法:EXISTS subquery 参数:subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INT ...
- oracle中的exists 和 in 用法详解
以前一直不知道exists和in的用法与效率,这次的项目中需要用到,所以自己研究了一下.下面是我举两个例子说明两者之间的效率问题. 前言概述: “exists”和“in”的效率问题,涉及到效率问题也就 ...
- sql server if exists和 if not exists 的关键字用法
if exists和if not exists关键字用法 1.介绍 if not exists 即如果不存在,if exists 即如果存在 2.使用 a.判断数据库不存在时 if not ...
- exists oracle 的用法
CREATE TABLE `A` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGIN ...
- oracle中的exists和not exists和in用法详解
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询. not exists:做NL,对子查询先查,有个虚表,有确定值,所以就算子查询有NULL ...
- sql中exists和notexists用法总结(并和in的比较)
首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOT EXISTS 子查询中 找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如 ...
- 通过识别页面内容获得返回值判断后续执行(exists指令的用法)
本案例主要用到airtest 的exists指令 从指令解释可以知道,当判断某图片不存在的时候,会返回false值 脚本思路即为如果返回值==false则执行A,!=fales则执行B 下图脚本思路, ...
- mssql sqlserver if exists 用法大汇总
摘要: 下文讲述sqlserver中,更新脚本中常用if exists关键字的用法说明,如下所示: 实验环境:sql server 2008 R2 一.检测数据库是否存在于当前数据库引擎下 if ex ...
- Oracle-where exists()、not exists() 、in()、not in()用法以及效率差异
0.exists() 用法: select * from T1 where exists(select 1 from T2 where T1.a=T2.a) 其中 "select 1 fro ...
随机推荐
- 一个基于 .NET 8.0 构建的简单、跨平台、模块化商城系统
前言 今天给大家分享一个基于 .NET 8.0 构建的开源免费(MIT License).简单.跨平台.模块化的商城系统:Module Shop. 主要功能 销售:订单.物流. 内容:首页配置.评论. ...
- MongoDB学习笔记之 第1章 MongoDB的安装
MongoDB学习笔记之 第1章 MongoDB的安装 MongoDB学习笔记之 第2章 MongoDB的增删改查 MongoDB学习笔记之 第3章 MongoDB的Java驱动 MongoDB学习笔 ...
- input输入框与button按钮之间存在空隙
出现空隙是写代码的时候换行导致的,给input框加上float:left 可解决
- vs2017 opencv 编译错误 error C2665: “exp”: 3 个重载中没有一个可以转换所有参数类型
编译错误 - error C2665: "exp": 3 个重载中没有一个可以转换所有参数类型,在GenericPacketMath.h文件, 是因为使用了Eigen3.4库,只要 ...
- C# 读取本地的TXT文件内容
using (StreamReader streamReader = new StreamReader("C:\\Users\\zhang\\Desktop\\新建文件夹\\远程开关.txt ...
- 综述😋Security and Privacy Challenges of ✌Large Language Models A Survey
- 即时通讯技术文集(第22期):IM安全相关文章(Part1) [共13篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第22 期. [- 1 -] 即时通讯安全篇(一):正确地理解和使用Android端加密算法 ...
- 整理ML&AI学习路径图
干货分享: 下面给出一个笔者自己整理的GitHub仓库:https://github.com/isLinXu/awesome-road-map 里面包含了一些可供参考的学习路径和思维导图,并整理微软. ...
- 2022 年万圣节 Github 彩蛋
记录每年 Github 万圣节彩蛋,也记录有来项目成长历程. 2022 万圣节彩蛋 2021 万圣节彩蛋 2020 万圣节彩蛋
- Windows Server 2008R2服务器 IIS7.0 安装SSL证书并绑定https
本例以阿里云服务器来解说,本服务器为Winodws Server 2008 R2(一般现在至少是2012版本了)默认IIS为7.0 第一步: 在阿里云上申请好证书并下载IIS版本,下载后上传到服务器中 ...