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 13 MySQL
MySQL CHAR和VARCHAR该如何选择
May 31 MySQL
MySQL千万级数据表的优化实战记录
Aug 04 MySQL
mysql sum(if())和count(if())的用法说明
Jan 18 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
MySQL读取JSON转换的方式
Mar 18 MySQL
MySQL中IO问题的深入分析与优化
Apr 02 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
Mysql调整优化之四种分区方式以及组合分区
Apr 13 MySQL
MySQL 数据库范式化设计理论
Apr 22 MySQL
MySQL数据库表约束讲解
Jun 21 MySQL
详解MySQL的内连接和外连接
May 08 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
详解:――如何将图片储存在数据库里
2006/12/05 PHP
php代码把全角数字转为半角数字
2007/12/10 PHP
php实现按文件名搜索文件的远程文件查找器
2014/05/10 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
Netbeans 8.2将支持PHP7 更精彩
2016/06/13 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
jQuery中index()的用法分析
2014/09/05 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
js两种拼接字符串的简单方法(必看)
2016/09/02 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
微信小程序页面开发注意事项整理
2017/05/18 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
[06:35]2014DOTA2国际邀请赛 老男孩梦圆西雅图中国军团世界最强
2014/07/22 DOTA
详解Python2.x中对Unicode编码的使用
2015/04/03 Python
python 剪切移动文件的实现代码
2018/08/02 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
Python使用指定字符长度切分数据示例
2019/12/05 Python
python中的错误如何查看
2020/07/08 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
Argos官网:英国家喻户晓的百货零售连锁商
2017/04/03 全球购物
经贸日语毕业生自荐信
2013/11/03 职场文书
中学自我评价
2014/01/31 职场文书
导游欢迎词范文
2015/01/23 职场文书
财务人员个人工作总结
2015/02/27 职场文书
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers