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

news2024/12/25 8:50:41

前言

很多小知识点,我以为自己懂了,实际没搞透。
数据库字段允许空值(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.coloradmin.cn/o/508563.html

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

相关文章

RHCSA 作业一

[rootserver ~]# mkdir /opt/tmp #在/opt目录下创建一个目录tmp [rootserver ~]# ls /opt tmp [rootserver ~]# touch /opt/tmp/a.txt #在tmp目录下新建一个文件a.txt [rootserver ~]# ls /opt/tmp a.txt [rootserver ~]# cd /opt/tmp #进入tmp目录下 [rootserver tmp]# …

大比拼:讯飞星火大模型将超越ChatGPT?

5月6日&#xff0c;讯飞星火认知大模型成果发布会于合肥举办。会上&#xff0c;备受业界期待的“星火”认知大模型正式发布&#xff0c;讯飞AI学习机、讯飞听见、讯飞智能办公本、讯飞智慧驾舱、讯飞数字员工&#xff0c;四大行业中的五大成果同步演示&#xff0c;发布会全程进…

Hive经典面试题——连续7天登录用户与TopN

目录 一、连续7天登录用户 1.数据准备ulogin.dat 2.建表与加载数据 3. 使用 row_number 在组内给数据编号(rownum) 4.某个值 - rownum gid&#xff0c;得到结果可以作为后面分组计算的依据 5.根据求得的gid&#xff0c;作为分组条件&#xff0c;求最终结果 二、求TopN …

Overcoming catastrophic forgetting in neural networks

目录 预备知识&#xff1a; 论文笔记 1. Introduction 2. Elastic weight consolidation 2.1 EWC allows continual learning in a supervised learning context 2.2 EWC allows continual learning in a reinforcement learning context 3. Conclusion 文章链接&#x…

100ASK_全志V853-PRO开发板支持人形检测和人脸识别

1.前言 V853 芯片内置一颗 NPU核&#xff0c;其处理性能为最大 1 TOPS 并有 128KB 内部高速缓存用于高速数据交换&#xff0c;支持 OpenCL、OpenVX、android NN 与 ONNX 的 API 调用&#xff0c;同时也支持导入大量常用的深度学习模型。本章提供一个例程&#xff0c;展示如何使…

JavaScript基础之数值计算

常见的几种场景 场景一&#xff1a;进行浮点值运算结果的判断 常见错误写法&#xff1a;floatNum1 floatNum2 res 我们在Chrome里测试一下 0.1 0.2 0.3&#xff0c;得出的结果是false&#xff0c;而不是预期结果true&#xff0c;因为 0.1 0.2 0.30000000000000004 场…

【Vue-Treeselect 和 vue3-treeselect】树形下拉框

Vue-Treeselect Vue2树形下拉框 链接 文档&#xff1a;Vue-Treeselect 实现 第一步&#xff1a;安装 npm install --save riophae/vue-treeselect 第二步:实现 import Treeselect from riophae/vue-treeselect import riophae/vue-treeselect/dist/vue-treeselect.css属性…

python数据类型总结

标准数据类型 Python 有以下几种标准数据类型&#xff1a; 整数&#xff08;int&#xff09;&#xff1a;表示整数值&#xff0c;如 1, -5, 0 等。浮点数&#xff08;float&#xff09;&#xff1a;表示小数值&#xff0c;如 3.14, -0.01, 1.0 等。字符串&#xff08;str&…

AI智能音箱高性价比出好音质的功放芯片

近几年人工智能等技术的不断发展&#xff0c;AI智能音箱已成为炙手可热的爆款&#xff1b;众多企业纷纷加入其中&#xff1b;如我们熟知的天猫精灵、小爱同学、小度智能音箱、华为AI音箱、腾讯叮当等等智能音箱&#xff1b;据不完全统计&#xff0c;目前国内做智能音箱的企业已…

SpringBoot——创建一个SpringBoot工程

简单介绍&#xff1a; 在之前我们学习JavaEE的时候&#xff0c;是直接使用Spring进行操作&#xff0c;以比较原始的方式进行了SSM的整合&#xff0c;这次我们就来学习一个强大的框架——SpringBoot&#xff0c;这个框架是用来简化Spring应用的初始化创建过程&#xff0c;以及开…

APP外包项目的代码规范

APP项目在工作中使用越来越多&#xff0c;2C的APP项目基本饱和&#xff0c;2B的AP项目P还有很大的发展空间。越来越多的企业希望通过APP来提升工作效率或加强和客户的沟通&#xff0c;但这些企业大多数不是专业的软件公司&#xff0c;开发软件时需要找软件外包开发公司&#xf…

C/C++每日一练(20230510) 编辑距离、多数元素、数列累和

目录 1. 编辑距离 &#x1f31f;&#x1f31f;&#x1f31f; 2. 多数元素 &#x1f31f; 3. 求分数数列的前N项和 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 编辑距离 给你…

OpenCV教程——Mat对象

1.Mat对象和IplIamge对象 Mat对象是OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题&#xff0c;是面向对象的数据结构。分为两个部分&#xff1a;头部和数据部分。IplIamge是从2001年OpenCV发布之后就一直存在&#xff0c;是C语言风格的数据结构&#…

笔记本电脑没有声音怎么办?5个必会方法分享

案例&#xff1a;笔记本电脑没有声音怎么办&#xff1f; 【我的笔记本电脑为什么会没有声音呢&#xff1f;看视频听音乐一点声音都没有&#xff0c;实在太烦人了&#xff01;应该怎么解决呢&#xff1f;】 笔记本电脑逐渐成为人们工作生活必备的工具。如果笔记本电脑没有声音…

怎样检测和维护LED显示屏系统

检测和维护LED显示屏系统是确保其正常运行和延长寿命的重要步骤。以下是一些常见的检测和维护LED显示屏系统的方法&#xff1a; 视觉检查&#xff1a;定期进行视觉检查以确保LED显示屏没有明显的损坏或故障。检查显示屏表面是否有损坏、裂纹或漏光等情况。如果发现任何问题&…

ChatGPT作者John Schulman:通往TruthGPT之路

OneFlow编译 翻译&#xff5c;贾川、徐佳渝、杨婷 大型语言模型&#xff08;LLM&#xff09;有一个众所周知的“硬伤”——它们经常会一本正经编造貌似真实的内容。 OpenAI团队希望通过改进强化学习反馈步骤“原生地”阻止神经网络产生幻觉&#xff0c;OpenAI首席科学家Ilya …

spark-sql 报错:Exception thrown flushing changes to datastore

报错背景 hive创建数据库时添加中文备注信息报错。 命令&#xff1a;CREATE DATABASE IF NOT EXISTS hive_ods_db COMMENT Hive ODS层数据库; 报错现象 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Excep…

递归行为与归并排序

master公式 T(N)a*T(N/b)O(N^d) T(N)&#xff1a;问题的规模是N个数据 N/b&#xff1a;子过程的规模 a&#xff1a;调用的次数 O(N^d) &#xff1a;除子问题的调用之外&#xff0c;剩余的代码的时间复杂度 使用条件&#xff1a;满足子问题等规模的递归 arr[L,R]范围…

49天精通Java,第27天,队列、双端队列、优先队列

目录 一、队列与双端队列二、Queue和Deque三、api对比1、add和offer区别2、remove和poll3、element和peek 四、优先队列1、PriorityQueue常用方法2、ArrayDeque常用方法 大家好&#xff0c;我是哪吒。 一、队列与双端队列 双端队列是一种特殊的队列&#xff0c;它的两端都可以…

吴军《计算之魂》读后感

前言 断断续续&#xff0c;终于完成了这本书的第一次通读&#xff0c;记录下自己的一些想法。 先说一个小故事。前段时间家里买了一个小鱼缸&#xff0c;问我有没有办法让水自动循环&#xff0c;但不想用电。没有好的想法&#xff0c;去小某书上搜了下&#xff0c;好多案例教…