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 视图(View)原理解析
May 19 MySQL
MySQL5.7并行复制原理及实现
Jun 03 MySQL
浅析MySQL如何实现事务隔离
Jun 26 MySQL
深入解析MySQL索引数据结构
Oct 16 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
MySQL基于索引的压力测试的实现
Nov 07 MySQL
SQL基础的查询语句
Nov 11 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
一条慢SQL语句引发的改造之路
Mar 16 MySQL
Windows 64位 安装 mysql 8.0.28 图文教程
Apr 19 MySQL
mysql序号rownum行号实现方式
Dec 24 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 gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
比较完整的微信开发php代码
2016/08/02 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
JS 常用校验函数
2009/03/26 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
python批量导出导入MySQL用户的方法
2013/11/15 Python
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
python通过socket查询whois的方法
2015/07/18 Python
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
Python os.access()用法实例
2019/02/18 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
python3中rank函数的用法
2019/11/27 Python
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
置业顾问岗位职责
2014/03/02 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
中学教师师德承诺书
2014/05/23 职场文书
文明生主要事迹
2014/05/25 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
演讲比赛通讯稿
2015/07/18 职场文书
奠基仪式致辞
2015/07/30 职场文书
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python