更新时间:2025-09-11 GMT+08:00
分享

聚合函数

聚合函数对一组值进行计算,并返回单个的值。除了COUNT(*)外,聚合函数都会忽略NULL值。聚合函数通常与GOURP BY子句同时使用。

AVG

AVG([ALL | DISTINCT] expr)

描述:返回输入expr的平均值,NULL值将被忽略。

参数类型:可以是TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、DECIMAL、FLOAT、DOUBLE。

返回值类型:

  • 返回值类型视入参数据类型而定。当入参为精确值(INT、DECIMAL)时,返回DECIMAL;当入参为近似值(FLOAT、DOUBLE)时返回DOUBLE类型。
  • 如果expr中的值均为NULL,则AVG()返回NULL。
  • 如果指定ALL或者不指定ALL与DISTINCT,则返回expr中所有非空值的平均值。
  • 如果指定DISTINCT,则返回expr中不同值的平均值。

示例:

m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age);
CREATE TABLE

m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL);
INSERT 0 6

m_db=# SELECT * FROM m_test;
 age | salary 
-----+--------
   1 |       
   1 |      1
   1 |      2
   1 |      2
   2 |       
   2 |       
(6 rows)

m_db=# SELECT age, AVG(salary) FROM m_test GROUP BY (age);
 age |  avg   
-----+--------
   1 | 1.6667
   2 |       
(2 rows)

m_db=# SELECT age, AVG(DISTINCT salary) FROM m_test GROUP BY (age);
 age |  avg   
-----+--------
   1 | 1.5000
   2 |       
(2 rows)

m_db=# DROP TABLE m_test;
DROP TABLE

BIT_AND

BIT_AND([ALL] expr)

描述:返回expr中所有值的按位与,NULL值将被忽略。

参数类型:BIT_AND需要使用BIGINT作为参数,其他类型的参数会被转换为BIGINT,并且可能发生截断。

返回值类型:

  • 返回值类型为BIGINT。
  • 如果expr中的值均为NULL,则BIT_AND()返回一个中性值(所有位都被设置为1)。
  • ALL为可选项,不影响结果。

示例:

m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age);
CREATE TABLE

m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL);
INSERT 0 6

m_db=# SELECT * FROM m_test;
 age | salary 
-----+--------
   1 |       
   1 |      1
   1 |      2
   1 |      2
   2 |       
   2 |       
(6 rows)

m_db=# SELECT BIT_AND(ALL salary) FROM m_test GROUP BY age;
       bit_and
----------------------
 18446744073709551615
 0
(2 rows)

m_db=# DROP TABLE m_test;
DROP TABLE

BIT_OR

BIT_OR([ALL] expr)

描述:返回expr中所有值的按位或,NULL值将被忽略。

参数类型:BIT_OR需要使用BIGINT作为参数,其他类型的参数会被转换为BIGINT,并且可能发生截断。

返回值类型:

  • 返回值类型为BIGINT。
  • 如果expr中的值均为NULL,则BIT_OR()返回一个中性值(所有位都被设置为0)。
  • ALL为可选项,不影响结果。

示例:

m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age);
CREATE TABLE

m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL);
INSERT 0 6

m_db=# SELECT * FROM m_test;
 age | salary 
-----+--------
   1 |       
   1 |      1
   1 |      2
   1 |      2
   2 |       
   2 |       
(6 rows)

m_db=# SELECT BIT_OR(ALL salary) FROM m_test GROUP BY age;
 bit_or
--------
 0
 3
(2 rows)

m_db=# DROP TABLE m_test;
DROP TABLE

BIT_XOR

BIT_XOR([ALL] expr)

描述:返回expr中所有值的按位异或,NULL值将被忽略。

参数类型:BIT_XOR需要使用BIGINT作为参数,其他类型的参数会被转换为BIGINT,并且可能发生截断。

返回值类型:

  • 返回值类型为BIGINT。
  • 如果expr中的值均为NULL,则BIT_OR()返回一个中性值(所有位都被设置为0)。
  • ALL为可选项,不影响结果。

