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 隔离数据列和前缀索引的使用总结
May 14 MySQL
mysql数据库入门第一步之创建表
May 14 MySQL
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
Jun 21 MySQL
浅析MySQL如何实现事务隔离
Jun 26 MySQL
MySQL系列之八 MySQL服务器变量
Jul 02 MySQL
Mysql实现简易版搜索引擎的示例代码
Aug 30 MySQL
MySQL分库分表详情
Sep 25 MySQL
Mysql排序的特性详情
Nov 01 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
Mysql中mvcc各场景理解应用
Aug 05 MySQL
MySQL自定义函数及触发器
Aug 05 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
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
JS在IE下缺少标识符的错误
2014/07/23 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
jquery实现上传文件大小类型的验证例子(推荐)
2016/06/25 Javascript
判断输入的字符串是否是日期格式的简单方法
2016/07/11 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
微信小程序实现bindtap等事件传参
2019/04/08 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
python与php实现分割文件代码
2017/03/06 Python
python中关于for循环的碎碎念
2017/06/30 Python
Python语言描述最大连续子序列和
2017/12/05 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
python中的字符串内部换行方法
2018/07/19 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
如何用SQL语句进行模糊查找
2015/09/25 面试题
大学生军训自我评价分享
2013/11/09 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL