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 Show Profile
Apr 05 MySQL
MySQL sql_mode修改不生效的原因及解决
May 07 MySQL
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
Jun 26 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
Mar 03 MySQL
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
Mar 22 MySQL
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
Mar 23 MySQL
MySQL学习必备条件查询数据
Mar 25 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
深入理解mysql事务隔离级别和存储引擎
Apr 12 MySQL
mysql性能优化以及配置连接参数设置
May 06 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实现Ftp用户的在线管理的代码
2007/03/06 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
2013/11/27 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
2016/03/02 PHP
详解php curl带有csrf-token验证模拟提交方法
2018/04/18 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
拖动布局之保存布局页面cookies篇
2010/10/29 Javascript
jquery zTree异步加载简单实例分享
2013/02/05 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
使用Bootstrap打造特色进度条效果
2017/05/02 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
vue实现一个炫酷的日历组件
2018/10/08 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
浅析Python中的序列化存储的方法
2015/04/28 Python
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
python 判断文件还是文件夹的简单实例
2019/06/10 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
python Shapely使用指南详解
2020/02/18 Python
Python单元测试及unittest框架用法实例解析
2020/07/09 Python
Python基于template实现字符串替换
2020/11/27 Python
美国在线珠宝商店:SZUL
2017/02/11 全球购物
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
电大自我鉴定范文
2013/10/01 职场文书
银行职业规划书范文
2013/12/28 职场文书
商场促销活动方案
2014/02/08 职场文书
公司踏青活动方案
2014/08/16 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript