尽量不要使用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 比较和用法的更多相关文章

  1. SQLServer中exists和except用法

    一.exists 1.1 说明 EXISTS(包括 NOT EXISTS)子句的返回值是一个BOOL值.EXISTS内部有一个子查询语句(SELECT ... FROM...),我将其称为EXIST的 ...

  2. SQL中EXISTS和IN用法

    SQL中EXISTS的用法  指定一个子查询,检测行的存在. 语法:EXISTS subquery 参数:subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INT ...

  3. oracle中的exists 和 in 用法详解

    以前一直不知道exists和in的用法与效率,这次的项目中需要用到,所以自己研究了一下.下面是我举两个例子说明两者之间的效率问题. 前言概述: “exists”和“in”的效率问题,涉及到效率问题也就 ...

  4. sql server if exists和 if not exists 的关键字用法

    if exists和if not exists关键字用法   1.介绍  if not exists 即如果不存在,if exists 即如果存在 2.使用  a.判断数据库不存在时  if not ...

  5. exists oracle 的用法

    CREATE TABLE `A` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGIN ...

  6. oracle中的exists和not exists和in用法详解

    in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询. not exists:做NL,对子查询先查,有个虚表,有确定值,所以就算子查询有NULL ...

  7. sql中exists和notexists用法总结(并和in的比较)

    首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOT EXISTS 子查询中 找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如 ...

  8. 通过识别页面内容获得返回值判断后续执行(exists指令的用法)

    本案例主要用到airtest 的exists指令 从指令解释可以知道,当判断某图片不存在的时候,会返回false值 脚本思路即为如果返回值==false则执行A,!=fales则执行B 下图脚本思路, ...

  9. mssql sqlserver if exists 用法大汇总

    摘要: 下文讲述sqlserver中,更新脚本中常用if exists关键字的用法说明,如下所示: 实验环境:sql server 2008 R2 一.检测数据库是否存在于当前数据库引擎下 if ex ...

  10. 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 ...

随机推荐

  1. 2023NOIP A层联测25 T2 游戏

    2023NOIP A层联测25 T2 游戏 优秀且新颖的期望题. 思路 分析问题,由于双方都是最优策略,所以可以说学生知道老师会选择那些教室设置概率(概率设置好就不能改变),老师也知道学生会怎样选择教 ...

  2. Webshell流量分析之哥斯拉Godzilla&冰蝎Behinder

    目录 哥斯拉 冰蝎 哥斯拉和冰蝎相较于菜刀蚁剑,它们的通信流量是加密的,有比较好的抗检测能力. 菜刀和蚁剑流量分析:Webshell流量分析之菜刀Chopper&蚁剑AntSword 哥斯拉 ...

  3. Spring MVC 3.2 技术预览(二):实时更新技术

    原文地址:http://blog.springsource.org/2012/05/08/spring-mvc-3-2-preview-techniques-for-real-time-updates ...

  4. 解决页面隐藏的元素闪现的问题v-cloak

    在v-if处加上v-cloak属性 <div class="sys-changeBox" v-cloak v-if="showTosat" @click. ...

  5. golang之常用第三方包汇总

    汇总golang日常开发中常用的库包 [web] gin:  github.com/gin-gonic/gin [MySQL] gorm: [Redis] go-redis:  github.com/ ...

  6. 性能检测工具之Lighthouse

    转载:https://mp.weixin.qq.com/s?src=11&timestamp=1618929340&ver=3020&signature=oXyx*RDLXjN ...

  7. VUE 改成history 模式 刷新404 的问题

    vue 路由的URL有两种模式,一种是 hash,一种是history ,history 模式更好看一些. 在使用hisory模式时,由于地址并不是真实存在,那么在刷新的情况下,这个会报404错误. ...

  8. NET任务调度框架Hangfire使用指南

    Hangfire 是一个开源的 .NET 任务调度框架,它允许开发人员轻松地将长时间运行的任务.定时任务和其他后台处理从主线程中分离出来,以提高应用程序的响应速度和性能 1. 安装 Hangfire ...

  9. LINUX通过STTY命令操作串口设备(LINUX串口操作命令)

    stty(settty,设置tty)命令用于检查和修改当前注册的终端的通信参数 1.显示某个串口参数信息:stty -F /dev/ttySTM6  -a          2.设置某个串口参数信息: ...

  10. 理解 ASP.NET Core:Cookie 认证

    理解 ASP.NET Core:Cookie 认证 ASP.NET Core 内置提供了基于 Cookie 的认证支持.在使用 Cookie 验证的时候,相关的三要素: 认证模式名称:CookieAu ...