需要将不再有效范围内的所有数据都删除,所以用not in (有效list)去实现,但是发现库里,这一列为null的值并没有删除,突然想到是不是跟 a=null 不能生效一样,not in 对null不生效,也需要特殊处理。
增加对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值存在的合理性以及使用场景。
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的处理麻烦:
但是NULL值存在感觉是难以避免的,所以还是多在日常开发中注意NULL的处理吧[doge]。
对于NULL,需要专门用 is null ; is not null ; isNull() ; ifNull() ;<=>(比较操作符,当比较的的两个值相等或者都为 NULL 时返回 true) 去判断,
如果返回值中有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值做额外处理
SELECT AVG(COALESCE(salary, 0)) AS avg_salary FROM employees;
对于排序,排序字段里面需要有一个确定不为NULL的值存在,否则针对NULL值的排序会错乱。
MySQL分页排序注意事项-CSDN博客
MySQL NULL 值处理 | 菜鸟教程
孤尽训练营打卡日记day04--MySQL优化_定时生成数据,用于用户数据耗时操作_星月夜_Mr. Yu的博客-CSDN博客