在使用Mysql的时候,作为开发者,聚合函数是肯定会用到的,下面就来说说我们常用到的统计行数的聚合函数 COUNT()。
COUNT() 的几种用法
说到COUNT() 函数,最常用的几种方法就是 COUNT(*) 、COUNT(1)、 COUNT(column),那么关于这几种 COUNT() 函数的不同之处这里就来详细说说,这里提前准备一个表并填充部分数据,比如
SELECT * FROM sys_post;
COUNT(*)
统计表中满足条件的所有的数据行数,包括 NULL 和重复项,比如
SELECT COUNT(*) FROM sys_post;
COUNT(1)
COUNT(1) 和 COUNT(*) 差不多,统计表中满足条件的所有数据行数,包括 NULL和重复项,比如
SELECT COUNT(1) FROM sys_post;
COUNT(column)
COUNT(column) 统计列名会统计满足条件的所有数据行数,不包括指定列名为 NULL的数据,比如
SELECT COUNT(create_by) FROM sys_post;
COUNT(*) 与 GROUP BY
这里统计不同 create_by 的数据行数,比如
SELECT create_by,COUNT(*) FROM sys_post GROUP BY create_by;
COUNT(*) 与 GROUP BY 和 HAVING
这类统计不同create_by 的数据行数,并筛选出 COUNT(*) > 1 的数据,比如
SELECT create_by,COUNT(*) FROM sys_post GROUP BY create_by HAVING COUNT(*)>1;
COUNT(expr) 的用法
COUNT(expr) 表示COUNT 统计带条件的指定列的数据
COUNT(DISTINCT expr)
统计指定字段去重后的数据行数,这里不会统计该字段为 NULL 的数据,同时对于该字段相同数值只统计一次,比如
SELECT COUNT(DISTINCT post_sort) FROM sys_post;
由于原始数据中有两个 post_port = 1 的数据,因此去重统计时会只统计一次。另外就是 COUNT(DISTINCT post_sort) 不会统计该列值为 NULL 的数据,比如这里去重统计 create_by
SELECT COUNT(DISTINCT create_by) FROM sys_post;
这是因为表中数据 create_by 只有 admin 和 NULL 两种数据,不统计 NULL 数据,去重后就只剩下数字 1 了。
COUNT(expr) 带条件查询
这里有一个场景,就是需要统计 create_by 不是 admin ,那么就需要用到 COUNT(expr) 中的条件了,首先给表 sys_post 增加两条数据,增加数据后如下
统计 create_by 不是 admin 的数据行数,如下
SELECT COUNT(if(create_by != 'admin',1,null)) FROM sys_post;
这里实际就是 COUNT(create_by) ,那么指定列字段的统计,不会计算 NULL 的数据,根据条件 create_by != 'admin' 计算得出就是只有 create_by 是 cc 、dd的两条数据了。
上面的查询语句也可以这样更改
SELECT COUNT(CASE WHEN create_by != 'admin' THEN 1 END) FROM sys_post;
查询结果是一样的效果
写在最后
以上就是Mysql 统计数据时常用到的 COUNT() 函数的几种场景,大家有需要的可以参考。