mysql数据库其中一列为null,他会有什么坑

1. count 数据丢失

当某列存在 NULL 值时,再使用 count 查询该列,就会出现数据“丢失”问题,如下 SQL 所示:

select count(*),count(name) from person;

查询执行结果如下:

减少HTTP请求

从上述结果可以看出,当使用的是 count(name) 查询时,就丢失了两条值为 NULL 的数据丢失

解决方案

如果某列存在 NULL 值时,就是用 count(*)或者 count(id) 进行数据统计。

2.distinct 数据丢失

当使用 count(distinct co11,co2) 查询时,如果其中一列为 NULL,那么即使另一列有不同的值,那么查询的结果也会将数据丢失,如下 SQL 所示:

select count(distinct name ,mobile) from person;

查询执行结果如下:

减少HTTP请求

3.select 数据丢失

如果某列存在 ULL 值时,如果执行非等于查询 (<>/!=)会导致为 NULL 值的结果丢失

select * from person where name<>'php' order by id;
--或
select * from person where name!='php' order by id;

4.导致空指针异常

如果某列存在 NULL 值时,可能会导致 sum(column)的返回结果为 NULL 而非0,如果 sum 查询的结果为NULL 就可以能会导致程序执行时空指针异常

接下来我们使用 sum 查询,执行以下SQL

select sum(num) from goods where id>4;

解决空指针异常

可以使用以下方式来避免空指针异常

select ifnull(sum(num),0) from goods where id>4;

5. 增加了查询难度

当某列值中有 NULL 值时,在进 NULL 值或者非 NULL 值的查询难度就增加了
所谓的查询难度增加指的是当进行 ULL 值查询时,必须使用 NULL 值匹配的查询方法,比如 S NULL 或者SNOT NULL 又或者是 IFNULL(cloumn) 这样的表达式进行查询,而传统的 =、!=<>..等这些表达式就不能使用了,这就增加了查询的难度,尤其是对小白程序员来说

错误用法 1:

select * from person where name<>null;

错误用法 2:

select * from person where name!=null;

正确用法 1:

select * from person where name is not null;

正确用法2:

select * from person where !isnull(name);

推荐用法

阿里巴巴《Java开发手册》推荐我们使用 ISNULL(cloumn)来判断 NULL 值,原因是在 SOL 语句中,如果在null 前换行,影响可读性;而 ISNULL(column)是一个整体,简洁易懂。从性能数据上分析 ISNULL(column)执行效率也更快一些。

扩展知识: NULL不会影响索引

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

所以阿里出的《java开发手册》 mysql 有一条规范,查询数据条数,都是 count(*)

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!