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 相关文章推荐
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
May 29 MySQL
MySQL中in和exists区别详解
Jun 03 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
MySQL系列之一 MariaDB-server安装
Jul 02 MySQL
MySQL 主从复制数据不一致的解决方法
Mar 18 MySQL
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
Mar 22 MySQL
MySQL数据库查询进阶之多表查询详解
Apr 08 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
以MySQL5.7为例了解一下执行计划
Apr 13 MySQL
在MySQL中你成功的避开了所有索引
Apr 20 MySQL
mysql拆分字符串作为查询条件的示例代码
Jul 07 MySQL
MySQL表字段数量限制及行大小限制详情
Jul 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
php基础知识:函数基础知识
2006/12/13 PHP
php入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
PHP中ob_start函数的使用说明
2013/11/11 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
详解phpstorm2020最新破解方法
2020/09/17 PHP
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
一种新的javascript对象创建方式Object.create()
2015/12/28 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
Node+Express+MongoDB实现登录注册功能实例
2017/04/23 Javascript
vue 文件目录结构详解
2017/11/24 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
vue 取出v-for循环中的index值实例
2019/11/09 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
举例区分Python中的浅复制与深复制
2015/07/02 Python
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
利用Python实现Excel的文件间的数据匹配功能
2020/06/16 Python
如何保障Web服务器安全
2014/05/05 面试题
超市创业计划书
2014/04/24 职场文书
小学生优秀评语
2014/12/29 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
一小时学会TensorFlow2之基本操作2实例代码
2021/09/04 Python
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python