预定义函数分为两类:

  1. 聚合函数(Aggregate functions)
    这些函数作用于一组行。它们接收一组行中每行的一个值,并为整组返回一个值。如果在包含 GROUP BY 的上下文中调用,则每组调用一次;否则对所有行调用一次。

  2. 标量函数(Scalar functions)
    这些函数作用于单行。它们接收单行中的一个值,并为每行返回一个值。


聚合函数

聚合函数在一组行上工作,返回单个值,例如行数、最大值、最小值、标准差等。以下是最重要的聚合函数:

签名 含义
COUNT(*) 返回行的总数
COUNT(<列名>) 返回指定列中包含值(即 IS NOT NULL)的行数。注意,所有聚合函数在计算时会忽略包含 NULL 特殊标记的行。
MIN(<列名>) 返回最低值。对于字符串类型,依据字符的顺序比较。
MAX(<列名>) 返回最高值。对于字符串类型,依据字符的顺序比较。
SUM(<列名>) 返回所有值的总和。
AVG(<列名>) 返回算术平均值。

示例:检索所有人的最大体重:

SELECT MAX(weight)
FROM   person;

注意事项

聚合函数为一组行返回一个值。因此,不能在 SELECT 中同时使用聚合函数和普通列。这种组合会导致矛盾,系统将抛出异常。例如:

-- 错误示例
SELECT lastname, SUM(weight)
FROM   person;

正确用法可以是同时使用多个聚合函数,但不能混用普通列:

-- 多个聚合函数。没有普通列。
SELECT SUM(weight)/COUNT(weight) AS average_1, AVG(weight) AS average_2
FROM   person;

分组(Grouping)

如果在包含 GROUP BY 的命令中使用聚合函数,聚合函数会对每组调用一次。

-- 每个 lastname 一组,计算每组的平均体重
SELECT AVG(weight)
FROM   person
GROUP BY lastname;

在这种情况下,GROUP BY 的列可以显示,因为组内这些列的值是唯一且不变的。

-- 可以显示 lastname,因为它是 GROUP BY 的依据
SELECT lastname, AVG(weight)
FROM   person
GROUP BY lastname;

NULL 特殊标记的处理

如果某行在指定列中没有值(即包含 NULL 特殊标记),该行不会被计算在内。

-- 如果 ssn 为 NULL,则不会计入总数
SELECT COUNT(ssn)
FROM   person;

ALLDISTINCT

函数的完整签名可以包括关键字 ALLDISTINCT。如果指定 ALL(默认值),则所有值都会参与计算;如果指定 DISTINCT,则只有唯一值会参与计算。

语法

function_name ([ALL|DISTINCT]<列名>)

示例

-- 计算去重后的体重数量
COUNT(DISTINCT weight)

提示

 

SQL标准还定义了一些用于计算统计量的其他聚合函数。此外,关键字 ANYEVERYSOME 形式上也被定义为聚合函数。我们将在单独的页面中讨论这些内容。

 

 

标量函数(Scalar Functions)

 

标量函数以“每行”为基础操作。每行调用一次,并返回一个值。通常,标量函数根据作用的数据类型分组:

 

字符串函数(String Functions)

 
  • SUBSTRING(<列名> FROM <起始位置> FOR <长度>)
    返回从指定起始位置(<pos>,第一个字符从 1 开始)起、指定长度(<len>)的子字符串。
  • UPPER(<列名>)
    返回列值的全大写形式。
  • LOWER(<列名>)
    返回列值的全小写形式。
  • CHARACTER_LENGTH(<列名>)
    返回列值的长度。
  • TRIM(<列名>)
    返回去除首尾空格后的列值。
  • TRIM(LEADING FROM <列名>)
    返回去除前导空格后的列值。
  • TRIM(TRAILING FROM <列名>)
    返回去除尾部空格后的列值。
 

 

数值函数(Numeric Functions)

 
  • SQRT(<列名>)
    返回列值的平方根。
  • ABS(<列名>)
    返回列值的绝对值。
  • MOD(<列名>, <除数>)
    返回列值除以指定除数的余数。
  • 其他:FLOOR(向下取整)、CEIL(向上取整)、POWER(幂运算)、EXP(指数)、LN(自然对数)。
 

 

日期、时间和时间间隔函数(Date, Time & Interval Functions)

 
  • EXTRACT(part FROM <列名>)
    返回日期列中指定部分的值,例如:EXTRACT(month FROM date_of_birth) 返回出生日期的月份。
  • 内置函数
    • CURRENT_DATE() 返回当前日期。
    • CURRENT_TIME() 返回当前时间。
 

 

示例

 

以下是一个包含多种标量函数的示例:

 
SELECT LOWER(firstname),               -- 将名字转换为小写
       UPPER(lastname),               -- 将姓氏转换为大写
       CONCAT('today is: ', CURRENT_DATE)  -- 将当前日期与固定字符串拼接
FROM   person;
 

说明

 
  • 函数的返回值数据类型不一定与输入类型相同,例如:CHARACTER_LENGTH() 接收一个字符串,返回一个数字。
  • 标量函数可以作用于每行数据,并生成新的结果集。

最后修改: 2025年02月5日 星期三 00:05