当前位置: 首页 > news >正文

【MySQL】not in遇上null的坑

今天遇到一个问题:

1、当 in 内的字段包含 null 的时候,正常过滤;

2、当 not in 内的字段包含 null 的时候,不能正常过滤,即使满足条件,最终结果也为 空。

测试如下:

select * from emp e;

在这里插入图片描述
当 in 内的字段包含 null 的时候,结果正常:

select * from emp e where e.mgr in (select comm from emp t);

在这里插入图片描述
当 not in 内的字段包含 null 的时候,结果为空,实际应为下面加上 is not null 条件时的结果才算正常:

select * from emp e where e.mgr not in (select comm from emp t);

在这里插入图片描述
加上 is not null 条件时,结果正常(由于NULL不等于NULL,也去除了 MGR 为 NULL 的那条记录,所以是12条):

select * from emp e where e.mgr not in (select comm from emp t where t.comm is not null);

在这里插入图片描述

根据以上测试,得出用 not in 条件过滤时应首先排除 is not null 的记录,否则可能会出现意想不到的结果。

其实,当not in中包含null

select * from t where class not in ('1','2',null)

上面的sql相当于:

select * from t where class !='1'and !='2'and !=null

在SQL中,NULL值与任何其它值的比较(即使是NULL)永远不会为“真”。not in 相当于and条件,只要有一个false,那么所有的都为false,所以查出来的数据固定为空

解决方案:not in中的数据过滤掉空值使用not exists


exists用法

select * from 表A where id in (select id from 表B)-- 上面的sql可以改写为:
select * from 表A where exists(select 1 from 表B where 表B.id=表A.id)

in以子查询表B的结果集为驱动,在表A中依次遍历查询id是否在子查询的结果集中存在

exists以外表表A为驱动表,若括号内的子查询有任意数据返回,表示当前行匹配成功

exists用于检查子查询是否至少会返回一行数据,强调的是是否返回结果集,不要求知道返回什么

相关文章:

  • Rust入门:C++和Rust动态库(dll)的相互调用
  • mysql数据库(下)
  • Python 装饰器decorator 圣经
  • html css 导航栏 2
  • 如何基于 esp-at 固件测试 TCP (UART 转 WiFi 透传)吞吐?
  • C语言 —— 图形打印
  • Centos8 使用编译安装nginx
  • 内网渗透-跨域环境渗透-1
  • GPT实战系列-构建多参数的自定义LangChain工具
  • vue3-admin后台管理系统: 使用Vue3+Vue-Router4 + Element-Plus打造高效后台管理系统
  • Java学习笔记15——类型转换(基本数据类型)
  • 手把手教您如何在国内免费使用GPT4接口的Bing,亲测有效!
  • 收下这份实操案例,还怕不会用Jmeter接口测试工具
  • 深入理解位运算符及其在JavaScript中的应用
  • html5cssjs代码 004 2035年倒计时
  • Google 是如何开发 Web 框架的
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [译]如何构建服务器端web组件,为何要构建?
  • 03Go 类型总结
  • Django 博客开发教程 16 - 统计文章阅读量
  • Js基础——数据类型之Null和Undefined
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • python docx文档转html页面
  • Theano - 导数
  • 阿里研究院入选中国企业智库系统影响力榜
  • 阿里云前端周刊 - 第 26 期
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 对JS继承的一点思考
  • 浮动相关
  • 技术:超级实用的电脑小技巧
  • 码农张的Bug人生 - 见面之礼
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何优雅地使用 Sublime Text
  • 删除表内多余的重复数据
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 系统认识JavaScript正则表达式
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 进程与线程(三)——进程/线程间通信
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #define
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (2015)JS ES6 必知的十个 特性
  • (pytorch进阶之路)扩散概率模型
  • (超详细)语音信号处理之特征提取
  • (二)斐波那契Fabonacci函数
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (转)http-server应用
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • ***测试-HTTP方法