69 mysql 中 is null 的实现

news2025/1/17 4:10:22

前言

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.coloradmin.cn/o/2256444.html

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

相关文章

A1017 基于Java+JSP+SQL Server+servlet的二手购物平台的设计与实现

二手购物平台 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 摘 要 计算机以及网络技术的飞速发展&#xff0c;网络的应用在全国乃至全球日益普及&#xff0c;随着人们的思想水平和生活水平的提高&#xff0c;网络已经是人们必不可少的一部分。人们的…

力扣-图论-6【算法学习day.56】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

使用PHPUnit使用本地调试代替远程调试,快速提高开发效率

Laravel 是一个在 Linux 环境下表现非常出色的 PHP 框架&#xff0c;但它在 Windows 环境下可能会遇到一些兼容性和配置问题。为了调试或没试的方便可以在 Windows 环境下进行 Laravel PHPUnit进行本地调试和测试。 本地主要针对断点调试效果非常高效。 在 Laravel 中&#x…

动态规划 - 4( 背包问题 10000 字详解 )

一&#xff1a; 背包问题 1.1 01 背包 题目链接&#xff1a;01 背包 import java.util.Scanner;public class Main {public static void main(String[] args) {// 不做空间优化&#xff0c;用 dp 表存下所有状态Scanner sc new Scanner(System.in);// 读入 n 和 Vint n sc.…

关于利用 EtherNet/IP 转 Profinet 网关模块实现罗克韦尔变频器接入西门子 PLC 的配置范例

在现代工业自动化领域&#xff0c;不同品牌设备之间的通信兼容性问题一直是企业面临的挑战之一。某智能工厂为了优化生产流程&#xff0c;提高设备的协同工作效率&#xff0c;决定对其生产线上的控制系统进行升级改造。该生产线中&#xff0c;AB罗克韦尔PowerFlex变频器作为关键…

论文研读|信息科技风险管理模型的主要内容、定位、目标企业、风险管理机制, 以及相应的风险评估流程和风险应对策略

文献来源&#xff1a;[1]李政.商业银行数据中心风险管理研究[D].合肥工业大学[2024-12-08]. 内容总结&#xff1a;风险管理是一项不断发展完善的体系化工作。本章研究了国际上普遍使用的风险管理基本模型、并针对主流的信息科技风险管理的框架进行研究、分析&#xff0c;重点研…

MySQL-DML之数据表操作

文章目录 一. 插入表记录1. 向表中插入部分字段2. 向表中插入所有字段,字段的顺序为创建表时的顺序3. 一次添加多条数据信息 二. 更新表记录1. 更新所有记录的指定字段 更新符号条件记录的指定字段2. 更新符号条件记录的指定字段 三. 删除表记录1. 按条件删除记录2. 清空记录 四…

mac mini 4 上手指南

文章目录 和 mac 初见购机历程外设配置win 系统 适应 mac 系统一些使用体验mac 快捷键 和 mac 初见 最开始用 mac 是小时候用着刷成 windows 的 MacBook 和好朋友一起打游戏&#xff0c;再后来就是上大学&#xff0c;用朋友的 mac 做一些简单的办公 购机历程 我之前 11月2日…

Apache AGE:基于PostgreSQL的图数据库

Apache AGE&#xff08;A Graph Extension&#xff09;是一个基于 PostgreSQL 的图数据库。它以扩展插件的形式提供&#xff0c;可以在利用 PostgreSQL 先进的 SQL 查询功能和事务支持的同时&#xff0c;享受图数据库的灵活性和可扩展性。 Apache AGE 最初由 Bitnine Global In…

关于springBoot+vue项目中配置SSL证书问题

前端可以通过https进行访问 1.前端在访问后端接口时&#xff0c;使用https进行访问&#xff0c;在request.js配置文件中&#xff0c;这个文件是配置axios的基本请求的&#xff0c;在基础请求地址中改为https方式 2.需要在Linux中的nginx中配置ssl证书&#xff0c;具体请参考&…

