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 ...
随机推荐
- 六、FreeRTOS学习笔记-任务挂起和恢复
任务的挂起与恢复的API函数介绍 API函数 描述 vTaskSuspend() 挂起任务 vTaskResume() 恢复被挂起的任务 xTaskResumeFromISR() 在中断中恢复被挂起的 ...
- 分布式事务之dtm
github: https://github.com/dtm-labs/dtm 本人使用场景, 目前微服务中存在的用户服务, 商品服务,订单服务, 支付服务, 在进行下单操作的时候,需要创建订单并扣减 ...
- 150页的剑指Offer解答PDF,它来了!!!
它来了!!! 终于整理出了第一版剑指Offer的PDF,主要以Java语言为主,一共67道题,100多页. 领取方式如下(无套路直接获取百度网盘的 链接,如果链接失效可以直接找我): [秦怀杂货店]公 ...
- Ubuntu桌面远程登陆配置
(1) 查看Ubuntu版本号 lsb_release -a (2) (a) 安装vim和Openssh-server sudo apt-get update sudo apt-get install ...
- 前端每日一知之你需要知道的JSON.stringify
脑图在线链接 本文内容依据[web开发]公众号精彩文章总结而来
- OS之《线程管理》
进程是系统资源分配的最小单位,线程是最小的执行单位. 然而,现在的高级设计底层还是基于这个理论基础实现的.比如java的线程,还有最新版本的JDK的协程都是在为了更好的让CPU执行任务. 线程是为了使 ...
- 设置QToolBar的Action图标之间的间隔
设置QToolBar的Action图标之间的间隔,网上搜索一大堆没用的,原来非常简单. toolBar->layout()->setContentsMargins(10, 10, 10, ...
- ng-alain: Title Service
文档地址:https://ng-alain.com/theme/title/zh 源码地址: https://github.com/ng-alain/delon/blob/master/package ...
- TeamViewer 的替代品 ZeroTier + NoMachine
之前不怎么用 TeamViewer,最近用的多了,特别好用,有点上瘾,在哪儿都能连家里的 RTX,太棒了. 然后它就开始作了. 有没有好的替代方案呢?有人推荐向日葵,向日葵显然是以盈利为目的的我不想再 ...
- Ubuntu 下安装oh-my-zsh
Ubuntu系统默认状况下的终端样式如下: Ubuntu default terminal's style 有个知名的神奇:Oh-My-Zsh 可以让终端及美观又实用: Oh-My-Zsh agnos ...