在南大通用GBase 8c(gbase database)数据库的日常开发与运维中,count 函数是使用频率最高的函数之一,作用是统计表中符合查询条件的记录行数。无论是业务数据统计、接口分页查询,还是数据校验场景,几乎都离不开它。
但在实际开发中,count(*)、count(1)与 count(column_name)这三种写法常常被混用,不少开发者存在如下误区:要么认为三者是等价的,可以随意替换;要么纠结于哪种写法性能更优,反而忽视了它们的核心差异。本文结合 GBase 8c 数据库的特性,通过具体示例,详细分下下三者的相同点与区别。
- 从功能上看,三者都是用于统计记录数量,且返回结果均为 bigint 类型,这是聚合函数 count()决定的。
- 从使用场景来看,三者都可以与 where 过滤条件、group by 分组子句、having 筛选子句配合使用,实现精准的分组统计需求。比如统计某一班级的学生人数、某一时间段的订单数量,三者均可配合 where 条件实现。
- 在无 where 过滤条件、且表中指定列无 null 值的前提下,三者的统计结果一致。下面通过 gbase 环境下的示例,来说明下这一特性。
首先创建测试表并插入无 null 值的测试数据:
create table student(id int primary key, name varchar(50), age int);
insert into student values(1, 'aaa', 20), (2, 'bbb', 21), (3, 'ccc', 22);
分别执行以下三条查询语句,最终返回结果均为 3,与表中实际记录数一致:
- select count(*) from student; 直接统计所有记录行数,不区分列值。
- select count(1) from student; 用常量 1 指代每条记录,判断记录存在并计数。
- select count(id) from student;统计 id 列非空的记录数,结果与前两者一致
上面是共性,下面将介绍三者的差异,这也是日常开发中最易踩坑的地方,主要集中在 null 值处理、统计逻辑与可读性、性能表现三个方面,其中 null 值处理是最重要的区别。