华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数

华为交换机WEB操作 使用的是真机S5735&#xff0c;目前主流的版本都适用&#xff08;V1R5~V2R1的就不在列了&#xff0c;版本太老了&#xff0c;界面完全不一样&#xff0c;这里调试线接的console口&#xff0c;电脑的网络接在ETH口&#xff09; 「模拟器、工具合集」复制整段内…

二分查找(带图详解)

优选算法系列 文章目录 优选算法系列前言一、二分查找的思想二、算法使用小总结 三、代码实现四、二分查找拓展4.1、查找第一次出现的target小总结 4.2、target最后出现的位置小总结 五、代码总结 前言 在这篇博客中&#xff0c;我会给大家分享二分查找及其扩展。 这是链接-&…

【C#】NET 9中LINQ的新特性-CountBy

前言 在 .NET 中,使用 LINQ 对元素进行分组并计算它们的出现次数时,需要通过两个步步骤。首先,使用 GroupBy方法根据特定键对元素进行分类。然后,再计算每个组元素包含个数。而随着 .NET 9 版本发布,引入了一些新特性。其中 LINQ 引入了一种新的方法 CountBy,本文一起来了…

[SWPUCTF 2022 新生赛]funny_php

进入靶场环境 <?phpsession_start();highlight_file(__FILE__);if(isset($_GET[num])){if(strlen($_GET[num])<3&&$_GET[num]>999999999){echo ":D";$_SESSION[L1] 1;}else{echo ":C";}}if(isset($_GET[str])){$str preg_replace(/NS…

2024-10-13-B fd 重定向 缓冲区

1 一切皆文件 1.1 虚拟文件系统 在系统层面&#xff0c;做了一层软件的封装&#xff0c;struct file 里有操作表&#xff08;即函数指针的集合&#xff09;&#xff0c;可以调用底层的读写方法。虚拟文件系统&#xff08;VFS&#xff09;是一种神奇的抽象&#xff0c;它使得…

调整数组顺序使奇数位于偶数前面

题目 输入一个整数数组&#xff0c;调整数组中数字的顺序&#xff0c;使得所有奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。要求时间复杂度为O(n) 解法 双指针i和j 指针i起点是数组起点&#xff0c;当i检测到偶数时停下。j的起点时数组终点&#xff0c;…

如何使用 Docker Compose 安装 Memos 自托管笔记应用

简介 Memos是一个自托管的开源笔记应用程序&#xff0c;专为个人组织和信息管理而设计。它允许用户高效地创建、存储和管理笔记&#xff0c;提供如Markdown支持、用户友好的界面和注重隐私的设计等功能。Memos可以在各种平台上运行&#xff0c;但使用Docker Compose可以简化部…

详解:HTTP/HTTPS协议

HTTP协议 一.HTTP是什么 HTTP&#xff0c;全称超文本传输协议&#xff0c;是一种用于分布式、协作式、超媒体信息系统的应用层协议。HTTP往往是基于传输层TCP协议实现的&#xff0c;采用的一问一答的模式&#xff0c;即发一个请求&#xff0c;返回一个响应。 Q&#xff1a;什…

小程序项目的基本组成结构

分类介绍 项目根目录下的文件及文件夹 pages文件夹 用来存放所有小程序的页面&#xff0c;其中每个页面都由4个基本文件组成&#xff0c;它们分别是&#xff1a; .js文件&#xff1a;页面的脚本文件&#xff0c;用于存放页面的数据、事件处理函数等 .json文件&#xff1a;…

【uni-app 微信小程序】新版本发布提示用户进行更新

知识准备 uni.getUpdateManager文档介绍 不支持APP与H5&#xff0c;所以在使用的时候要做好平台类型的判断&#xff0c;如何判断&#xff0c;参考条件编译处理多端差异 代码参考 export const updateApp () > {const updateManager uni.getUpdateManager()updateManag…