MySQL 字段为 NULL 的5大坑,大部分人踩过

news/2024/11/29 4:04:46/

数据库字段允许空值(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"的所有数据时,预期结果应该是id210的数据,但是执行以下sql查询时:

 查询结果如下所示:

 可以看出id=9id=10nameNULL 的两条数据没有查询出来,这个结果并不符合我们的正常预期。

解决方案

要解决以上的问题,只要修改条件,将姓名不等于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 作为其默认值。

-END-


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

相关文章

调用百度文心AI作画API实现中文-图像跨模态生成

作者介绍 乔冠华&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2020级硕士研究生&#xff0c;张宏伟人工智能课题组。 研究方向&#xff1a;机器视觉与人工智能。 电子邮件&#xff1a;1078914066qq.com 一&#xff0e;文心AI作画API介绍 1. 文心AI作画 文…

web自动化测试进阶篇02 ——— BDD与TDD的研究实践

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

机器学习强基计划10-1:为什么需要集成学习?核心原理是什么?

目录 0 写在前面1 集成学习概念与优势2 结合策略梳理2.1 加权平均法2.2 投票法2.3 学习法 3 误差-分歧分解 0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&#xff1b;“广”在分析多个机器…

计算机图形学-GAMES101-8

引言 着色是针对某一个点(片段)的应用&#xff0c;这里需要考虑着色的频率。  漫反射项代表光向四面八方均匀的反射出去&#xff0c;和观察方向无关。  Blinn-Phong反射模型结构如下&#xff1a; ) 一、Blinn-Phong模型 &#xff08;1&#xff09;Specular 什么时候才能看到…

VOSviewer安装、环境配置及中英文文献的分析

VOSviewer介绍&#xff1a; VOSviewer是一个用于构建和可视化文献计量网络的软件工具。例如&#xff0c;这些网络可能包括期刊、研究人员或单个出版物&#xff0c;它们可以基于引文、书目耦合、共同引用或共同作者关系构建。VOSviewer 还提供文本挖掘功能&#xff0c;可用于构…

【夜莺(Flashcat)V6监控】3.链路追踪

链路追踪 介绍 链路追踪是分布式系统下的一个概念&#xff0c;它的目的就是要解决上面所提出的问题&#xff0c;也就是将一次分布式请求还原成调用链路&#xff0c;将一次分布式请求的调用情况集中展示&#xff0c;比如&#xff0c;各个服务节点上的耗时、请求具体到达哪台机…

Yarn安装及配置一件启停

Yarn安装及配置一件启停 数据、程序、运算资源&#xff08;内存、CPU)三者组在一起&#xff0c;才能完成数据的计算处理过程。在单机环境下&#xff0c;三者之间协调配合不是太大问题。为了应对海量数据的处理场景&#xff0c;Hadoop软件出现并提供了分布式处理思想。但是在分…

北华大学第九届程序设计竞赛 题解

5.14和队友VP一场&#xff0c;第二次VP&#xff0c;状态明显比第一次好很多&#xff0c;总共A了7题&#xff0c;基本是能做出来的都做出来了&#xff0c;最后还剩下接近2小时的时间。。。。。 A "北华"有几何 思路&#xff1a;数图片中“北华”的数量&#xff0c;直…