mysql使用 not int 子查询隐含陷阱


Posted in MySQL onApril 12, 2022

1、现象

1.1、使用not int 子查询

SELECT
	* 
FROM
	`users` 
WHERE
	id NOT IN ( SELECT uid FROM role_user )

查询结果为:

mysql使用 not int 子查询隐含陷阱

1.2、结果对吗?

当然不对

1.2.1、查询一下role_user的uid结果

SELECT uid FROM role_user

查询结果为:

mysql使用 not int 子查询隐含陷阱

1.2.2、查询一下users表的数据

SELECT * FROM `users`

mysql使用 not int 子查询隐含陷阱

1.2.3、分析查询结果

role_user表的数据uid只有一个1和null,所以说应该能查询到users表的id=2的数据

实际执行的sql为:

SELECT
	* 
FROM
	`users` 
WHERE
	id NOT IN ( 1,null )

但是查询的结果依然为:

mysql使用 not int 子查询隐含陷阱

如果我把sql改一下:

SELECT
	* 
FROM
	`users` 
WHERE
	id NOT IN ( 1)

mysql使用 not int 子查询隐含陷阱

所以可以看到是由于not in 中的结果有null 导致无法查询出数据的

2、为什么会产生这样的结果?

2.1、null属于什么?

2.2、not in 的底层实现

SELECT
	* 
FROM
	`users` 
WHERE
	id NOT IN ( 1,null )

not in 多个值的实现原理为

SELECT
	* 
FROM
	`users` 
WHERE
	id != 1
	and id != null

第一反应是不是觉得是符合的啊?users表的id是主键,所以说都不为空值啊

但是为什么会这样?

我们来执行一个sql

select 1 !=null

mysql使用 not int 子查询隐含陷阱

可以看到查询结果为Null,所以说上面的sql里面的id!=null的结果也是null

由于Null无法参与boolean运算,默认为false,所以说上面的条件中and后面的id!=null永远是false

3、结论

说明not in中如果值有null,那么将查询不到数据

MySQL 相关文章推荐
MySQL基础(二)
Apr 05 MySQL
MySQL之DML语言
Apr 05 MySQL
浅析MySQL如何实现事务隔离
Jun 26 MySQL
mysql定时自动备份数据库的方法步骤
Jul 07 MySQL
MySQL子查询中order by不生效问题的解决方法
Aug 02 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 MySQL
浅谈redis的过期时间设置和过期删除机制
Mar 18 MySQL
mysql查询结果实现多列拼接查询
Apr 03 MySQL
进阶篇之linux环境下安装MySQL数据库
Apr 09 MySQL
MySQL库表太大怎么办? 数据库分库分表项目实践
Apr 11 MySQL
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 MySQL
MySQL 字符集 character
May 04 MySQL
MySQL数据库如何使用Shell进行连接
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 #MySQL
MySQL事务操作的四大特性以及并发事务问题
MySql重置root密码 --skip-grant-tables
MySQL库表太大怎么办? 数据库分库分表项目实践
排查MySQL生产环境索引没有效果
Apr 11 #MySQL
排查并解决MySQL生产库内存使用率高的报警
Apr 11 #MySQL
You might like
php中opendir函数用法实例
2014/11/15 PHP
javascript变量作用域使用中常见错误总结
2013/03/26 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
2014/01/14 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
vue实现文件上传功能
2018/08/13 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
elementUi vue el-radio 监听选中变化的实例代码
2019/06/28 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
python 从远程服务器下载东西的代码
2013/02/10 Python
Python中逗号的三种作用实例分析
2015/06/08 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
Python ORM编程基础示例
2020/02/02 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
web字体加载方案优化小结
2019/11/29 HTML / CSS
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
澳大利亚排名第一的露营和户外设备在线零售商:Outbax
2020/05/06 全球购物
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
安全宣传标语口号
2014/06/06 职场文书
运动会演讲稿300字
2014/08/25 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
2014年销售员工作总结
2014/12/01 职场文书
武当山导游词
2015/02/03 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
护理培训心得体会
2016/01/22 职场文书
2019年七夕情人节浪漫祝福语大全!
2019/08/08 职场文书
Go语言基础知识点介绍
2021/07/04 Golang
Python find()、rfind()方法及作用
2022/12/24 Python