MySQL 对null 值的特殊处理

news2024/11/24 14:22:04

需求

        需要将不再有效范围内的所有数据都删除,所以用not in (有效list)去实现,但是发现库里,这一列为null的值并没有删除,突然想到是不是跟 a=null 不能生效一样,not in 对null不生效,也需要特殊处理。

解决

        增加对null额外处理,问题解决。

MySQL对NULL值定义

MySQL :: MySQL 8.0 Reference Manual :: 3.3.4.6 Working with NULL Values

MySQL :: MySQL 8.0 Reference Manual :: B.3.4.3 Problems with NULL Values

        可以看下MySQL文档,其中描述了对null值的定义是,从概念上讲,表示“缺少未知值”。如下图所示,NULL作为电话号码不为人知,空字符串'' 作为这个人没有电话、没有电话号码去理解, 但是这对于我们日常的开发、理解,包括对非字符类型的默认值,都需要一个默认值的规定。对于字段来说,能Default Not Null 的尽量设置,对于可能为空的值,存在NULL值无可厚非,只是在SQL语句中要注意对null的特殊处理。自信考证NULL值存在的合理性以及使用场景。

NULL值缺点

NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.

        Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要Mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MyISAM 中固定大小的索引变成可变大小的索引。

You can add an index on a column that can have NULL values if you are using the MyISAM, InnoDB, or MEMORY storage engine. Otherwise, you must declare an indexed column NOT NULL, and you cannot insert NULL into the column.

        你可以在包含NULL值的列上添加索引,如果您使用的是MyISAM、InnoDB或内存存储引擎。除此之外,必须声明索引列NOT NULL,并且不能将NULL插入该列。

         对于NULL的处理麻烦:

  • 不能使用算术比较运算符如=,<,>,<> ,会导致无法从此类比较中获得任何有意义的结果
  • 不能使用聚合函数(如 COUNT, SUM, AVG,MIN,MAX),会忽略NULL值的存在
  • 也不能使用not in ,in ,CONTAINS 等操作,会忽略NULL值的存在
  • 使用DISTINCT、GROUP BY或ORDER BY时,所有空值都被视为相等

 

        但是NULL值存在感觉是难以避免的,所以还是多在日常开发中注意NULL的处理吧[doge]。

Working with NULL Values 

        对于NULL,需要专门用 is null ; is not null ; isNull() ; ifNull() ;<=>(比较操作符,当比较的的两个值相等或者都为 NULL 时返回 true) 去判断,

        如果返回值中有NULL,还需要对返回值进一步处理的,可以使用COALESCE 函数 或者 IFNULL 函数对NULL值进行处理从而避免NPE。

SELECT product_name, COALESCE(stock_quantity, 0) AS actual_quantity
FROM products;

SELECT product_name, IFNULL(stock_quantity, 0) AS actual_quantity
FROM products;

        对于聚合函数 ,如COUNT,AVG等,统计NULL所在行是有意义的场景,要不就像Ali开发手册中那样,对存在NULL值的列,不能使用count(col)来代替count(*),要不就需要对NULL值做额外处理

 

SELECT AVG(COALESCE(salary, 0)) AS avg_salary FROM employees;

         对于排序,排序字段里面需要有一个确定不为NULL的值存在,否则针对NULL值的排序会错乱。

MySQL分页排序注意事项-CSDN博客

参考

MySQL NULL 值处理 | 菜鸟教程

孤尽训练营打卡日记day04--MySQL优化_定时生成数据,用于用户数据耗时操作_星月夜_Mr. Yu的博客-CSDN博客

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

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

相关文章

$sformat在仿真中打印文本名的使用

在仿真中&#xff0c;定义队列&#xff0c;使用任务进行函数传递&#xff0c;并传递文件名&#xff0c;传递队列&#xff0c;进行打印 $sformat(filename, “./data_log/%0d_%0d_%0d_0.txt”, f_num, lane_num,dt); 使用此函数可以自定义字符串&#xff0c;在仿真的时候进行文件…

Python基础(二、必备知识,不用背,用用就会了~)

一、基础知识 1.标识符 在Python中&#xff0c;标识符是用来标识变量、函数、类、模块或其他对象的名称。一个有效的标识符由字母、数字和下划线组成&#xff0c;且不能以数字开头。Python是区分大小写的&#xff0c;因此myVariable和myvariable被视为不同的标识符。 下面是…

Redis数据已经删除了,为什么内存占用还是很高?

Redis数据已经删除了&#xff0c;为什么内存占用还是很高&#xff1f; Redis做了数据删除操作&#xff0c;为什么使用top命令时&#xff0c;还是显示Redis占了很多内存&#xff1f; 没做相关功课的人觉得这个问题有问题&#xff0c;删了数据还说占着内存&#xff0c;面试官不…

QQ2023备份

需要修改的路径&#xff08;共3处&#xff09; 这三处路径中&#xff0c;只有一处是需要修改的 QQPC端-主菜单-设置-基本设置-文件管理 点击上面的“”自定义“”&#xff0c;然后修改路径即可 修改路径后提示 然后等一会才会关干净QQ的相关进程&#xff0c;关闭后才会有自动…

Windows的C盘爆掉了怎么办?

