SQL 中null值(转载)

2022年10月15日00:00:19 科技 1503

SQL中这些与NULL有关的细节,你知道吗?

NULL是SQL常见的关键字之一,表示“空,无”的意思。它在SQL中是一种独特的存在,今天来汇总一下与它相关的知识点,看看这些你都知道吗?

先贴一下我们的原始数据,是一个只有1列的表,表名为example,很简单:

SQL 中null值(转载) - 天天要闻

1.NULL是一种特殊的值,对某字段使用distinct 关键字时,NULL和一般值一样,都会排重,只保留一个值。

SQL 中null值(转载) - 天天要闻

2.不能对NULL值使用比较运算符

直白地讲,不能对null值使用等号(=)或者不等号(!=)进行比较,要使用is null 和 is not null。

SQL 中null值(转载) - 天天要闻

有一种情况需要注意,假设我们需要取col不为2的所有col值,包括null。不能只写where col <> '2',因为这样的写法不会包括NULL值。我们需要写成where col <> '2' or col is null。

SQL 中null值(转载) - 天天要闻

3.count(*)会统计null值,count(列名)不包括null值。

SQL 中null值(转载) - 天天要闻

4.含NULL值的运算结果都为NULL,如下面图所示(点击查看大图)

SQL 中null值(转载) - 天天要闻

5.使用sum函数和avg函数时,相应列中包含NULL的,会发生什么?

SQL 中null值(转载) - 天天要闻

sum和avg函数作用于含有NULL的列,NULL值不参与计算。上面图中,sum(col) 是1+2+2+3=8。avg(col) 是(1+2+2+3)/4=2,注意分母是4而不是6。如果需要将NULL值当作0值参与到运算中,可以用case when的方式进行判断赋值。

select sum(case when col is null then 0 else col end) from example;#结果是8

select avg(case when col is null then 0 else col end) from example;#分母是6,结果是1.33

除此外,在使用max,min时,也会忽略NULL值。事实上,聚合函数如果以列名为参数,那么在计算之前就会把NULL 排除在外。

6.如果某列含有null,使用group by 进行聚合时,null值会单独保留一行。

这一点和第一点有点类似,见下面代码。

SQL 中null值(转载) - 天天要闻

7.null占用的空间是多少?

SQL 中null值(转载) - 天天要闻

我们在原数据的基础上插入了一行空字符串的数据。然后来看每一个值所占用的空间。可以看到,NULL所占的空间是NULL,是占用空间的,而空字符串长度是0,是不占用空间的。

NULL columns require additional space in the row to record whether their values are NULL.
NULL列需要行中的额外空间来记录它们的值是否为NULL。

有一个比喻很恰当:空值就像是一个真空状态杯子,什么都没有,而NULL值就是一个装满空气的杯子,虽然看起来都是一样的,但是有着本质的区别。

补充说明:对于空值的判断需要用=,!= 等算数运算符,而NULL值不行。count等聚合函数会忽略NULL值,但不会忽略空值。

8.对NULL进行排序,结果如何?

SQL 中null值(转载) - 天天要闻

上面的结果,升序排序,NULL在最开头,但这并不能说明NULL比1小,因为我们前面提到是不能对NULL使用比较运算符的。这里的结果只是把NULL放在了开头显示,可能在另外的数据库中,会统一放到结尾显示。

9.大多数函数作用于NULL,结果都是NULL,如concat函数,abs函数等。但COALESCE函数除外,它返回第一个不为NULL的值。我们常会看到的NVL函数是该函数的简化版本,类似的函数还有IFNULL。

SELECT COALESCE(NULL, 1) AS col_1,

COALESCE(NULL, 'test', NULL) AS col_2,

COALESCE(NULL, NULL, '2009-11-01') AS col_3;

--结果:1 test 2009-11-01

10.NULL的其他作用

NULL多用在字段约束中,如非空约束可以用NOT NULL表示。NULL经常用在case表达式中的ELSE子句中:case when <条件> else NULL end,else的部分也可以不写,但为了易读性,还是建议写。

小结

对NULL常用的知识点总结如下面的思维导图,欢迎大家补充。(在有些地方看到了在插入和更新数据时NULL的注意事项和索引相关的知识,由于用的比较少,就不放在这里了,可以参考文末链接自行学习)

SQL 中null值(转载) - 天天要闻

科技分类资讯推荐

如何让RTX 5060显卡的性价比爆棚!AMD锐龙5平台给出答案 - 天天要闻

如何让RTX 5060显卡的性价比爆棚!AMD锐龙5平台给出答案

RTX 5060显卡作为NVIDIA最新推出的中端游戏显卡,在2K分辨率下性能表现出色,尤其在DLSS 4技术加持下,帧率提升幅度可达60-150%。然而,显卡本身的8GB显存容量在部分高负载场景下可能成为瓶颈,这就需要一个能够充分发挥其潜力的平台。经过深入研究,AMD平台凭借其出色的单核性能、低功耗设计以及优秀的内存延迟优化,能够...
2599元?小米这7400mAh新机,可能又要KO友商了 - 天天要闻

2599元?小米这7400mAh新机,可能又要KO友商了

最近,小米又有一款新机通过了 3C 认证,型号为 25060RK16C。如无意外,这机子就是大伙期待的 REDMI K80 至尊版了。一般来说,通过认证就意味着距离发布不远了。而结合爆料来看,这代发布时间确实有可能提前,有望在 6 月亮相(
真我Neo7 Turbo百瓦快充+7200mAh电池 - 天天要闻

真我Neo7 Turbo百瓦快充+7200mAh电池

目前,真我Neo7 Turbo新品发布会已经正式官宣,将于5月29日14:00到来。随着新品发布时间的接近,相关的产品消息也开始越来越多地出现。今天,真我手机官方宣布,新机将内置7200mAh泰坦电池,支持100W光速秒充,还支持全场景旁路
苹果WWDC25官宣 iOS19变圆了 - 天天要闻

苹果WWDC25官宣 iOS19变圆了

本周,苹果公司正式宣布2025年全球开发者大会也就是WWDC25将于太平洋时间6月9日至13日(北京时间6月10日至14日)举行。
玄戒芯片暂不覆盖REDMI?K80 Ultra通过认证 - 天天要闻

玄戒芯片暂不覆盖REDMI?K80 Ultra通过认证

去年11月末,REDMI K80系列正式发布,带来了REDMI K80 Pro、REDMI K80两款机型,还提供了一个REDMI K80 Pro 冠军版。与此同时,该系列的超大杯机型REDMI K80 Ultra,也在最近陆续出现了不少爆
一加Ace5至尊系列规格曝光,马上发! - 天天要闻

一加Ace5至尊系列规格曝光,马上发!

目前,一加Ace 5至尊系列已经正式宣布将在5 月 27 日 14:30带来新品发布活动,且发布会后即刻开售。随着新品发布时间的接近,相关爆料和剧透信息也开始大量出现。今天,博主@熊猫很秃然 的最新爆料中提到了一加Ace 5 至尊版和一加A
三星Galaxy S25 Edge开售,后续新机再曝 - 天天要闻

三星Galaxy S25 Edge开售,后续新机再曝

上周,三星带来了新品发布活动,并正式推出了全新的Galaxy S25 Edge手机。这也是今年到来的首款超轻薄旗舰机型。如今随着时间的推进,这款超轻薄旗舰也迎来正式开售。作为一款主打轻薄的机型,全新的三星Galaxy S25 Edge机身厚