前言:
这里不讲count(*)和count(1)的区别,介绍的是count()的另一个隐藏的知识点。下面我们先来看一个例子:
select 1 or null,0 or null;
结果如下:
补充知识点:
在MySQL中,0或 NULL意味着假(0)而其它值意味着真(1)。布尔运算(age = 4 或者 age is null都是布尔运算)的默认真值是1。不能使用算数运算符与null做运算,其结果都是null:
select 1 + null,1 - null, 1 * null, 1 / null, 1 % null, 1 = null, 1 <> null, 1 > null , 1 < null;
--结果都是null
- 1 or null 因为前面1为真,所以没必要往后运算了,结果就是1
- 0 or null 因为前面0为假,所以要接着往后看才能知道结果,又由于后面是null,任何表达式与null运算都是null
- 1 and null 因为前面1为真,继续往后看,后面为null, 任何数与null运算都是null
- 0 and null 因为前面0为假,and运算就没必要往后看了,所以结果是0
实战演练
掌握了上面的知识点,我们接下来进行实际操作一下,首先创建一个用来测试的表:
CREATE TABLE `test_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '姓名',
`age` int(3) DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='测试信息表';
- 造一些数据
select count(*),count(age),count(age=1),count(age = 1 or null),count(age is null),count(age is not null),count(null) from test_info;
结果如下:
结果分析:
count(*):很明显是结果集的行数
- count(age):age不为空的行数
- count(age=1):表达式age=1的值为1;而第十行age为111,所以age=1的布尔值为0,但是不管age=1的结果是0还是1,这两种结果都不是null,所以答案是15.
- count(age=1 or null):表达式age=1 or null的值为1;而第十行age为111,所以表达式age=1 or null的值为null,那么这一行在count计算的时候就不会被包括在内了,所以结果为14。
- count(age is null):age is null的结果0或者1(select age is null ;)这两种结果都不是null值,所以答案还是17
- count(age is not null):同上
- count(null):因为count统计的是expr不为null的行数,很明显答案是0