结构化查询语言(Structured Query Language)
Completion requirements
预定义函数分为两类:
-
聚合函数(Aggregate functions)
这些函数作用于一组行。它们接收一组行中每行的一个值,并为整组返回一个值。如果在包含GROUP BY
的上下文中调用,则每组调用一次;否则对所有行调用一次。 -
标量函数(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;
ALL
与 DISTINCT
函数的完整签名可以包括关键字 ALL
或 DISTINCT
。如果指定 ALL
(默认值),则所有值都会参与计算;如果指定 DISTINCT
,则只有唯一值会参与计算。
语法:
function_name ([ALL|DISTINCT]<列名>)
示例:
-- 计算去重后的体重数量
COUNT(DISTINCT weight)
提示
SQL标准还定义了一些用于计算统计量的其他聚合函数。此外,关键字 ANY、EVERY 和 SOME 形式上也被定义为聚合函数。我们将在单独的页面中讨论这些内容。
标量函数(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()
接收一个字符串,返回一个数字。 - 标量函数可以作用于每行数据,并生成新的结果集。
Last modified: Wednesday, 5 February 2025, 12:05 AM