MySQL的count()

前言:

这里不讲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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值