第四章 SQL聚合函数 COUNT(二)

第四章 SQL聚合函数 COUNT(二)

权限

要使用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
image.png

下面的示例返回Sample.Person中的姓名、配偶和最喜欢的颜色的计数。这些计数不同,因为有些配偶和FavoriteColors字段为NULLCount不计算NULL

SELECT COUNT(Name) AS People,
       COUNT(Spouse) AS PeopleWithSpouses,
       COUNT(FavoriteColors) AS PeopleWithColorPref
FROM Sample.Person
image.png

下面的示例返回三个值:总行数、FavoriteColors字段中的非空值总数和FavoriteColors字段中不同的非空值的总数:

SELECT COUNT(*) As TotalPersons,
       COUNT(FavoriteColors) AS WithColorPref,
       COUNT(DISTINCT FavoriteColors) AS ColorPrefs
       FROM Sample.Person
image.png

下面的示例使用Count DISTINCT返回Sample.Person中不同FavoriteColors值的计数。(FavoriteColors包含多个数据值和多个Null。)。此示例还使用DISTINCT子句为每个不同的FavoriteColors值返回一行。行计数比COUNT(DISTINCT FavoriteColors)计数大1,因为DISTINCT返回单个NULL的行作为DISTINCT值,但COUNT DISTINCT不计算NULLCOUNT(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
image.png

下面的例子使用GROUP BY为每个FavoriteColors值返回一行,包括一行NULL。与每行关联的是两个计数。第一个用FavoriteColors选项计算数字或记录;不计算空记录。第二个计算与每个favoritecor选择关联的名称数量;由于Name不包含空值,因此可以使用空值来计算有利颜色的数量:

SELECT FavoriteColors,
       COUNT(FavoriteColors) AS ColorPreference,
       COUNT(Name) AS People
       FROM Sample.Person
       GROUP BY FavoriteColors
image.png

以下示例返回Sample.Person中每个Home_State值的Person记录计数:

SELECT Home_State, COUNT(*) AS AllPersons
     FROM Sample.Person
     GROUP BY Home_State
image.png

以下示例使用%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
image.png

以下示例同时使用%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
image.png

下面的示例显示具有串联表达式的Count。它使用连接运算符(||)返回FavoriteColors字段中非空值的总数,以及FavoriteColors中与其他两个字段连接的非空值的总数:

image.png
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值的行数。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容