要使用COUNT(*)
,必须对指定的表具有表级别的SELECT
权限。
要使用COUNT(column-name)
,必须对指定的列具有列级的SELECT
权限,或者对指定的表具有表级的SELECT
权限。
可以通过调用%CHECKPRIV
命令来确定当前用户是否具有SELECT
权限。
可以通过调用$SYSTEM.SQL.Security.CheckPrivilege()
方法来确定指定的用户是否具有表级SELECT
权限。
为了获得最优的COUNT
性能,你应该按照以下方式定义索引:
COUNT(*)
,如果需要,定义位图扩展索引。COUNT(fieldname)
,为指定字段定义一个位片索引。COUNT(fieldname)
自动应用默认的排序规则到fieldname
。与所有聚合函数一样,COUNT
总是返回数据的当前状态,包括未提交的更改,而不管当前事务的隔离级别如何,如下所示:
COUNT
插入和更新的记录的计数,即使这些更改尚未提交并可能回滚。COUNT
不计算已删除的记录,即使这些删除还没有提交并且可以回滚。下面的示例返回Sample.Person
中的总行数:
SELECT COUNT(*) AS TotalPersons FROM Sample.Person
下面的示例返回Sample.Person
中的姓名、配偶和最喜欢的颜色的计数。这些计数不同,因为有些配偶和FavoriteColors
字段为NULL
;Count
不计算NULL
:
SELECT COUNT(Name) AS People, COUNT(Spouse) AS PeopleWithSpouses, COUNT(FavoriteColors) AS PeopleWithColorPref FROM Sample.Person
下面的示例返回三个值:总行数、FavoriteColors
字段中的非空值总数和FavoriteColors
字段中不同的非空值的总数:
SELECT COUNT(*) As TotalPersons, COUNT(FavoriteColors) AS WithColorPref, COUNT(DISTINCT FavoriteColors) AS ColorPrefs FROM Sample.Person
下面的示例使用Count DISTINCT
返回Sample.Person
中不同FavoriteColors
值的计数。(FavoriteColors
包含多个数据值和多个Null
。)。此示例还使用DISTINCT
子句为每个不同的FavoriteColors
值返回一行。行计数比COUNT(DISTINCT FavoriteColors)
计数大1,因为DISTINCT
返回单个NULL
的行作为DISTINCT
值,但COUNT DISTINCT
不计算NULL
。COUNT(DISTINCT BY(FavoriteColors)%ID)
值与行计数相同,因为BY
子句将单个NULL
计数为DISTINCT
值:
SELECT DISTINCT FavoriteColors, COUNT(DISTINCT FavoriteColors) AS DistColors, COUNT(DISTINCT BY(FavoriteColors) %ID) AS DistColorPeople FROM Sample.Person
下面的例子使用GROUP BY
为每个FavoriteColors
值返回一行,包括一行NULL
。与每行关联的是两个计数。第一个用FavoriteColors选
项计算数字或记录;不计算空记录。第二个计算与每个favoritecor
选择关联的名称数量;由于Name
不包含空值,因此可以使用空值来计算有利颜色的数量:
SELECT FavoriteColors, COUNT(FavoriteColors) AS ColorPreference, COUNT(Name) AS People FROM Sample.Person GROUP BY FavoriteColors
以下示例返回Sample.Person
中每个Home_State
值的Person
记录计数:
SELECT Home_State, COUNT(*) AS AllPersons FROM Sample.Person GROUP BY Home_State
以下示例使用%AFTERHAVING
返回至少有一个人超过65
岁的每个州的个人记录计数和超过65
人的人数计数:
SELECT Home_State, COUNT(Name) AS AllPersons, COUNT(Name %AFTERHAVING) AS Seniors FROM Sample.Person GROUP BY Home_State HAVING Age > 65 ORDER BY Home_State
以下示例同时使用%FOREACH
和%AFTERHAVING
关键字。它为姓名以“A”
、“M”
或“W”
(HAVING
子句和GROUP BY
子句)开头的人员所在的州返回一行。每个状态行包含下列值:
Count(Name)
:数据库中所有人员的计数。(此数字对于所有行都是相同的。)COUNT(Name %FOREACH(Home_State))
:该州所有人的计数。COUNT(Name %AFTERHAVING)
:数据库中符合HAVING
子句条件的所有人员的计数。(此数字对于所有行都是相同的。)COUNT(Name %FOREACH(Home_State) %AFTERHAVING)
: 该州符合HAVING子句标准的所有人员的计数。SELECT Home_State, COUNT(Name) AS NameCount, COUNT(Name %FOREACH(Home_State)) AS StateNameCount, COUNT(Name %AFTERHAVING) AS NameCountHaving, COUNT(Name %FOREACH(Home_State) %AFTERHAVING) AS StateNameCountHaving FROM Sample.Person GROUP BY Home_State HAVING Name LIKE 'A%' OR Name LIKE 'M%' OR Name LIKE 'W%' ORDER BY Home_State
下面的示例显示具有串联表达式的Count
。它使用连接运算符(||
)返回FavoriteColors
字段中非空值的总数,以及FavoriteColors
中与其他两个字段连接的非空值的总数:
SELECT COUNT(FavoriteColors) AS Color, COUNT(FavoriteColors||Home_State) AS ColorState, COUNT(FavoriteColors||Spouse) AS ColorSpouse FROM Sample.Person
当两个字段连接在一起时,COUNT
只计算其中两个字段都没有空值的那些行。因为Sample.Person
中的每一行都有一个非空的Home_State
值,所以串联FavoriteColors||Home_State
返回与FavoriteColors
相同的计数。由于Sample.Person
中的某些行的配偶值为NULL
,因此串联FavoriteColors||SPOSPORT
将返回FavoriteColors
和配偶的值均为非NULL
值的行数。