SQL COUNT函数是数据库查询中用于统计行数的核心聚合函数,支持多种使用方式,能够满足不同场景下的行数统计需求,无论是统计整张表的总行数,还是统计符合特定条件的行数,都可以通过COUNT函数实现。

COUNT函数的基本语法
COUNT函数的基本语法格式如下,其中expression可以是列名、*或者具体的表达式:
-- 基本语法 COUNT(expression)
COUNT函数的常见用法
1. 统计表的总行数
使用COUNT(*)可以统计表中的所有行,包括值为NULL的行,这是统计总行数最常用的方式:
-- 统计users表的总行数 SELECT COUNT(*) AS total_rows FROM users;
2. 统计指定列的非空行数
如果使用列名作为参数,COUNT函数只会统计该列值不为NULL的行,忽略值为NULL的行:
-- 统计users表中email列不为空的行数 SELECT COUNT(email) AS valid_email_count FROM users;
3. 统计去重后的行数
结合DISTINCT关键字,可以统计指定列去重后的行数,适合需要统计唯一值数量的场景:
-- 统计users表中不同的城市数量 SELECT COUNT(DISTINCT city) AS city_count FROM users;
4. 结合条件统计行数
可以在COUNT函数中结合CASE WHEN表达式,实现按条件统计行数的需求:
-- 统计users表中年龄大于18岁的用户数量 SELECT COUNT(CASE WHEN age > 18 THEN 1 END) AS adult_count FROM users;
COUNT(*)和COUNT(1)的区别
很多用户会疑惑COUNT(*)和COUNT(1)的差异,实际上两者在统计结果上没有区别,都会统计所有行:
COUNT(*)是SQL标准定义的统计所有行的方式,大部分数据库会对它做专门的优化COUNT(1)会给每一行添加一个常量1,然后统计这个常量的数量,结果和COUNT(*)一致
两者的执行效率在不同数据库中差异很小,实际使用时选择COUNT(*)更符合标准规范。
使用COUNT函数的注意事项
- COUNT函数属于聚合函数,和
GROUP BY子句结合使用时,会按照分组统计每个组的行数 - 如果没有使用
GROUP BY,COUNT函数会将整个查询结果集作为一组进行统计 - 统计大表的总行数时,不同数据库有不同的优化方式,比如MySQL的InnoDB引擎下COUNT(*)会遍历最小的索引树,MyISAM引擎则会直接存储总行数
以下是一个结合GROUP BY使用COUNT函数的示例,统计每个城市的用户数量:
-- 按城市分组统计用户数量 SELECT city, COUNT(*) AS user_count FROM users GROUP BY city;