69 mysql 中 is null 的实现

前言

Mysql 中我们偶尔会用到 字段为 NULL 的情况 

这时候 我们只能使用查询 “select * from tz_test_02 where field1 is null;” 来进行 field1 字段为 null 的行的查询 

然后如果是使用 “select * from tz_test_02 where field1 = null;” 你会发现查询 不出数据

但是如果是 mysql 的 NULL-safe equals 的运算符 “select * from tz_test_02 where field1 <=> null;” 又是可以查询出数据的, 我们这里 来调试一下 这个流程

 

测试数据表如下 

CREATE TABLE `tz_test_02` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`field1` varchar(128) DEFAULT NULL,`field2` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,KEY `field_1` (`field1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8

 

测试数据如下 

b68e6d7a8d46212926d53a59a98c975c.png

 

 

select * from tz_test_02 where field1 = null;

扫描索引的情况 

在 mysql 估算扫描的行的时候, 会解析整个表达式, 比如到我们这里的 ”field1 = null”

类型为 EQ_FUNC, field 是字段 tz_test_02.field1, value 是比较的值 NULL

然后 这里的 EQUAL_FUNC 值得就是 Null-safe 比较运算符 “<=>”

mysql 和 NULL 比较的规则是除了 Null-safe 之外的其他运算符, 和 NULL 比较都是 false, 这里备注也说了 ”comparison with null always false”

然后在外面 更新 const_table_map 为 1, 然后 外层扫表 found_const_table_map 为 0

15cbd0130a8c9ea332c5b337bdaae3e3.png

 

然后外层 make_join_plan 的时候, 扫描了0条记录, 设置 zero_result_cause 的时候设置了错误原因, “no matching row in const table”

110fdd2f8883cd8cb0a14d5e30e74160.png

 

最终 JOIN::exec 主流程中发现 前面设置了 zero_result_cause, 直接拦截 仅仅响应表格的元数据回去

a58c03ba6372863bc44abf3bc45e1d17.png

 

 

select * from tz_test_02 where field2 = null;

扫描非索引的情况, 是需要全表扫描 

扫描之后, 这里的 “where field2 = null” 的处理为 Agg_comparator 这边的处理, 比较的两个操作数, 一个是 field2 字段, 另外一个是 Item_null

然后 Item_null::val_str 这边返回的数据 恒为 0, 因此 这个比较 恒不成立, 永远返回 -1

d45ef81c7f062ff0efb042bc01fd4d05.png

 

Item_null::val_str 的处理如下, 返回值恒为 0

cec852cd6752f50080ba81e392cc7c65.png

 

 

select * from tz_test_02 where field1 is null;

这个是扫描索引 

索引数据记录分别为 [(null, 5), (field1, 1), (field10, 10)]

然后这里 扫描的是索引记录 (null, 5), 然后比较的另一个操作数也是 null, 这里比较 返回 0, 可以响应数据 

5b3a0916bb31b83d5e7ed27c89ff602b.png

 

然后接着是索引记录 (field1, 1), 这里比较的 另一个操作数是 null

这里 显然 “field1” <> null 的, 因此会返回 -1 或者 1, 数据匹配不上 

9a5b335f3dd14fbd4ad5482d7d052502.png

 

 

select * from tz_test_02 where field2 is null;

首先这里是需要 全表扫描的

这里的判断方式就是获取给定的 字段 是否为 null, 根据 null bit 获取 

97479338e4d25831bda162d8691740a7.png

 

 

select * from tz_test_02 where field1 <=> null;

这个是扫描索引 

索引数据记录分别为 [(null, 5), (field1, 1), (field10, 10)]

然后这里 扫描的是索引记录 (null, 5), 然后比较的另一个操作数也是 null, 这里比较 返回 0, 可以响应数据 

125731ccfeb957f307e5028b5ece6c5b.png

 

然后接着是索引记录 (field1, 1), 这里比较的 另一个操作数是 null

这里 显然 “field1” <> null 的, 因此会返回 -1 或者 1, 数据匹配不上 

df93e6a6d1148872d7b51d386e4fe145.png

 

 

select * from tz_test_02 where field2 <=> null;

首先这里是需要 全表扫描的

这里的判断方式就是获取给定的 字段 是否为 null, 根据 null bit 获取 

这个是 mysql 中 Null-safe 匹配的比较方式, 这里 左操作数是字段 field2, 右操作数是 Item_null, 返回的数字恒为 NULL
最终根据字段的值是否为 NULL 进行判断 

比如这里遍历的是第一条记录 (1, field1, ”1”), 可以看到 是不满足查询条件的

c29c3d6fce21fa367b94623d81d21f7e.png

 

这里是第二条记录 (5, NULL, ”5”) , 可以看到 是不满足查询条件的

5d07f172cceefca0b2075b21734c7bb9.png

 

这里是第三条记录 (10, “field10”, NULL) , 可以看到 是满足查询条件的

e6f62215feeb10c93341e1a30c5f3292.png

 

因此 最终查询结果如下

4071c7a461693e540ac4db9b256e06fe.png

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/36324.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

51c嵌入式~单片机合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12581900 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序&#xff0c;此时需要接触到IAP编程。 IAP即为In Application Programming&#xff0c;解释为在应用中编程&#xff0c;用户自己的程…

网上图书购物管理系统|Java|SSM|VUE| 前后端分离

【一】可以提供远程部署安装&#xff0c;包扩环境 【二】提供软件相关的安装包 【三】如果需要提供java入门资料可咨询 【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、M…

Python酷库之旅-第三方库Pandas(264)

目录 一、用法精讲 1251、pandas.tseries.offsets.WeekOfMonth.is_year_end方法 1251-1、语法 1251-2、参数 1251-3、功能 1251-4、返回值 1251-5、说明 1251-6、用法 1251-6-1、数据准备 1251-6-2、代码示例 1251-6-3、结果输出 1252、pandas.tseries.offsets.Las…

“为您的家电穿上防震铠甲:优质电器缓冲器

在地震频发地区或日常生活中&#xff0c;确保家电的安全和稳定至关重要。为了防止地震、意外碰撞或其他外力对家电造成损害&#xff0c;采用优质的电器缓冲器就像是为家电穿上了一层坚固的“防震铠甲”。这不仅能够有效减少因震动导致的损坏风险&#xff0c;还能显著延长家电的…

全连接层与链式求导法则在神经网络中的应用

目录 ​编辑 引言 全连接层的工作原理 前向传播 反向传播 链式求导法则及其在神经网络中的应用 链式求导法则 应用于全连接层 计算梯度 结论 引言 在深度学习领域&#xff0c;全连接层&#xff08;Fully Connected Layer&#xff0c;FC&#xff09;和链式求导法则是…

基于框架的逻辑回归:原理、实现与应用

目录 ​编辑 逻辑回归原理 损失函数与优化 正则化 基于框架的实现 1. 数据预处理 2. 模型初始化与训练 3. 模型评估与调优 4. 特征缩放 逻辑回归的应用 信用评分 医疗诊断 垃圾邮件识别 推荐系统 结论 在机器学习领域&#xff0c;逻辑回归是一种基础且强大的分类…

【SpringBoot】Day11-10 yml文件配置

三种配置文件 前面我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置&#xff0c;那其实呢&#xff0c;在springboot项目当中是支持多种配置方式的&#xff0c;除了支持properties配置文件以外&#xff0c;还支持另外一种类型的配置文件&#x…

强化学习新突破:情节记忆与奖励机制引领多智能体协作

简介 本推文介绍了韩国科学技术院发表在人工智能顶会ICLR 2024上的论文《Efficient Episodic Memory Utilization of Cooperative Multi-Agent Reinforcement Learning》。该论文提出创新性高效情节记忆利用&#xff08;Efficient Episodic Memory Utilization&#xff0c;EMU…

【python自动化四】日志打印

我们在进行自动化测试时&#xff0c;需要打印过程日志和结果日志等&#xff0c;这里记录下日志的相关配置。这里我们直接自己新建一个logger。 先贴上日志代码如下&#xff0c;可根据需要修改&#xff1a; import logging import os import timefrom logging.handlers import …

【精选】AI Coding 新范式:Windsurf、Cursor、Coze齐上阵

2AGI.NET | 探索 AI 无限潜力&#xff0c;2AGI 为您带来最前沿资讯。 随着人工智能技术的飞速发展&#xff0c;AI Coding领域迎来了前所未有的变革。Codeium的Windsurf、Cursor的agent模式更新、Copilot的新版本以及Coze的AI应用能力&#xff0c;都在推动着编程领域的创新。本期…

Free-RTOS实现LED闪烁

开发板&#xff1a;正点原子探索者 F407 LED定时定时闪烁 本次实验验证&#xff1a; 配置文件 1、打开CubeMX 2、选择芯片型号&#xff0c;然后点击开始项目 3、配置时钟 配置烧录引脚&#xff0c;与FreeRTOS系统时钟 选择FreeRTOS 这里已经默认有一个任务&#xff…

java+ssm+mysql水产品商城

项目介绍&#xff1a; 使用javassmmysql开发的水产品商城&#xff0c;系统包含管理员、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;用户管理&#xff1b;种类管理&#xff1b;商品管理&#xff1b;订单管理&#xff1b;评论管理&#xff1b;新闻管理&#…

SYN6288语音合成模块使用说明(MicroPython、STM32、Arduino)

模块介绍 SYN6288中文语音合成模块是北京宇音天下科技有限公司推出的语音合成模块。该模块通过串口接收主控传来的语音编码后&#xff0c;可自动进行自然流畅的中文语音播报。 注&#xff1a;SYN6288模块无法播报英文单词和句子&#xff0c;只能按字母播报英文 &#xff1b;而…

Windows设备go环境安装配置

一、下载go安装包 官网链接&#xff1a;All releases - The Go Programming Language (google.cn) 安装过程比较简单&#xff0c;这里不再赘述&#xff0c;可参考这位博主的文章。本文重点在环境配置。golang环境详细安装、配置_golang安装-CSDN博客 二、环境变量配置 1.添…

vulnhub靶场【hacksudo】之aliens

前言 靶机&#xff1a;hacksudo-aliens 攻击&#xff1a;kali 都是采用虚拟机的形式&#xff0c;网卡桥接模式 主机发现 使用arp-scan -l或者netdiscover -r 192.168.1.1/24进行探索 信息收集 使用nmap扫描 两个http服务&#xff0c;一个ssh服务 网站信息 访问查看 访…

(数据结构与算法)递归 递归是什么 递归的案例和场景 递归进阶

递归的定义和应用条件 递归就是程序调用自身的编程技巧&#xff1b; 把大型复杂的问题转化为一个与原问题相似规模较小的问题来进行求解&#xff1b; 递归每次调用传入的是不同的变量 递归不是算法&#xff0c;是调用自己的过程 调用的那个是一个小问题&#xff0c;自己是一个…

鼠标右键单击Git Bash here不可用

最近在学习git时突然发现右键的git bash没反应&#xff0c;但是去点击应用图标就能正常运行&#xff0c;通常是因为你在安装git之后改变了它的目录名称或者位置&#xff0c;我就是因为安装后改变了一个文件夹的文件名导致不可用 在安装git时系统会默认给鼠标右键选项的git Bas…

【0x0002】HCI_Inquiry_Cancel命令详解

目录 一、命令概述 二、命令格式及参数说明 三、返回事件及参数说明 3.1. HCI_Command_Complete事件 3.2. Status 3.3. 示例 四、命令执行过程 4.1. 前提条件检查 4.2. 命令构建与发送 4.3. 控制器处理 4.4. 返回状态参数 4.5. 主机接收反馈与处理 4.6. 执行流程结…

OpenAI 12Days 第二天 强化微调(RFT):推动语言模型在科学研究中的应用

OpenAI 12Days 第二天 强化微调&#xff08;RFT&#xff09;&#xff1a;推动语言模型在科学研究中的应用 文章目录 OpenAI 12Days 第二天 强化微调&#xff08;RFT&#xff09;&#xff1a;推动语言模型在科学研究中的应用RFT的工作原理与应用领域案例研究&#xff1a;基因突变…

公共云提供商正在错失人工智能机遇

他们目前的成功和增长得益于人工智能的应用&#xff0c;但从长远来看&#xff0c;不可持续的成本和可行的替代方案可能会让企业望而却步。 生成式人工智能正在蓬勃发展&#xff0c;并且将继续蓬勃发展。因此&#xff0c;本地和公共云提供商都看到了对其人工智能产品的需求激增…