聚合函数

与大多数其他关系数据库产品一样,PolarDB PostgreSQL版(兼容Oracle)也支持聚合函数。聚合函数从多个输入行计算单个结果。例如,有一些聚合可对一组行计算COUNT、SUM、AVG(平均值)、MAX(最大值)和MIN(最小值)。

示例

以下示例均在示例数据库基础上进行查询。

  • 通过以下查询找到最高和最低工资:

    SELECT MAX(sal) highest_salary, MIN(sal) lowest_salary FROM emp;

    返回结果如下:

     highest_salary | lowest_salary 
    ----------------+---------------
               5000 |           800
    (1 row)
  • 通过以下查询找到工资最高的员工:

    SELECT ename FROM emp WHERE sal = MAX(sal);

    返回结果如下:

    ERROR:  aggregate functions are not allowed in WHERE

    以上查询无效,因为聚合函数MAX不能在WHERE子句中使用。存在此限制的原因是,WHERE子句确定将进入聚合状态的行,因此必须在计算聚合函数之前对该子句进行求值。但是,可通过使用子查询来重新表述该查询以达到预期结果:

    SELECT ename FROM emp WHERE sal = (SELECT MAX(sal) FROM emp);

    返回结果如下:

     ename 
    -------
     KING
    (1 row)
  • 子查询是一项独立的计算,它获取自己的结果,与外部查询互不影响。

    • 与GROUP BY子句结合使用。例如,通过以下查询获取每个部门中的最高工资。

      SELECT deptno, MAX(sal) FROM emp GROUP BY deptno;

      返回结果如下:

       deptno |   max
      --------+---------
           10 | 5000.00
           20 | 3000.00
           30 | 2850.00
      (3 rows)
    • 与WHERE与HAVING子句结合使用。

      • 使用HAVING子句筛选这些分组行为每个部门生成一个输出行。每个聚合结果都是针对与该部门匹配的行计算的。

        SELECT deptno, MAX(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > 2000;

        返回结果如下,仅为平均工资高于2000的那些部门给出相同的结果:

         deptno |   max
        --------+---------
             10 | 5000.00
             20 | 3000.00
        (2 rows)
      • 使用WHERE子句,查询每个部门中职位为分析师且工资最高的员工。

        SELECT deptno, MAX(sal) FROM emp WHERE job = 'ANALYST' GROUP BY deptno HAVING AVG(sal) > 2000;

        返回结果如下:

         deptno |   max
        --------+---------
             20 | 3000.00
        (1 row)

        WHERE与HAVING子句之间存在一个细微的区别。WHERE子句在执行分组和应用聚合函数之前对行进行筛选。HAVING子句在对行进行分组并为每个组计算聚合函数后对结果应用筛选条件。

        因此,在此示例中,仅考虑职位为分析师的员工。在该子集中,员工根据部门进行分组,最终结果仅包括那些组中分析师的平均工资高于2000的组。这一情况仅适用于部门20,且部门20中的分析师最高工资为3000.00。