MySQL 字段为 NULL 的坑,你踩过吗?

news/2025/2/2 11:08:54/

前言

很多小知识点,我以为自己懂了,实际没搞透。
数据库字段允许空值(null)的问题,你遇到过吗?
在验证问题之前,我们先建一张测试表及测试数据。
在这里插入图片描述
构建的测试数据,如下图所示:
在这里插入图片描述
有了上面的表及数据之后,我们就来看当列中存在 NULL 值时,究竟会导致哪些问题?

1.count 数据丢失

我们都知道,count是用来计数的,当表中某个字段存在NULL 值时,就会造成count计算出来的数据丢失,如下 SQL 所示:
在这里插入图片描述

查询执行结果如下:
在这里插入图片描述
从上述结果可以看出,count()和count(name)的值不一样,即当使用的是 count(name) 查询时,就丢失了两条值为 NULL 的数据。
解决方案
如果某列存在 NULL 值时,就是用 count(
) 进行数据统计。
扩展知识:不要使用 count(常量)
说明:count(*) 会统计值为 NULL 的行,而 count(列名) 不会统计此列为 NULL 值的行。

2.distinct 数据丢失

当使用语句count(distinct column1,column2)时,如果有一个字段值为空,即使另一列有不同的值,那么查询的结果也会将数据丢失, SQL如下所示:
在这里插入图片描述

查询执行结果如下:
在这里插入图片描述
数据库的原始数据如下:
在这里插入图片描述
从上述图所示,mobile列的10条数据都是不一样,但是查询的结果却只有8条。

3.select 数据丢失

如果某列存在 NULL 值时,如果执行非等于查询(<>或者!=)会导致为 NULL 值的结果丢失,比如下面的这些数据:
在这里插入图片描述
当我们查询name不等于"Java"的所有数据时,预期结果应该是id从2到10的数据,但是执行以下sql查询时
在这里插入图片描述
查询结果如下所示:
在这里插入图片描述

可以看出id=9和id=10的name为 NULL 的两条数据没有查询出来,这个结果并不符合我们的正常预期。
解决方案
要解决以上的问题,只要修改条件,将姓名不等于Java或者是空值的查出来即可,执行 SQL 如下:
在这里插入图片描述
执行结果如下:
在这里插入图片描述
可以看出10条数据都查询出来了,这个结果符合我们的正常预期。

4.导致空指针异常

当我们使用一些函数,比如求和函数sum(column) 或者平均值之类的函数,如果所求的字段中有空值,所求的值就会为空而非0。

如果 sum 查询的结果为 NULL 就可以能会导致程序执行时空指针异常(NPE),我们来演示一下这个问题。

为了演示这个问题,首先我们先构建一张表和一些测试数据:
在这里插入图片描述
表中原始数据如下:
在这里插入图片描述
接下来我们使用 sum 查询,执行以下 SQL:
在这里插入图片描述
查询执行结果如下:
在这里插入图片描述
当查询的结果为 NULL 而非 0 时,就可以导致空指针异常。
解决空指针异常
可以使用ifnull()对空值进行处理来避免空指针异常:
在这里插入图片描述
查询执行结果如下:
在这里插入图片描述

5.增加了查询难度

当字段中有了空值,对于null值或者非null值的查询难度就增加了,必须使用与null匹配的查询方法,比如IS NULL或者IS NOT NULL又或者是IFNULL(cloumn)这样的表达式进行查询,传统的 =、!=、<>…这些表达式就不能使用了,这就增加了查询的难度。

还是以 person 表为例,它的原始数据如下:
在这里插入图片描述
错误用法 1:
在这里插入图片描述
执行结果为空,并没有查询到任何数据,如下图所示:
在这里插入图片描述
错误用法 2:
在这里插入图片描述
执行结果也为空,没有查询到任何数据,如下图所示:
在这里插入图片描述
正确用法 1:
在这里插入图片描述
执行结果如下:
在这里插入图片描述
正确用法 2:
在这里插入图片描述
执行结果如下:
在这里插入图片描述
阿里巴巴《Java开发手册》推荐我们使用 ISNULL(cloumn) 来判断 NULL 值,原因是在 SQL 语句中,如果在 null 前换行,影响可读性;而 ISNULL(column) 是一个整体,简洁易懂。从性能数据上分析 ISNULL(column) 执行效率也更快一些。

