MySQL列中关于null值问题的总结

本文详细介绍了在SQL查询中如何处理NULL值,包括使用IS NULL和IS NOT NULL进行查询,以及 DISTINCT、GROUP BY、COUNT、ORDER BY等操作与NULL的交互。还探讨了NULL值在计算和查询中的特殊性,强调了设计数据库时避免NULL值的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

公司项目的数据库中一张很久以前的表中有很多null值,导致查询sql比较繁杂。null值查询的感觉很糟糕,而且含有很多意想不到的坑,总结一下null的使用事项


一、查询

有一张prouct表,里面有一个is_only_channel字段,分别有3种值,0、1、null,个数分别是1453、1、4359

1.1 对NULL值进行查询

表中NULL值进行查询的话,必须使用专用语法is null 或者is not null

select product_cd,is_only_channel from product where is_only_channel is null;

结果如下(只截取了一部分)

product_cdis_only_channel
SFB023null
SHF191null
SKF099null
SPM527null
SDU269null

非NULL值查询

select product_cd,is_only_channel from product where is_only_channel is not null;

结果如下(只截取了一部分)

product_cdis_only_channel
SPM1390
SPL8180
SPL0050
SPL4890
SPM1270
SMU1641

可以查询出不是NULL值的所有值

1.2 进行<>(!=)查询

进行不等查询时,无法查询NULL值

select product_cd,is_only_channel from product where is_only_channel <> 0;
product_cdis_only_channel
SMU1641

只能查询出is_only_channel为1的值,所以要向查出null值或者不等于null的数据,只能使用专属的is null 或者 is not null语法

1.3 进行distinct查询

distinct用来去重,null值被归为同一种类型

select distinct(is_only_channel) from product;

结果是

is_only_channel
NULL
0
1

1.4 group by、count计算

count(*)会计算某一列同一值的个数,count(column)也是,区别是count(*)会计算null值的个数

count(*)查询

select count(*) from product group by is_only_channel;

查询结果是

is_only_channelcount(*)
NULL1452
04396
11

count(is_only_channel)查询

select is_only_channel,count(is_only_channel) from product group by is_only_channel;

查询结果为

is_only_channelcount(*)
NULL0
04396
11

可以发现NULL值的个数为0

1.5 order by

MySQL中,order by默认为升序排列,null值会排在最前面;指定降序排列的话null值会排在最后

1.6 NULL值计算

NULL值会使所有的计算失效

对is_only_channel列值为1的行加1时

select is_only_channel+1 from product where is_only_channel = 1;

结果是

is_only_channel
2

可以看出确实进行了加1

当对is_only_channel列为NULL值的行加1时

select is_only_channel+1 from product where is_only_channel is null;

结果是(只显示了部分)

is_only_channel
NULL
NULL
NULL
NULL

这时计算就失效了


总结

  • null值会给计算、查询带来复杂性,如果可能,尽量在设计表阶段就将所有的列设置为not null,并给予默认值
  • 查询null值只能使用is null, 查询非null值时只能使用is not null,使用其它方式查询会自动忽略null值
  • count(*)会计算含有null值的行,count(列名)不会计算含有null值的行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值