NULL 无值(no value),它与字段包含 0 、空字符串或仅仅包含空格不同。

数据库字段允许空值,会遇到一些问题,这里整理一些 MySQL 设置列允许为 NULL 带来的坑。

数据准备:

  1. CREATE TABLE `teacher` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(32) DEFAULT NULL,
  4. `age` int(11) DEFAULT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
  7. insert into `teacher` (`id`, `name`, `age`) values('1','seven','18');
  8. insert into `teacher` (`id`, `name`, `age`) values('2', NULL,'20');
  9. insert into `teacher` (`id`, `name`, `age`) values('3','zhangsan', NULL);

问题一:负向查询,不能获取 NULL 值的行

比如查询 age!=18 的数据,id=3 的数据获取不到。

  1. SELECT * FROM teacher WHERE age!=18;

image.png

NULL 与不匹配在通过过滤选择出不具有特定值的行时,你可能希望返回具有 NULL 值的行。但是,不行。因为未知具有特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。

问题二:通配符不能匹配到列为 NULL 的数据

比如我们执行如下语句:

  1. SELECT * FROM teacher WHERE name LIKE '%';

image.png

注意 NULL 虽然似乎 % 通配符可以匹配任何东西,但有一个例外,即 NULL。即使是 WHERE name LIKE ‘%’ 也不能匹配用值 NULL 作为姓名的行。

问题三:分组时,NULL 将作为单独一个分组返回

如果分组列中具有 NULL 值,则 NULL 将作为一个分组返回。如果列中有多行 NULL 值,它们将分为一组。

问题四:聚集函数会忽略列值为 NULL 的行

比如我们执行如下语句:

  1. SELECT COUNT(name) FROM teacher;

image.png

数据库中有三条数据,上面的 SQL 值显示2条数据。

问题五:包含 NULL 值的 IN 和 NOT IN 操作也有问题

详情参考:MySQL 子查询

作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/takcsg 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。