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启动导致的事故实战记录
Sep 15 MySQL
SpringBoot连接MySQL获取数据写后端接口的操作方法
Nov 02 MySQL
关于mysql中时间日期类型和字符串类型的选择
Nov 27 MySQL
Mysql存储过程、触发器、事件调度器使用入门指南
Jan 22 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
Mar 03 MySQL
MySQL数据库如何给表设置约束详解
Mar 13 MySQL
简单聊一聊SQL注入及防止SQL注入
Mar 23 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 MySQL
MySQL数据库 安全管理
May 06 MySQL
关于mysql中string和number的转换问题
Jun 14 MySQL
mysql sql常用语句大全
Jun 21 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 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
js下函数般调用正则的方法附代码
2008/06/22 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
php cli模式下获取参数的方法
2017/05/05 PHP
JSON 教程 json入门学习笔记
2020/09/22 Javascript
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
jquery图片轮播特效代码分享
2020/04/20 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
JS 音频可视化插件Wavesurfer.js的使用教程
2018/10/31 Javascript
Vue基础配置讲解
2019/11/29 Javascript
Python生成不重复随机值的方法
2015/05/11 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
pandas带有重复索引操作方法
2018/06/08 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
英国运动风奢侈品购物网站:Maison De Fashion
2020/08/28 全球购物
《世界多美呀》教学反思
2014/03/02 职场文书
《吃水不忘挖井人》教学反思
2014/04/15 职场文书
会计岗位说明书
2014/07/29 职场文书
竞选班干部演讲稿400字
2014/08/20 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
收费员岗位职责
2015/02/14 职场文书
php中pcntl_fork详解
2021/04/01 PHP
Python基础之元编程知识总结
2021/05/23 Python