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 相关文章推荐
52条SQL语句教你性能优化
May 25 MySQL
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
May 29 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
浅析MySQL如何实现事务隔离
Jun 26 MySQL
mysql优化之query_cache_limit参数说明
Jul 01 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 MySQL
MySQL RC事务隔离的实现
Mar 31 MySQL
MySQL中order by的执行过程
Jun 05 MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 MySQL
MySQL常用慢查询分析工具详解
Aug 14 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编程效率的53个要点(经验小结)
2010/09/04 PHP
PHP函数学习之PHP函数点评
2012/07/05 PHP
php实现Mysql简易操作类
2015/10/11 PHP
广告显示判断
2006/08/31 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
JS拖拽插件实现步骤
2015/08/03 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
2016/09/17 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
2017/10/26 Javascript
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
python搜索指定目录的方法
2015/04/29 Python
Python实现的多线程http压力测试代码
2017/02/08 Python
python实现自动解数独小程序
2019/01/21 Python
python七夕浪漫表白源码
2019/04/05 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
Python中itertools的用法详解
2020/02/07 Python
python的help函数如何使用
2020/06/11 Python
Python如何对齐字符串
2020/07/30 Python
python将数据插入数据库的代码分享
2020/08/16 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
英语专业学生个人求职信范文
2014/01/06 职场文书
如何写求职信
2014/05/24 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
跳高加油稿
2015/07/21 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python