示例:

m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age);
CREATE TABLE

m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL);
INSERT 0 6

m_db=# SELECT * FROM m_test;
 age | salary 
-----+--------
   1 |       
   1 |      1
   1 |      2
   1 |      2
   2 |       
   2 |       
(6 rows)

m_db=# SELECT BIT_XOR(ALL salary) FROM m_test GROUP BY age;
 bit_xor
---------
 0
 1
(2 rows)

m_db=# DROP TABLE m_test;
DROP TABLE

COUNT

  • COUNT([ALL] expr)

    描述:返回expr中非空值的数量。

    参数类型:入参可以是任意类型。

    返回值类型:

    • 返回值类型为BIGINT。
    • 如果expr中的值均为NULL,则COUNT()返回0。
    • ALL为可选项,不影响结果。
    • COUNT(*)比较特殊,它返回expr中所有值的数量,无论其是否为NULL。

    示例:

    m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age);
    CREATE TABLE
    
    m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL);
    INSERT 0 6
    
    m_db=# SELECT * FROM m_test;
     age | salary 
    -----+--------
       1 |       
       1 |      1
       1 |      2
       1 |      2
       2 |       
       2 |       
    (6 rows)
    
    m_db=# SELECT COUNT(ALL salary) FROM m_test GROUP BY age;
     count 
    -------
         3
         0
    (2 rows)
    
    m_db=# SELECT COUNT(*) FROM m_test GROUP BY age;
     count 
    -------
         4
         2
    (2 rows)
    
    m_db=# DROP TABLE m_test;
    DROP TABLE
  • COUNT(DISTINCT expr1 [, expr2, ..., exprN] )

    描述:返回expr中不同非空值的数量。

    参数类型:入参可以是任意类型。

    返回值类型:

    • 返回值类型为BIGINT。
    • 如果expr中的值均为NULL,则返回0。

    示例:

    m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age);
    CREATE TABLE
    
    m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL);
    INSERT 0 6
    
    m_db=# SELECT * FROM m_test;
     age | salary 
    -----+--------
       1 |       
       1 |      1
       1 |      2
       1 |      2
       2 |       
       2 |       
    (6 rows)
    
    m_db=# SELECT COUNT(DISTINCT salary) FROM m_test GROUP BY age;
     count 
    -------
         2
         0
    (2 rows)
    
    m_db=# DROP TABLE m_test;
    DROP TABLE

GROUP_CONCAT

GROUP_CONCAT语法如下:

GROUP_CONCAT([DISTINCT] expr [,expr ...]
            [ORDER BY {unsigned_integer | col_name | expr}
                [ASC | DESC] [,col_name ...]]
            [SEPARATOR str_val])

描述:将expr中的各个值进行拼接,返回一个字符串结果,NULL值会被忽略。

  • 指定DISTINCT时消除expr中的重复值。
  • ORDER BY:通过指定列对expr中的值进行排序。
  • ASC | DESC:ASC为升序排序,DESC为倒序排序,默认为升序排序。
  • SEPARATOR:拼接字符串时使用的分隔符,默认为逗号(,)。
  • 当同时指定DISTINCT和ORDER BY时,DISTINCT表达式必须包含ORDER BY表达式,否则会报错。
  • GROUP_CONCAT(... ORDER BY 数字)不代表按照第几个参数的顺序,数字只是一个常量表达式,相当于不排序。
  • 使用参数group_concat_max_len限制GROUP_CONCAT最大返回长度,超长截断,目前能返回的最大长度是1073741823。

返回值类型:TEXT

示例:

m_db=# CREATE TABLE m_test(id INT, name CHAR) DISTRIBUTE BY HASH(id);
CREATE TABLE

m_db=# INSERT INTO m_test VALUES (1, 'a'), (1, 'b'), (2, 'd'), (2, 'c'), (3, 'a'), (3, NULL);
INSERT 0 6

