not in 和 not exists 比较和用法

news/2025/2/24 10:38:12/文章来源:https://www.cnblogs.com/anshenwang/p/18566536

尽量不要使用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
);

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flash动画综合设计并发布、嵌入到网页

【作业要求】 自己选定主题,创意制作Flash动画,并与网页进行集成 【实验环境】 l 所需硬件环境为微机; l 所需软件环境为VS code 【创意内容】 因为我比较爱国,所以我选定的主题都是关于国旗的【关键步骤】 1、选好想要做的内容,找到一些视频; 2、查找关于任如何在浏览器…

洛谷P11290 【MX-S6-T2】「KDOI-11」飞船

Problem本题开启Special Judge,无需考虑精度问题Solve 一开始想到这个用DP写,但是不知道怎么定义 去"提交记录"旁边的神秘按钮得知速度可以作为第二维,且类似于背包 那么我们就可以按照背包列出定义 前i个加油站,花费时间j...... 但是这里是求最小花费,所以我们…

Analogue Pocket 软硬件实验预告

如题,还在测试中,预计会在今年内发布。

.NET云原生应用实践(六):多租户初步

本章目标多租户简介 实现public租户下的用户数据隔离出于开发进度考虑,本章暂不会完全实现多租户的整套体系,而是会实现其中的一小部分:基于默认public租户的数据隔离,并在本章节中会讨论多租户的实现框架结构。在后续的系列文章章节中,我们会完成多租户的实现。多租户(M…

【MX-S7】梦熊 NOIP 2024 模拟赛 3 SMOI Round 2

hdk俩签到俩不可做是吧。Rank【MX-S7-T1】「SMOI-R2」Happy Card 签到题一号,以为撑死评个黄但没想到那么多人不会打扑克。 考虑炸弹也是三带一,出三带一肯定更优秀。 考虑将所有牌变为若干个三张和剩余的,那么三张先带单张,再将对子拆开带。那么现在就有以下几种情况:单张…

我勒湘军杯

今天以体验队参加了湘军杯,感觉和ctf差别挺大 使用sql注入、xss等方式对靶场漏洞进行挖掘,漏洞挖掘感觉需要把知识系统的利用起来, 虽然也是ctf的知识,但是感觉ctf的目标很明确,获取flag就结束,而且可以在网上搜索到类似的步骤解题

Springboot如何利用模板,快速生成word文档?

前言 大家好,我是小徐啊。我们在使用SpringBoot开发的时候,有时候会遇到需要生成word文档的情况。一般情况下,就是将一些数据填充到word文档里面。其实Java是有开源的第三方jar包的。今天,小徐就来介绍下如何在SpringBoot里面生成word文档。 如何设置 首先,我们需要在pom.…

HCIA-03 常用协议 ARP TCP UDP ICMP

主要介绍了常用协议和IP协议的基础知识, 包括TCP/UDP协议的工作原理、ARP地址解析协议的作用、ICMP协议用于网络控制和查询的信息传递等。 重点讲述了TCP协议的三次握手建立连接、数据传输与四次挥手断开连接的过程 以及IP协议在网络层实现跨广播域通信的基本原理。 此外,还提…

DDD之理解复杂度、尊重复杂度、掌控复杂度

本文书接上回《懂了这个道理,人月神话不再是神话!》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术交流;视频和直播在B站。关注公众号一定要星标,以及时获得最新推送。 背景 关于“复杂度”我在系列…

树的遍历顺序及其应用

树的遍历顺序及其应用 一、DFS 序 DFS 序就是以 DFS 的方式,记录每一个节点第一次被访问的顺序,这种顺序形成一个形成一个长度为 \(n\) 的序列。主要被用来维护子树信息。有以下特点:对于任意一个点来说,其子树里所有点的 DFS 序是连续的,具体来讲, \(x\) 的子树的所有结…

视野修炼-技术周刊第111期 | 读文件 API 性能对比

① Node.js 与 Bun 读取文件速度对比 ② 2024 HTML现状调研 ③ Viselect - 直观的 DOM 选择 ④ fraction.js - 精确的十进制运算库 ⑤ npmpackage.info - 在线查看 npm 包相关概览信息 ⑥ dive - 展示 docker 镜像里层的内容 ⑦ lcl.host - 一键本地生SSL证书 ⑧ 12 个现代CSS技…

[CPP]继承

继承友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员。 基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例。什么是继承 继承是面向对象编程(OOP)中的一个重要概念,它是一种创建新类(称为派…