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命令行操作时的编码问题详解
Apr 14 MySQL
JDBC连接的六步实例代码(与mysql连接)
May 12 MySQL
Mysql数据库命令大全
May 26 MySQL
MySQL通过binlog恢复数据
May 27 MySQL
mysql如何配置白名单访问
Jun 30 MySQL
记一次Mysql不走日期字段索引的原因小结
Oct 24 MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 MySQL
MySQL 自动填充 create_time 和 update_time
May 20 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
May 25 MySQL
mysql数据库实现设置字段长度
Jun 10 MySQL
MySQL主从切换的超详细步骤
Jun 28 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环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
PHP cURL初始化和执行方法入门级代码
2015/05/28 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
javascript 获取模态窗口的滚动位置代码
2013/08/06 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
JavaScript中this详解
2015/09/01 Javascript
vue上传图片组件编写代码
2017/07/26 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
vue-cli2.9.3 详细教程
2018/04/23 Javascript
实例详解Node.js 函数
2018/06/10 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
python实现在windows下操作word的方法
2015/04/28 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
python模块内置属性概念及实例
2021/02/18 Python
面向对象编程OOP的优点
2013/01/22 面试题
初一科学教学反思
2014/01/27 职场文书
学校募捐倡议书
2014/05/14 职场文书
应届毕业生自荐书
2014/06/18 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
2014年物资管理工作总结
2014/12/02 职场文书
办公室岗位职责
2015/02/04 职场文书
结婚通知短信大全
2015/04/17 职场文书
首都博物馆观后感
2015/06/05 职场文书
小学见习报告
2015/06/23 职场文书
Python 中的Sympy详细使用
2021/08/07 Python