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外连接与内连接查询的不同之处
Jun 03 MySQL
MySQL非空约束(not null)案例讲解
Aug 23 MySQL
MySQL基础快速入门知识总结(附思维导图)
Sep 25 MySQL
MySQL笔记 —SQL运算符
Jan 18 MySQL
一次Mysql update sql不当引起的生产故障记录
Apr 01 MySQL
MySQL中一条SQL查询语句是如何执行的
Apr 08 MySQL
排查MySQL生产环境索引没有效果
Apr 11 MySQL
讲解MySQL增删改操作
May 06 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
MySQL性能指标TPS+QPS+IOPS压测
Aug 05 MySQL
MySQL远程无法连接的一些常见原因总结
Sep 23 MySQL
MySQL中dd::columns表结构转table过程及应用详解
Sep 23 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
星际原理概述
2020/03/04 星际争霸
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
随时给自己贴的图片加文字的php代码
2007/03/08 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
js select option对象小结
2013/12/20 Javascript
iframe子页面与父页面在同域或不同域下的js通信
2014/05/07 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
基于iScroll实现内容滚动效果
2018/03/21 Javascript
在Vue中使用this.$store或者是$route一直报错的解决
2019/11/08 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
介绍Python的Django框架中的QuerySets
2015/04/20 Python
Python元组及文件核心对象类型详解
2018/02/11 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
2020/02/14 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
澳大利亚最大的百货公司:Myer
2018/12/21 全球购物
美国家用和厨房电器销售网站:Appliances Connection
2020/01/24 全球购物
英国钻石公司:British Diamond Company
2020/02/16 全球购物
《青山处处埋忠骨》教学反思
2014/04/22 职场文书
煤矿安全承诺书
2014/05/22 职场文书
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis