MySQL 对null 值的特殊处理

需求

        需要将不再有效范围内的所有数据都删除,所以用not in (有效list)去实现,但是发现库里,这一列为null的值并没有删除,突然想到是不是跟 a=null 不能生效一样,not in 对null不生效,也需要特殊处理。

MySQL 对null 值的特殊处理_第1张图片

解决

        增加对null额外处理,问题解决。

MySQL 对null 值的特殊处理_第2张图片

MySQL对NULL值定义

MySQL :: MySQL 8.0 Reference Manual :: 3.3.4.6 Working with NULL Values

MySQL :: MySQL 8.0 Reference Manual :: B.3.4.3 Problems with NULL Values

        可以看下MySQL文档,其中描述了对null值的定义是,从概念上讲,表示“缺少未知值”。如下图所示,NULL作为电话号码不为人知,空字符串'' 作为这个人没有电话、没有电话号码去理解, 但是这对于我们日常的开发、理解,包括对非字符类型的默认值,都需要一个默认值的规定。对于字段来说,能Default Not Null 的尽量设置,对于可能为空的值,存在NULL值无可厚非,只是在SQL语句中要注意对null的特殊处理。自信考证NULL值存在的合理性以及使用场景。

MySQL 对null 值的特殊处理_第3张图片

NULL值缺点

NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.

        Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要Mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MyISAM 中固定大小的索引变成可变大小的索引。

You can add an index on a column that can have NULL values if you are using the MyISAM, InnoDB, or MEMORY storage engine. Otherwise, you must declare an indexed column NOT NULL, and you cannot insert NULL into the column.

        你可以在包含NULL值的列上添加索引,如果您使用的是MyISAM、InnoDB或内存存储引擎。除此之外,必须声明索引列NOT NULL,并且不能将NULL插入该列。

         对于NULL的处理麻烦:

  • 不能使用算术比较运算符如=,<,>,<> ,会导致无法从此类比较中获得任何有意义的结果
  • 不能使用聚合函数(如 COUNT, SUM, AVG,MIN,MAX),会忽略NULL值的存在
  • 也不能使用not in ,in ,CONTAINS 等操作,会忽略NULL值的存在
  • 使用DISTINCT、GROUP BY或ORDER BY时,所有空值都被视为相等

MySQL 对null 值的特殊处理_第4张图片

MySQL 对null 值的特殊处理_第5张图片 

        但是NULL值存在感觉是难以避免的,所以还是多在日常开发中注意NULL的处理吧[doge]。

Working with NULL Values 

        对于NULL,需要专门用 is null ; is not null ; isNull() ; ifNull() ;<=>(比较操作符,当比较的的两个值相等或者都为 NULL 时返回 true) 去判断,

MySQL 对null 值的特殊处理_第6张图片

        如果返回值中有NULL,还需要对返回值进一步处理的,可以使用COALESCE 函数 或者 IFNULL 函数对NULL值进行处理从而避免NPE。

SELECT product_name, COALESCE(stock_quantity, 0) AS actual_quantity
FROM products;

SELECT product_name, IFNULL(stock_quantity, 0) AS actual_quantity
FROM products;

        对于聚合函数 ,如COUNT,AVG等,统计NULL所在行是有意义的场景,要不就像Ali开发手册中那样,对存在NULL值的列,不能使用count(col)来代替count(*),要不就需要对NULL值做额外处理

MySQL 对null 值的特殊处理_第7张图片

 

SELECT AVG(COALESCE(salary, 0)) AS avg_salary FROM employees;

         对于排序,排序字段里面需要有一个确定不为NULL的值存在,否则针对NULL值的排序会错乱。

MySQL分页排序注意事项-CSDN博客

参考

MySQL NULL 值处理 | 菜鸟教程

孤尽训练营打卡日记day04--MySQL优化_定时生成数据,用于用户数据耗时操作_星月夜_Mr. Yu的博客-CSDN博客

你可能感兴趣的:(mysql,java,数据库)