美文网首页
第三章 SQL聚合函数 COUNT(一)

第三章 SQL聚合函数 COUNT(一)

作者: Cache技术分享 | 来源:发表于2021-12-24 08:56 被阅读0次

    第三章 SQL聚合函数 COUNT(一)

    返回表或指定列中的行数的聚合函数。

    大纲

    COUNT(*)
    
    COUNT([ALL | DISTINCT [BY(col-list)]] expression [%FOREACH(col-list)] [%AFTERHAVING])
    

    参数

    • * - 指定应计算所有行以返回指定表中的总行数。
      COUNT(*)不接受其他参数,不能与ALLDISTINCT关键字一起使用。
      COUNT(*)不接受表达式参数,也不使用任何特定列的信息。
      COUNT(*)返回指定表或视图中的行数,但不消除重复项。
      它分别计数每一行,包括包含NULL值的行。
    • ALL - 可选-指定COUNT返回表达式中所有值的计数。
      如果没有指定关键字,这是默认值。
    • DISTINCT - 可选-一个DISTINCT子句,指定COUNT返回表达式的不同(唯一)值的计数。
      不能与流字段一起使用。
      DISTINCT可以指定BY(colo -list)子句,其中colo -list可以是单个列名,也可以是用逗号分隔的列名列表。
    • expression - 任何有效的表达式。
      通常是包含要计算的数据值的列的名称。
    • %FOREACH(col-list) - 可选-列名或以逗号分隔的列名列表。
    • %AFTERHAVING - 可选-应用在HAVING子句中的条件。

    COUNT返回BIGINT数据类型。

    描述

    COUNT聚合函数有两种形式:

    • COUNT(expression)以整数形式返回表达式中值的数目的计数。
      通常,表达式是查询返回的多行中字段的名称(或包含一个或多个字段名称的表达式)。
      COUNT(表达式)不计算NULL值。
      它可以选择计数或不计数重复的字段值。
      COUNT总是返回数据类型BIGINT, xDBC长度为8,精度为19,刻度为0
    • COUNT(*)以整数形式返回表中行数的计数。
      COUNT(*)计数所有行,无论是否存在重复的字段值或NULL值。

    COUNT可以在引用表或视图的SELECT查询或子查询中使用。
    COUNT可以在SELECT列表或HAVING子句中与普通字段值一起出现。

    COUNT不能用于WHERE子句。
    COUNT不能在JOINON子句中使用,除非SELECT是子查询。

    与所有聚合函数一样,COUNT(expression)可以接受一个可选的DISTINCT子句。
    DISTINCT子句只计算那些具有不同(唯一)值的列。
    什么是一个不同的值取决于字段的排序;
    当字段具有默认的排序规则%SQLUPPER时,字母大小写不同的值将不作为不同的值计算。
    要将每个字母大小写变量作为一个不同的值进行计数,请使用count (distinct (%EXACT(field)))
    COUNT DISTINCT不将NULL视为一个不同的值。
    COUNT(DISTINCT BY(col2) col1)计数不同的col2值的col1值;
    但是,不同的col2值可以包含一个NULL作为不同的值。

    ALL关键字统计所有非null值,包括所有重复值。
    如果没有指定关键字,ALL是默认行为。

    没有行返回

    如果没有选择行,COUNT返回0NULL,这取决于查询:

    • 如果除了提供给聚合函数的字段之外,选择列表不包含对FROM子句表中的字段的任何引用,那么COUNT返回0
      只有COUNT聚合函数返回0;
      其他聚合函数返回NULL
      该查询返回%ROWCOUNT1
      如下示例所示:
    ClassMethod Count()
    {
        s myquery = 3
        s myquery(1) = "SELECT COUNT(*) AS Recs,COUNT(Name) AS People,"
        s myquery(2) = "AVG(Age) AS AvgAge,MAX(Age) AS MaxAge,CURRENT_TIMESTAMP AS Now"
        s myquery(3) = " FROM Sample.Employee WHERE Name %STARTSWITH 'ZZZ'"
        s tStatement = ##class(%SQL.Statement).%New()
        s qStatus = tStatement.%Prepare(.myquery)
        if qStatus'=1 {
            w "%Prepare failed:" 
            d $System.Status.DisplayError(qStatus) 
            q
        }
        s rset = tStatement.%Execute()
        d rset.%Display()
        w !,"Rowcount:",rset.%ROWCOUNT
    }
    
    DHC-APP> d ##class(PHA.TEST.SQLCommand).Count()
    Recs    People  AvgAge  MaxAge  Now
    0       0                       2021-12-20 20:58:17
     
    1 Rows(s) Affected
    Rowcount:1
    
    • 如果select-list包含对FROM子句表中某个字段的任何直接引用,或者如果指定了TOP 0,那么COUNT返回NULL
      该查询返回%ROWCOUNT0
      以下示例不返回COUNT值,因为%ROWCOUNT值为0:
    ClassMethod Count1()
    {
        s myquery = 2
        s myquery(1) = "SELECT COUNT(*) AS Recs,COUNT(Name) AS People,$LENGTH(Name) AS NameLen"
        s myquery(2) = " FROM Sample.Employee WHERE Name %STARTSWITH 'ZZZ'"
        s tStatement = ##class(%SQL.Statement).%New()
        s qStatus = tStatement.%Prepare(.myquery)
        if qStatus'=1 {
            w "%Prepare failed:" 
            d $System.Status.DisplayError(qStatus) 
            q
        }
        s rset = tStatement.%Execute()
        d rset.%Display()
        w !,"Rowcount:",rset.%ROWCOUNT
    }
    
    DHC-APP> d ##class(PHA.TEST.SQLCommand).Count1()
    Recs    People  NameLen
     
    0 Rows(s) Affected
    Rowcount:0
    
    • 如果没有指定表,COUNT(*)返回1。
      该查询返回%ROWCOUNT为1。
      如下示例所示:
    ClassMethod Count2()
    {
        s myquery = "SELECT COUNT(*) AS Recs"
        s tStatement = ##class(%SQL.Statement).%New()
        s qStatus = tStatement.%Prepare(myquery)
        if qStatus'=1 {
            w "%Prepare failed:" 
            d $System.Status.DisplayError(qStatus) 
            q
        }
        s rset = tStatement.%Execute()
        d rset.%Display()
        w !,"Rowcount:",rset.%ROWCOUNT
    }
    
    
    DHC-APP> d ##class(PHA.TEST.SQLCommand).Count2()
    Recs
    1
     
    1 Rows(s) Affected
    Rowcount:1
    

    流字段

    可以使用COUNT(表达式)来计数流字段值,但有一些限制。
    COUNT(streamfield)计算所有非null值。
    它不会检查重复的值。

    expression是一个流字段时,不能指定COUNT函数的DISTINCT关键字。
    试图在流字段中使用DISTINCT关键字会导致SQLCODE -37错误。

    不能在%FOREACH冒号列表中指定流字段。
    尝试这样做会导致SQLCODE -37错误。

    下面的例子显示了COUNT函数的有效使用,其中Title是字符串字段,NotesPicture是流字段:

    SELECT DISTINCT Title,COUNT(Notes),COUNT(Picture %FOREACH(Title))
    FROM Sample.Employee
    
    image.png

    Title为字符串字段,NotesPicture为流字段时,以下示例无效:

    -- Invalid: DISTINCT keyword with stream field
    SELECT Title,COUNT(DISTINCT Notes) FROM Sample.Employee
    
    -- Invalid: %FOREACH col-list contains stream field
    SELECT Title,COUNT(Notes %FOREACH(Picture))
    FROM Sample.Employee
    

    相关文章

      网友评论

          本文标题:第三章 SQL聚合函数 COUNT(一)

          本文链接:https://www.haomeiwen.com/subject/lshlqrtx.html