Navicat 博客

SQL Count() 函数的多种用法 2020 年 8 月 27 日,由 Robert Gravelle 撰写

如果你使用了关系数据库(RDBMS)一段时间,几乎可以肯定你已使用了 SQL COUNT() 函数。这样,你无疑已经知道 COUNT() 函数用于返回表中由 WHERE 子句中指定的条件过滤的行数或列数。它灵活的语法和广泛的支持使其成为 SQL 中最通用和有用的函数之一。在今天的文章中,我们将了解它的许多排列并学习如何获得各种计数。

一个函数,多种输入参数变化

作为 ANSI SQL 函数,COUNT() 接受通用 SQL 2003 ANSI 标准语法中的参数。话虽如此,不同的数据库供应商可能有不同的方式来应用 COUNT() 函数。MySQL、PostgreSQL 和 Microsoft SQL Server 均遵循 ANSI SQL 语法:

COUNT(*)
COUNT( [ALL|DISTINCT] expression )

同时,DB2 和 Oracle 的语法略有不同:

COUNT ({*|[DISTINCT] expression}) OVER (window_clause)

在本文中,我们将重点介绍 SQL 2003 ANSI 标准语法。以下是所有输入参数的含义:

  • ALL:顾名思义,ALL 将 COUNT 应用于所有值,以便它返回非 NULL 值的数量。
  • DISTINCT:忽略重复的值,以便 COUNT 返回唯一的非 NULL 值的数量。
  • Expression:由以下部分组成的表达式:
    • 一个常量、变量、标量函数
    • 一个列名
    • SQL 查询的一部分,该查询将值与其他值进行比较
    表达式不能包含文本或图像类型。也不允许聚合函数和子查询。
  • *:计算目标表中的所有行,无论它们是否包含 NULL。

实际示例

为了对各种语法排列及其对 COUNT 输出的影响进行采样,让我们将 COUNT() 函数应用于以下雇员表,如 Navicat for MySQL 所示:

employee_table (48K)

现在,这个查询计算了几项数据的数目:

  • 雇员总数
  • 经理人数
  • 非经理人数
  • 部门数
employee_count_query (69K)

如上面的查询所示,获得不同的计数完全与如何使用 COUNT() 函数有关。关于何时使用特定的列名而不是星号,请注意前者将不计算 Null,而后者通常将计算 Null,因为它包括所有列。至于何时使用 DISTINCT,请考虑将其用于具有重复值的列,这通常包含定义为非唯一和/或非主键的列。

总结

SQL COUNT () 函数灵活的语法和广泛的支持使其成为 SQL 中最通用和有用的函数之一。说到语法,如果你很难记住 COUNT() 函数的语法,可以让 Navicat 提醒你!它的自动完成建议列表不仅提供表名和列名,还提供存储过程和函数,包括 COUNT()。你会发现它不只一个版本,而是有两个版本:一个是简单用法,另一个是更复杂的用法:

count_function_in_suggestion_list (44K)
Navicat 文章
频道条目
分享
文章归档