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两个字段创建唯一联合索引
alter table t add unique idx_ab(a,b);
由于是唯一索引,所以第二次插入(1,1)时会报错
insert into t(a,b) values(1,1);
insert into t(a,b) values(1,1);
但如果是插入(2,null)则不会报错
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'应该更好吧?
欢迎大家在评论区聊聊你对这六大坑的看法,或者自己的踩坑经历,谢谢大家的阅读,记得点赞、关注哦。
正文结束,以下是广告时间。
为什么你要系统、深入的学一下MySQL?
第一,能让你真正成为一名架构师,数据库这么重要,可现在又有几个架构师真正懂MySQL的?如果你懂,你将成为一名真正意义上优秀的架构师,年薪百万不是梦。
第二,现在哪个面试官不问MySQL?索引、事务、锁是必问的,可又有几个人能真正把底层原理说清楚?如果你能,面试官会对你刮目相看,更愿意给你高薪,给你offer。
第三,大家都会有35岁的那一天,真到那一天的时候,你的优势是什么?你积累的是什么?管理经验?业务经验?CRUD经验?还是专业的技术经验?从现在开始你就应该积累那些不容易被替代的经验,学一下门槛更高的技术,别老学一下简单的东西,别做无意义的努力,做具有长期价值的事情,学会做时间的朋友。
第四,数据库国产化是未来趋势大家都应该知道,数据库内核开发也应该听说过,这些岗位比Java、前端可香多了,目前业内是缺这方面专业人才的,还有技术红利,是真正的技术岗,没有哪个技术大牛是一直做CRUD的,也没有规定说你就只能一直做CRUD,技术人就应该研究技术,系统深入的学一下MySQL,能让你真正成为一名专业的技术人员。
第五,工作中绕不过MySQL的各种问题,是百度呢还是谷歌呢,还是来问我呢?咱能不能好好学一下MySQL,遇到问题自己就直接解决掉,提高工作效率,少加班。
我分析的没错吧,系统深入的学一下MySQL对你来说只有好处没有坏处,而且学MySQL的过程中能让你跳出现在的编程思维,学到新的设计思想、思维模型,让你收益终身。
课程内容
我的《百万年薪MySQL精品课:手写MySQL+MySQL源码解析》分为三期

当前处于第一期,第一期分为Java手写MySQL和MySQL源码解析两个阶段,会分为五个专题进行展开(详细课程大纲在文末):
【专题一:数据的家-表空间专题】:学完你将收获数据库领域中最优秀的数据存储机制设计思想
【专题二:数据的物理表示-行和页专题】:学完你将收获到一行记录在磁盘中到底是如何进行CRUD的
【专题三:数据的高性能查询-索引和查询专题】:学完你将收获关于索引、B+树、查询优化、性能调优的一切
【专题四:数据的并发安全-锁专题】:学完你将收获到MySQL中有哪些锁以及锁的实现机制和优化手段
【专题五:数据的完整性-事务专题】:学完能将以上四个专题融会贯通,同时掌握事务相关的底层机制
课程反馈
课程正在更新中,以下是部分学员学过后的真实反馈,在此也感谢这些学员的反馈,我会继续加油做好课程。




为什么大家都愿意跟着我学?
我是谁
我是大都督周瑜,前美团高级架构师,资深技术专家,专注研究各种技术的底层实现,研究过Spring、SpringBoot、Spring Cloud、RabbitMQ、Tomcat、Dubbo、Zookeeper、JVM、Linux、SpringAI、LangChain、MetaGPT、GraphRAG、MySQL...等源码,现在专注做IT技术的底层源码培训,学源码找周瑜就对了!
以下是众多学员对我的评价,研究技术和研究课程,是我的终身事业。

课程报名
都看到这了,欢迎扫码咨询一下,原价2688,现价1x88,最好的投资就是投资自己,投资人生,加油吧,逆天改命,从此刻做起!

第一期课程详细大纲






