SQL 中 COUNT 的用法详解

打印 上一主题 下一主题

主题 892|帖子 892|积分 2676



1. COUNT(*):统计总行数

COUNT(*) 是 SQL 中最常用的统计方式之一。它会统计查询结果集中全部行的数量(包罗 NULL 值)。
语法:
  1. SELECT COUNT(*) FROM 表名;
复制代码
示例: 假设我们有一个 employees 表,包罗以下数据:
idnameagedepartment1John Doe3




0Sales2


Jane SmithNULLHR3




Alice Brown2


5NULL
执行以下查询:
  1. SELECT COUNT(*) FROM employees;
复制代码
结果:
  1. 3
复制代码
解释: COUNT(*) 会统计全部行,不会忽略 NULL 值,即使某些列有 NULL,它也管帐算每一行。因此,结果为 3




,表现表中共有 3




行数据。
2


. COUNT(1):统计总行数


COUNT(1) 的作用与 COUNT(*) 类似,也会统计表中全部的行。它是 SQL 优化中的一个小本领,某些数据库体系(如 MySQL)会对其进行优化处置惩罚。
语法:
  1. SELECT COUNT(1) FROM 表名;
复制代码
 
解释: COUNT(1) 和 COUNT(*) 的结果是相同的,都会返回表中全部行的数量。数据库会将 1 替代成一个常量来到场计算,并且不会关心每一列的详细值。
优化区别: 在某些数据库体系(如 MySQL)中,COUNT(1) 和 COUNT(*) 在执行计划中的表现可能相同,查询效率根本没有区别。然而,某些旧版的数据库体系在处置惩罚 COUNT(*) 时,会去解析整行数据,而 COUNT(1) 可以直接统计行数,因此会有一些微小的性能差异。
3




. COUNT(列名):统计特定列中非 NULL 值的数量


与 COUNT(*) 不同,COUNT(列名) 只会统计指定列中非 NULL 值的数量。如果某列中有 NULL 值,COUNT(列名) 会自动跳过它们。
语法:
  1. SELECT COUNT(列名) FROM 表名;
复制代码
 示例:
  1. SELECT COUNT(age) FROM employees;
复制代码
结果
  1. 2
复制代码
4. COUNT(DISTINCT 列名):统计某列中不重复的非 NULL 值的数量

有时,我们不仅需要统计某列中的非 NULL 值,还需要统计不重复的值。在这种情况下,可以使用 COUNT(DISTINCT 列名) 来完成这个使命。
语法:
  1. SELECT COUNT(DISTINCT 列名) FROM 表名;
复制代码
示例: 假设我们有以下表数据:
iddepartment1Sales2


HR3




Sales4IT  查询:
  1. SELECT COUNT(DISTINCT department) FROM employees;
复制代码
结果: 
  1. 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 子句一起使用,统计与另一个表匹配的纪录数量。
示例:
  1. SELECT d.department, COUNT(e.id)
  2. FROM departments d
  3. LEFT JOIN employees e ON d.id = e.department_id
  4. 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) 在大多数数据库中性能相同,可以按风俗使用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao12


3




.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表