本文参考&#xff1a; C盘太满怎么办&#xff1f;亲测8种好用方法&#xff01; 如果C盘的分区爆掉了&#xff0c;变红色了&#xff0c;是时候该处理这个问题了&#xff0c;解决你的C盘焦虑&#xff01; 第一招&#xff1a;删除C盘文件 首先你会想到清理C盘里面的文件&#x…

Flink入门之核心概念(三)

任务槽 TaskSlots: 任务槽&#xff0c;是TaskManager提供的用于执行Task的资源&#xff08;CPU 内存&#xff09; TaskManager提供的TaskSlots的个数&#xff1a;主要由Taskmanager所在机器的CPU核心数来决定&#xff0c;不能超过CPU的最大核心数 1.可以在flink/conf/flink-c…

【C++】map/multimap/set/multiset的经典oj例题 [ 盘点&全面解析 ] (28)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.前K个高频单词【mutiset】二.左右符…

云服务器Centos中安装Docker

云服务器Centos中安装Docker 1 简介DockerCentosCentos和Ubuntu区别 2 安装3 测试hello-world的镜像测试 1 简介 Docker Docker是一个开源的应用容器引擎&#xff0c;利用操作系统本身已有的机制和特性&#xff0c;可以实现远超传统虚拟机的轻量级虚拟化。它支持将软件编译成…

虚拟机-桥接模式连接

文章目录 1.查看宿主机再用的IP信息2.桥接模式-虚拟机设置VMware设置虚拟机设置重启网络服务 1.查看宿主机再用的IP信息 ipconfig /all 注&#xff1a; 在虚拟机中要设置同网段的ip设置同一个子网掩码设置同一个网关设置同一个DNS服务器 2.桥接模式-虚拟机设置 VMware设置 虚…

整数在内存中的存储

整数和浮点数在内存中的存储方式是不一样的&#xff0c;今天&#xff0c;我们来具体学习一下 文章目录 整数在内存中的存储浮点数在内存中的存储 整数在内存中的存储 我们在之前就已经了解过了整数有原码&#xff0c;反码&#xff0c;补码的形式&#xff0c;这三种方式都是二进…

cache教程 2.单机并发缓存

0.对原教程的一些见解 个人认为原教程中两点知识的引入不够友好。 首先是只读数据结构 ByteView 的引入使用是有点迷茫的&#xff0c;可能不能很好理解为什么需要ByteView。 第二是主体结构 Group的引入也疑惑。其实要是熟悉groupcache&#xff0c;那对结构Group的使用是清晰…

LangChain学习二:提示-实战

文章目录 上一节内容&#xff1a;LangChain学习一&#xff1a;模型-实战学习目标&#xff1a;提示词及提示词模板的运用学习内容一&#xff1a;什么是提示词&#xff1f;学习内容二&#xff1a;提示词模板2.1 聊天提示模板实战:首先需要声明和定义一个模板实战:把提示词模板放入…

分类预测 | GASF-CNN格拉姆角场-卷积神经网络的数据分类预测

分类预测 | GASF-CNN格拉姆角场-卷积神经网络的数据分类预测 目录 分类预测 | GASF-CNN格拉姆角场-卷积神经网络的数据分类预测分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.GASF-CNN格拉姆角场-卷积神经网络的数据分类预测&#xff08;完整源码和数据) 2.自…

Leetcode2477. 到达首都的最少油耗

Every day a Leetcode 题目来源&#xff1a;2477. 到达首都的最少油耗 解法1&#xff1a;贪心 深度优先搜索 题目等价于给出了一棵以节点 0 为根结点的树&#xff0c;并且初始树上的每一个节点上都有一个人&#xff0c;现在所有人都需要通过「车子」向结点 0 移动。 对于…

os.walk()遍历文件夹/文件

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

智能优化算法应用:基于人工蜂鸟算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工蜂鸟算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工蜂鸟算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂鸟算法4.实验参数设定5.算法结果6.参考…

Qt槽函数不响应不执行的一种原因:ui提升导致重名

背景&#xff1a; 一个包含了组件提升的ui&#xff0c;有个按钮的槽函数就是不响应&#xff0c;于是找原因。 分析&#xff1a; 槽函数的对应一是通过connect函数绑定信号&#xff0c;二是on_XXX_signal的命名方式。界面上部件的槽函数通常是第二种。 我反复确认细节&#…

正则表达式:字符串处理的瑞士军刀

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

图的搜索(一):广度优先搜索算法和深度优先搜索算法

图的搜索&#xff08;一&#xff09;&#xff1a;广度优先搜索算法和深度优先搜索算法 本章主要记录了图的搜索算法&#xff0c;和可以解决图的基本问题——最短路径问题的算法。本章主要对图搜索的相关算法进行了介绍&#xff1a;广度优先搜索算法、深度优先搜索算法。 下一…

蓝牙物联网开发应用实例|「蓝牙道钉」规范共享单车停放

为进一步改善城市环境&#xff0c;解决共享单车乱停乱放、随意占道等顽疾&#xff0c;引导骑行者文明停放&#xff0c;近期&#xff0c;铜陵市试点启用共享单车“蓝牙道钉”技术。 共享单车“蓝牙道钉”是通过在人行便道的停放区域内安装“道钉”设备&#xff0c;凭借蓝牙高精…