MySQL中关于NULL值的六大坑!你被坑过吗?

NULL值是我们在开发过程中的老朋友了,但是这个老朋友在MySQL中有很多坑,我通过这篇文章来总结分享一下,欢迎大家在评论区分享你的看法和踩坑经历。

1、NULL不等于NULL

在MySQL中,执行以下SQL会返回NULL

假如t表有以下数据,其中有一条a为null的记录

如果执行以下SQL将会返回空集合,明明有a为null的记录,但却没查到,好坑!

假如我们认为NULL等于NULL,那么这就会导致误解,从而导致业务逻辑出现问题。

大家觉得:NULL应不应该等于NULL呢?

事实上,我们得通过is null来判断某个值是不是null,可为啥要这么设计呢?

2、NULL与任何值比较都为NULL

实际上,NULL与任何值比较都为NULL

这里的重点是,并不是返回的0,而是null,既然不相等,为什么不返回0呢?不是1代表相等,0代表不相等吗?好坑!

3、NULL导致唯一索引不唯一

我们给a、b两个字段创建唯一联合索引

sql 复制代码
alter table t add unique idx_ab(a,b);

由于是唯一索引,所以第二次插入(1,1)时会报错

sql 复制代码
insert into t(a,b) values(1,1);
insert into t(a,b) values(1,1);

但如果是插入(2,null)则不会报错

sql 复制代码
insert into t(a,b) values(2,null);
insert into t(a,b) values(2,null);

最终表中的结果为

不是说ab是唯一索引吗,怎么还能有重复记录?好坑!

4、NULL对排序的影响

当前表的数据为

我们对a字段先进行升序排序

嗯...NULL排在了最前面,两个NULL也按id进行了升序排序,这倒是能理解,那反过来进行降序排序呢

嗯...NULL排在了最后面,这倒没问题,可是两个NULL的记录能不能也按id进行降序排序呢?你觉得是坑吗?

5、聚合函数不会统计NULL值

对于上表,总共有8条记录,其中a为null的有两条,执行count语句,以下结果大家应该能理解,count(a)时不会统计a为null的记录。

但是如果对a字段执行求平均数,那么结果为4.1667

计算方法为8+6+5+3+2+1=25,然后25/6=4.1667,关键是,到底应该是25/6还是25/8呢?你们觉得呢?

6、NULL导致函数结果为NULL

有时,我们可能会在SQL进行字符串连接,比如执行

为什么要返回null呢?返回'daduduzhouyu'应该更好吧?

欢迎大家在评论区聊聊你对这六大坑的看法,或者自己的踩坑经历,谢谢大家的阅读,记得点赞、关注哦。

我的所有文章汇总在了我的公众号:IT周瑜,欢迎大家关注,同时公众号内还有我整理的100道面试真题,有需要的兄弟关注后即可领取。

相关推荐
间彧9 分钟前
云原生,与云计算、云服务的区别与联系
后端
升鲜宝供应链及收银系统源代码服务21 分钟前
升鲜宝生鲜配送供应链管理系统---PMS--商品品牌多语言存储与 Redis 缓存同步实现
java·开发语言·数据库·redis·缓存·开源·供应链系统
canonical_entropy1 小时前
最小信息表达:从误解到深层理解的五个关键点
后端·架构
郝开1 小时前
Spring Boot 2.7.18(最终 2.x 系列版本):版本概览;兼容性与支持;升级建议;脚手架工程搭建
java·spring boot·后端
天若有情6731 小时前
新闻通稿 | 软件产业迈入“智能重构”新纪元:自主进化、人机共生与责任挑战并存
服务器·前端·后端·重构·开发·资讯·新闻
苦学编程的谢2 小时前
Redis_8_List
数据库·redis·缓存
曹天骄2 小时前
阿里云 DCDN → CDN 无缝切换教程(以 example.com 为例)
数据库·阿里云·云计算
清水2 小时前
Spring Boot企业级开发入门
java·spring boot·后端
星释3 小时前
Rust 练习册 :Proverb与字符串处理
开发语言·后端·rust
workflower3 小时前
软件工程-练习
数据库·需求分析·个人开发·极限编程·结对编程