m_db=# SELECT * FROM m_test;
 id | name 
----+------
  1 | a
  1 | b
  2 | d
  2 | c
  3 | a
  3 | 
(6 rows)

m_db=# SELECT GROUP_CONCAT(name SEPARATOR '') FROM m_test;
 group_concat 
--------------
 abdca
(1 row)

m_db=# SELECT GROUP_CONCAT(DISTINCT id, name ORDER BY id DESC) FROM m_test;
   group_concat   
------------------
 3a,2c,2d,1a,1b
(1 row)

m_db=# DROP TABLE m_test;
DROP TABLE

MAX

MAX([ALL | DISTINCT] expr)

描述:返回输入expr的最大值,NULL值将被忽略。

参数类型:任意数值、字符串、日期时间类型。

返回值类型:

  • 返回值类型与参数数据类型相同。
  • 如果expr中的值均为NULL,则MAX()返回NULL。
  • 如果指定ALL或者不指定ALL与DISTINCT,则返回expr中所有非空值的最大值。
  • 如果指定了DISTINCT,则返回expr中不同非空值的最大值,与不指定DISTINCT的结果相同。

示例:

m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age);
CREATE TABLE

m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL);
INSERT 0 6

m_db=# SELECT * FROM m_test;
 age | salary 
-----+--------
   1 |       
   1 |      1
   1 |      2
   1 |      2
   2 |       
   2 |       
(6 rows)

m_db=# SELECT MAX(DISTINCT salary) FROM m_test GROUP BY age;
 max 
-----
   2

(2 rows)

m_db=# DROP TABLE m_test;
DROP TABLE

MIN

MIN([ALL | DISTINCT] expr)

描述:返回输入expr的最小值,NULL值将被忽略。

参数类型:任意数值、字符串、日期时间类型。

返回值类型:

  • 返回值类型与参数数据类型相同。
  • 如果expr中的值均为NULL,则MIN()返回NULL。
  • 如果指定ALL或者不指定ALL与DISTINCT,则返回expr中所有非空值的最小值。
  • 如果指定了DISTINCT,则返回expr中不同非空值的最小值,与不指定DISTINCT的结果相同。

示例:

m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age);
CREATE TABLE

m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL);
INSERT 0 6

m_db=# SELECT * FROM m_test;
 age | salary 
-----+--------
   1 |       
   1 |      1
   1 |      2
   1 |      2
   2 |       
   2 |       
(6 rows)

m_db=# SELECT MIN(DISTINCT salary) FROM m_test GROUP BY age;
 min 
-----
   1

(2 rows)

m_db=# DROP TABLE m_test;
DROP TABLE

SUM

SUM([ALL | DISTINCT] expr)

描述:返回输入expr的和,NULL值将被忽略。

参数类型:可以是TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、DECIMAL、FLOAT、DOUBLE。

返回值类型:

  • 返回值类型视入参数据类型而定。当入参为精确值(INT、DECIMAL)时,返回DECIMAL;当入参为近似值(FLOAT、DOUBLE)时返回DOUBLE类型。
  • 如果expr中的值均为NULL,则SUM()返回NULL。
  • 如果指定ALL或者不指定ALL与DISTINCT,则返回expr中所有非空值的和。
  • 如果指定DISTINCT,则返回expr中不同非空值的和。

示例:

m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age);
CREATE TABLE

m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL);
INSERT 0 6

m_db=# SELECT * FROM m_test;
 age | salary 
-----+--------
   1 |       
   1 |      1
   1 |      2
   1 |      2
   2 |       
   2 |       
(6 rows)

m_db=# SELECT age, SUM(salary) FROM m_test GROUP BY (age);
 age | sum 
-----+-----
   1 |   5
   2 |    
(2 rows)

m_db=# SELECT age, SUM(DISTINCT salary) FROM m_test GROUP BY (age);
 age | sum 
-----+-----
   1 |   3
   2 |    
(2 rows)

m_db=# DROP TABLE m_test;
DROP TABLE

相关文档