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 相关文章推荐
jdbc使用PreparedStatement批量插入数据的方法
Apr 27 MySQL
MySQL 重写查询语句的三种策略
May 10 MySQL
MySQL 逻辑备份与恢复测试的相关总结
May 14 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
MySQL完整性约束的定义与实例教程
May 30 MySQL
mysq启动失败问题及场景分析
Jul 15 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
详解MySql中InnoDB存储引擎中的各种锁
Feb 12 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
Feb 15 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 MySQL
mysql拆分字符串作为查询条件的示例代码
Jul 07 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
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
PHP查看当前变量类型的方法
2015/07/31 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
php微信开发之图片回复功能
2018/06/14 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
统计jQuery中各字符串出现次数的工具
2012/05/03 Javascript
jQuery ui插件的使用方法代码实例
2013/05/08 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
vue下跨域设置的相关介绍
2017/08/26 Javascript
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
vue如何截取字符串
2019/05/06 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
python处理按钮消息的实例详解
2017/07/11 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
Django分页功能的实现代码详解
2019/07/29 Python
Django admin model 汉化显示文字的实现方法
2019/08/12 Python
详细分析Python垃圾回收机制
2020/07/01 Python
python pandas dataframe 去重函数的具体使用
2020/07/20 Python
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
素食餐饮项目创业计划书
2014/02/02 职场文书
《长江之歌》教学反思
2014/04/17 职场文书
幼师求职自荐信
2014/05/31 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
房屋租赁协议书
2014/10/18 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
浅析MongoDB之安全认证
2021/06/26 MongoDB
为Centos安装指定版本的Docker
2022/04/01 Servers