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之DML语言
Apr 05 MySQL
浅谈Mysql多表连接查询的执行细节
Apr 24 MySQL
MySQL 角色(role)功能介绍
Apr 24 MySQL
MySQL索引知识的一些小妙招总结
May 10 MySQL
mysql升级到5.7时,wordpress导数据报错1067的问题
May 27 MySQL
MySQL query_cache_type 参数与使用详解
Jul 01 MySQL
MySQL系列之七 MySQL存储引擎
Jul 02 MySQL
MySQL数据库10秒内插入百万条数据的实现
Nov 01 MySQL
MySQL创建管理RANGE分区
Apr 13 MySQL
MySQL创建管理子分区
Apr 13 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 MySQL
MySQL下载安装配置详细教程 附下载资源
Sep 23 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学习之PHP表达式
2006/10/09 PHP
深入php多态的实现详解
2013/06/09 PHP
PHP中的日期加减方法示例
2014/08/21 PHP
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
JavaScript的Cookies
2008/01/16 Javascript
Iframe 自适应高度并实时监控高度变化的js代码
2009/10/30 Javascript
jquery键盘事件介绍
2011/01/31 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
2017/02/20 Javascript
layui表格实现代码
2017/05/20 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
vue.js语法及常用指令
2017/10/29 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
解决vue项目打包后提示图片文件路径错误的问题
2018/07/04 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
在Python中使用Mako模版库的简单教程
2015/04/08 Python
python实现屏保计时器的示例代码
2018/08/08 Python
Python 给屏幕打印信息加上颜色的实现方法
2019/04/24 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
Java语言程序设计测试题选择题部分
2014/04/03 面试题
关于Java finally的面试题
2016/04/27 面试题
分公司总经理岗位职责
2014/08/03 职场文书
入党积极分子学习党的纲领思想汇报
2014/09/13 职场文书
前台岗位职责范本
2015/04/16 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
关于军训的感想
2015/08/07 职场文书