总 结

本文我们讲了当某列为 NULL 时可能会导致的 5 种问题:丢失查询结果、导致空指针异常和增加了查询的难度。因此在最后提倡大家在创建表的时候尽量设置 is not null 的约束,如果某列确实没有值,可以设置空值(‘’)或 0 作为其默认值。


http://www.ppmy.cn/news/66423.html

相关文章

Feign踩坑源码分析--@FeignClient注入容器

一. EnableFeignClients 1.1.类介绍 从上面注释可以看出是扫描声明了FeignClient接口的类&#xff0c;还引入了 FeignClientsRegistrar类&#xff0c;从字面意思可以看出是进行了 FeignClient 客户端类的注册。 1.2.FeignClientsRegistrar 详解 最主要的一个方法&#xff1a;re…

南大通用数据库-Gbase-8a-学习-35-rmt(远程导出数据文件)

目录 一、测试环境 二、引入 三、rmt导出流程 四、Linux环境模拟实验 1、不加rmt导出数据 2、加rmt导出数据 一、测试环境 名称值CPUIntel(R) Core(TM) i5-1035G1 CPU 1.00GHz操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数2目的端Gbase8a版本8.6.2-R43源…

网安笔记10 Securities of Lower-layer Protocol

Securities of Lower-layer Protocol 协议 TCP/IP IP 网际协议 源目的地址比特位选项、头检验&#xff0c;数据净荷IP数据包击败字节到 160000字节IP级上无虚拟电路概念数据包独立不稳定保证只检验IP头&#xff0c;正确性不检验 安全性&#xff1a;无法保证数据从数据包给…

Kubernetes对象之PersistentVolume,PersistentVolumeClaim和StorageClass

前面我们学习了Kubernetes中的Volume&#xff0c;我们可以发现前文中的Volume&#xff08;无论何种类型&#xff09;和使用它的Pod都是一种静态绑定关系&#xff0c;在Pod定义文件中&#xff0c;同时定义了它使用的Volume。在这种情况下&#xff0c;Volume是Pod的附属品&#x…

LangChain-Agents 入门指南

LangChain-Agents 入门指南 LangChain-Agents 入门指南注册 Serpapi运行高级 Agents API 测试运行 Google Search其它 Here’s the table of contents: LangChain-Agents 入门指南 LangChain是一个使用LLMs构建应用程序的工具箱&#xff0c;包含Models、Prompts、Indexes、Mem…

lombok常用注解

1.Getter/Setter 自动生成getter/setter方法2.NoArgsConstructor/AllArgsConstructor 自动生成无参/有参构造方法3.ToString 自动生成toString方法4.EqualsAndHashCode 自动生成equals和hashCode方法5.Data 自动生成所有基本方法&#xff0c;包括getter/setter、equals、h…

K公司项目文件管理系统的分析与设计_kaic

摘 要 2020年的新冠疫情促进了线上办公市场的发展&#xff0c;加快了企业进入全面数字化时代的脚步。办公自动化是当今的大趋势&#xff0c;越来越多的企业采用电子文档的形式存储内外部资料。K公司是一家致力于为政府和企业提供数据安全服务的小型B2B企业&#xff0c;公司承…

C语言的词法符号

C语言的词法符号 词法符号是若干个字符组成的有意义的最小语法单位。 按照在程序中的作用&#xff0c;可以分为&#xff1a;关键字、标识符、运算符、分隔符和标点符号。 1、关键字 ​ ——由系统与定义好的词法符号&#xff0c;有特殊的含义&#xff0c;不允许用户重新定义。…