NULL 无值(no value),它与字段包含 0 、空字符串或仅仅包含空格不同。
数据库字段允许空值,会遇到一些问题,这里整理一些 MySQL 设置列允许为 NULL 带来的坑。
数据准备:
CREATE TABLE `teacher` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
insert into `teacher` (`id`, `name`, `age`) values('1','seven','18');
insert into `teacher` (`id`, `name`, `age`) values('2', NULL,'20');
insert into `teacher` (`id`, `name`, `age`) values('3','zhangsan', NULL);
问题一:负向查询,不能获取 NULL 值的行
比如查询 age!=18 的数据,id=3 的数据获取不到。
SELECT * FROM teacher WHERE age!=18;
NULL 与不匹配在通过过滤选择出不具有特定值的行时,你可能希望返回具有 NULL 值的行。但是,不行。因为未知具有特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。
问题二:通配符不能匹配到列为 NULL 的数据
比如我们执行如下语句:
SELECT * FROM teacher WHERE name LIKE '%';
注意 NULL 虽然似乎 % 通配符可以匹配任何东西,但有一个例外,即 NULL。即使是 WHERE name LIKE ‘%’ 也不能匹配用值 NULL 作为姓名的行。
问题三:分组时,NULL 将作为单独一个分组返回
如果分组列中具有 NULL 值,则 NULL 将作为一个分组返回。如果列中有多行 NULL 值,它们将分为一组。
问题四:聚集函数会忽略列值为 NULL 的行
比如我们执行如下语句:
SELECT COUNT(name) FROM teacher;
数据库中有三条数据,上面的 SQL 值显示2条数据。
问题五:包含 NULL 值的 IN 和 NOT IN 操作也有问题
详情参考:MySQL 子查询
作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/takcsg 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。