T-SQL中常用函数(1)—聚合函数

时间:2022-06-10 11:34:45
  1. AVG:返回平均值,后面可能跟随 OVER 子句。
    • 语法:AVG ( [ ALL | DISTINCT ] expression ) ; all 对所有的值进行聚合函数运算。ALL 是默认值。DISTINCT
    • 指定 AVG 只在每个值的唯一实例上执行,而不管该值出现了多少次。expression

      是精确数值或近似数值数据类别(bit 数据类型除外)的表达式。不允许使用聚合函数和子查询。

      示例:

      计算 Adventure Works Cycles 的副总所用的平均休假小时数以及总的病假小时数。对检索到的所有行,每个聚合函数都生成一个单独的汇总值。

    USE AdventureWorks;
    GO
    SELECT AVG(VacationHours)as 'Average vacation hours',
    SUM (SickLeaveHours) as 'Total sick leave hours'
    FROM HumanResources.Employee
    WHERE Title LIKE 'Vice President%';

    当与 GROUP BY 子句一起使用时,每个聚合函数都针对每一组生成一个值,而不是针对整个表生成一个值。以下示例针对每个销售地区生成汇总值。汇总中列出每个地区的销售人员得到的平均奖金以及每个地区的本年度销售总额。

    USE AdventureWorks;
    GO
    SELECT TerritoryID, AVG(Bonus)as 'Average bonus', SUM(SalesYTD) 'YTD sales'
    FROM Sales.SalesPerson
    GROUP BY TerritoryID;
    GO
     
    • CHECKSUM:返回按照表的某一行或一组表达式计算出来的校验和值
      • 语法:CHECKSUM ( * | expression[ ,...n ] ) * 指定对表的所有列进行计算。如果有任一列是非可比数据类型,则 CHECKSUM 返回错误。非可比数据类型有 text、ntext、image、XML 和 cursor,还包括以上述任一类型作为基类型的 sql_variant 。 expression  除非可比数据类型之外的任何类型的表达式。
      • CHECKSUM 对其参数列表计算一个称为校验和的哈希值。此哈希值用于生成哈希索引。如果 CHECKSUM 的参数为列,并且对计算的 CHECKSUM 值生成索引,则结果是一个哈希索引。它可用于对列进行等价搜索。CHECKSUM 满足哈希函数的下列属性:在使用等于 (=) 运算符比较时,如果两个列表的相应元素具有相同类型且相等,则在任何两个表达式列表上应用的 CHECKSUM 将返回同一值。对于该定义,指定类型的 Null 值被作为相等进行比较。如果表达式列表中的某个值发生更改,则列表的校验和通常也会更改。但只在极少数情况下,校验和会保持不变。因此,我们不推荐使用 CHECKSUM 来检测值是否更改,除非应用程序可以容忍偶尔丢失更改。请考虑改用 HashBytes。指定 MD5 哈希算法时,HashBytes 为两个不同输入返回相同结果的可能性比 CHECKSUM 小得多。
      • 示例:使用 CHECKSUM 生成哈希索引。通过将计算校验和列添加到索引的表中,然后对校验和列生成索引来生成哈希索引。
      -- Create a checksum index.
      SET ARITHABORT ON;
      USE AdventureWorks;
      GO
      ALTER TABLE Production.Product
      ADD cs_Pname AS CHECKSUM(Name);
      GO
      CREATE INDEX Pname_index ON Production.Product (cs_Pname);
      GO

      校验和索引可用作哈希索引,尤其是当要索引的列为较长的字符列时可以提高索引速度。校验和索引可用于等价搜索。

      /*Use the index in a SELECT query. Add a second search 
      condition to catch stray cases where checksums match,
      but the values are not the same.*/
      SELECT *
      FROM Production.Product
      WHERE CHECKSUM(N'Bearing Ball') = cs_Pname
      AND Name = N'Bearing Ball';
      GO

      对计算列创建索引将具体化为校验和列,对 ProductName 值所做的任何更改都将传播到校验和列。也可以直接对索引的列生成索引。然而,如果键值较长,则很可能不执行校验和索引甚至常规索引。

       

         
         
      • CHECKSUM_AGG:返回组中各值的校验和。空值将被忽略
        • 语法与CHECKSUM一致。
        • CHECKSUM_AGG 可用于检测表中的更改。表中行的顺序不影响 CHECKSUM_AGG 的结果。此外,CHECKSUM_AGG 函数还可与 DISTINCT 关键字和 GROUP BY 子句一起使用。如果表达式列表中的某个值发生更改,则列表的校验和通常也会更改。但只在极少数情况下,校验值会保持不变。
        • 示例:使用 CHECKSUM_AGG 检测 AdventureWorks 数据库中 ProductInventory 表的 Quantity 列中的更改。
        --Get the checksum value before the column value is changed.
        USE AdventureWorks;
        GO
        SELECT CHECKSUM_AGG(CAST(Quantity AS int))
        FROM Production.ProductInventory;
        GOUPDATE Production.ProductInventory
        SET Quantity=125
        WHERE Quantity=100;
        GO
        --Get the checksum of the modified column.
        SELECT CHECKSUM_AGG(CAST(Quantity AS int))
        FROM Production.ProductInventory;
      • COUNT:返回组中的项数
        • 语法:COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )ALL 对所有的值进行聚合函数运算。ALL 是默认值。 DISTINCT
        • 指定 COUNT 返回唯一非空值的数量。 expression textimagentext 以外任何类型的表达式。不允许使用聚合函数和子查询。

          指定应该计算所有行以返回表中行的总数。COUNT(*) 不需要任何参数,而且不能与 DISTINCT 一起使用。COUNT(*) 不需要 expression 参数,因为根据定义,该函数不使用有关任何特定列的信息。COUNT(*) 返回指定表中行数而不删除副本。它对各行分别计数。包括包含空值的行。

          示例:列出了在 Adventure Works Cycles 工作的雇员可以拥有的不同标题的数量。

        USE AdventureWorks;
        GO
        SELECT COUNT(DISTINCT Title)
        FROM HumanResources.Employee;
        GO计算 Adventure Works Cycles 的雇员总数。USE AdventureWorks;
        GO
        SELECT COUNT(*)
        FROM HumanResources.Employee;
        GOUSE AdventureWorks;
        GO
        SELECT COUNT(*), AVG(Bonus)
        FROM Sales.SalesPerson
        WHERE SalesQuota > 25000;
        GO
         
          • COUNT_BIG:返回组中的项数。用户与Count函数类是。Count_big返回bigint数据类型值。Count返回int数据类型值。
            • 返回组中的项数。COUNT 与 COUNT_BIG 函数类似。两个函数唯一的差别是它们的返回值。COUNT 始终返回 int 数据类型值。COUNT_BIG 始终返回 bigint 数据类型值。后面可以跟 OVER 子句。
          • MAX:返回表达式的最大值
            • 语法:MAX ( [ ALL | DISTINCT ] expression) 
            • 示例:返回最高(最大)税率
            USE AdventureWorks;
            GO
            SELECT MAX(TaxRate)
            FROM Sales.SalesTaxRate;
            GO
          • MIN:返回表达式的最小值
          • SUM:返回表达式中所有值的和或仅非重复值的和。Sum只能用于数字列。空值将为忽略。
            • 语法:SUM ( [ ALL | DISTINCT ] expression)
            • 示例:显示了聚合函数与行聚合函数之间的区别。第一个示例显示了只提供汇总数据的聚合函数,第二个示例显示了提供详尽数据和汇总数据的行聚合函数。
            USE AdventureWorks;
            GO
            SELECT Color, SUM(ListPrice), SUM(StandardCost)
            FROM Production.Product
            WHERE Color IS NOT NULL
            AND ListPrice != 0.00
            AND Name LIKE 'Mountain%'
            GROUP BY Color
            ORDER BY Color;
            GO
            USE AdventureWorks;
            GO
            SELECT Color, ListPrice, StandardCost
            FROM Production.Product
            WHERE Color IS NOT NULL
            AND ListPrice != 0.00
            AND Name LIKE 'Mountain%'
            ORDER BY Color
            COMPUTE SUM(ListPrice), SUM(StandardCost) BY Color;
            GO
            针对 Product 表中列出的每种颜色计算 ListPriceStandardCost 的和。
            USE AdventureWorks;
            GO
            SELECT Color, SUM(ListPrice), SUM(StandardCost)
            FROM Production.Product
            GROUP BY Color
            ORDER BY Color;
            GO