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 Innodb关键特性之插入缓冲(insert buffer)
Apr 08 MySQL
MySQL InnoDB ReplicaSet(副本集)简单介绍
Apr 24 MySQL
MySql 缓存查询原理与缓存监控和索引监控介绍
Jul 02 MySQL
通过shell脚本对mysql的增删改查及my.cnf的配置
Jul 07 MySQL
MySQL8.0的WITH查询详情
Aug 30 MySQL
MySQL 如何限制一张表的记录数
Sep 14 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
Mysql 8.x 创建用户以及授予权限的操作记录
Apr 18 MySQL
详解Mysq MVCC多版本的并发控制
Apr 29 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
PHP 动态随机生成验证码类代码
2010/04/09 PHP
discuz程序的PHP加密函数原理分析
2011/08/05 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
Laravel 对某一列进行筛选然后求和sum()的例子
2019/10/10 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
jquery提升性能最佳实践小结
2010/12/06 Javascript
NodeJS学习笔记之MongoDB模块
2015/01/13 NodeJs
jQuery层级选择器用法分析
2015/02/10 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
jquery实现的淡入淡出下拉菜单效果
2015/08/25 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
页面间固定参数,通过cookie传值的实现方法
2017/05/31 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
Python循环语句之break与continue的用法
2015/10/14 Python
tensorflow识别自己手写数字
2018/03/14 Python
Python实现FM算法解析
2019/06/18 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
python如何从文件读取数据及解析
2019/09/19 Python
让你的Python代码实现类型提示功能
2019/11/19 Python
一套Java笔试题
2016/08/20 面试题
实习评语大全
2014/04/26 职场文书
网络技术专业求职信
2014/07/13 职场文书
医院反腐倡廉演讲稿
2014/09/16 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
民事诉讼代理授权委托书
2014/10/11 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL
mysql中关键词exists的用法实例详解
2022/06/10 MySQL