SQL 中 COUNT 的用法详解

📅 发布时间:2026/7/17 0:58:22 👁️ 浏览次数:
SQL 中 COUNT 的用法详解
1.COUNT(*)统计总行数COUNT(*)是 SQL 中最常用的统计方式之一。它会统计查询结果集中所有行的数量包括NULL值。语法SELECT COUNT(*) FROM 表名;示例假设我们有一个employees表包含以下数据idnameagedepartment1John Doe30Sales2Jane SmithNULLHR3Alice Brown25NULL执行以下查询SELECT COUNT(*) FROM employees;结果3解释COUNT(*)会统计所有行不会忽略NULL值即使某些列有NULL它也会计算每一行。因此结果为3表示表中共有 3 行数据。2.COUNT(1)统计总行数COUNT(1)的作用与COUNT(*)类似也会统计表中所有的行。它是 SQL 优化中的一个小技巧某些数据库系统如 MySQL会对其进行优化处理。语法SELECT COUNT(1) FROM 表名;解释COUNT(1)和COUNT(*)的结果是相同的都会返回表中所有行的数量。数据库会将1替代成一个常量来参与计算并且不会关心每一列的具体值。优化区别在某些数据库系统如 MySQL中COUNT(1)和COUNT(*)在执行计划中的表现可能相同查询效率基本没有区别。然而某些旧版的数据库系统在处理COUNT(*)时会去解析整行数据而COUNT(1)可以直接统计行数因此会有一些微小的性能差异。3.COUNT(列名)统计特定列中非 NULL 值的数量与COUNT(*)不同COUNT(列名)只会统计指定列中非 NULL值的数量。如果某列中有NULL值COUNT(列名)会自动跳过它们。语法SELECT COUNT(列名) FROM 表名;示例SELECT COUNT(age) FROM employees;结果24.COUNT(DISTINCT 列名)统计某列中不重复的非 NULL 值的数量有时我们不仅需要统计某列中的非 NULL 值还需要统计不重复的值。在这种情况下可以使用COUNT(DISTINCT 列名)来完成这个任务。语法SELECT COUNT(DISTINCT 列名) FROM 表名;示例假设我们有以下表数据iddepartment1Sales2HR3Sales4IT查询SELECT COUNT(DISTINCT department) FROM employees;结果3解释表中有三个不重复的department值Sales,HR,IT。因此COUNT(DISTINCT department)返回 3表示有 3 个不同的部门。5.COUNT()与GROUP BY的结合COUNT()函数经常和GROUP BY子句结合使用用于统计每个分组的数量。GROUP BY按照某列对数据进行分组COUNT()则对每个分组内的行数进行统计。6.COUNT与HAVING的结合HAVING子句通常与GROUP BY一起使用用来过滤聚合结果。它可以用来限制返回的分组数量条件可以基于COUNT()等聚合函数的结果。7.COUNT与JOIN的结合在复杂的查询中COUNT()函数可以与JOIN子句一起使用统计与另一个表匹配的记录数量。示例SELECT d.department, COUNT(e.id) FROM departments d LEFT JOIN employees e ON d.id e.department_id GROUP BY d.department;解释此查询会返回每个部门中员工的数量即使某些部门没有员工也会返回该部门的记录因为使用了LEFT JOIN。使用COUNT(e.id)统计每个部门中关联的员工数量。COUNT(*)和COUNT(1)的区别区别在大多数数据库系统中COUNT(*)和COUNT(1)的性能几乎相同。COUNT(*)会统计表中所有行而不关心列内容而COUNT(1)则是将1作为一个固定值用于统计。在某些数据库系统中COUNT(1)被认为稍微高效一点因为它不需要解析所有列只是使用常量1来计数。结论 现代数据库如 MySQL会对COUNT(*)和COUNT(1)做优化处理因此二者的性能差异几乎可以忽略。选择哪种方式可以根据个人习惯或项目规范。总结COUNT(*)统计表中所有行包括NULL值。COUNT(1)与COUNT(*)类似统计所有行。COUNT(列名)统计某列中非NULL值的数量。COUNT(DISTINCT 列名)统计某列中不重复的非NULL值。COUNT可与GROUP BY和HAVING等子句结合进行复杂的分组统计和条件过滤。COUNT(*)和COUNT(1)在大多数数据库中性能相同可以按习惯使用。