函数
函数是一段特殊的程序代码,能对查询结果进行操作,让用户不必书写过多代码即可完成复杂操作。这篇讲系统内置函数(系统/日期/字符串/数学/转换/聚合)、GROUP BY 分组,以及用户自定义函数。
系统函数
系统函数对 SQL Server 服务器和数据库对象进行操作,返回配置和对象信息:
| 函数 | 说明 |
|---|---|
CURRENT_TIMESTAMP | 返回系统当前日期和时间(datetime) |
HOST_NAME() | 返回主机名称 |
SYSTEM_USER | 返回当前系统用户 |
USER_NAME() | 返回 id 标识指定的用户名称 |
DB_NAME() | 返回当前会话的数据库名称 |
日期和时间函数
| 函数 | 说明 | 示例 |
|---|---|---|
GETDATE() | 获取当前系统时间 | — |
DATEDIFF(datepart, start, end) | 返回时间差 | DATEDIFF(day,'2004-09-01','2004-09-18') → 17 |
DATEADD(datepart, number, date) | 向指定日期加上一段时间 | DATEADD(day,2,'2004-10-15') → 2004-10-17 |
DATENAME(datepart, date) | 返回指定日期部分的字符串 | DATENAME(weekday,'2004-10-15') → 星期五 |
DATEPART(datepart, date) | 返回指定日期部分的整数 | DATEPART(month,'2004-10-15') → 10 |
字符串函数
字符串函数对字符串输入值执行操作,一般用于 char/varchar 类型:
| 函数 | 说明 |
|---|---|
ASCII(string) | 返回最左端字符的 ASCII 码,如 ASCII('abc') → 97 |
CHAR(n) | 将 ASCII 码转换为字符,如 CHAR(98) → b |
LTRIM(string) / RTRIM(string) | 删除字符串左 / 右边的空格 |
LEN(string) | 返回字符(非字节)个数,不含尾随空格 |
REPLACE(s1, s2, s3) | 用 s3 替换 s1 中所有的 s2 |
LEFT(string, n) / RIGHT(string, n) | 返回左 / 右边指定个数的字符 |
SUBSTRING(expr, start, length) | 返回字符串表达式的一部分 |
SPACE(num) | 返回指定数目的空格 |
REVERSE(string) | 返回字符表达式的反转 |
LOWER(string) / UPPER(string) | 大写转小写 / 小写转大写 |
数学函数
| 函数 | 说明 |
|---|---|
ABS(n) | 绝对值 |
SIN/COS/TAN/COT(f) | 正弦/余弦/正切/余切 |
ASIN/ACOS/ATAN(f) | 反正弦/反余弦/反正切 |
ATN2(f1, f2) | 求 f1/f2 的反正切 |
DEGREES(n) / RADIANS(n) | 弧度转度 / 度转弧度 |
EXP(f) | 指数值 |
POWER(n, y) | n 的 y 次方 |
SQRT(f) | 平方根 |
LOG(f) / LOG10(f) | 自然对数 / 以 10 为底的对数 |
CEILING(n) | 大于等于 n 的最小整数 |
FLOOR(n) | 小于等于 n 的最大整数 |
RAND({seed}) | 返回 0~1 之间的随机浮点数 |
PI() | 返回常数 3.141592653589793 |
ROUND(n, length) | 四舍五入,保留 length 位小数 |
SIGN(n) | n 为正/0/负时分别返回 1/0/-1 |
数据类型转换函数
-- CONVERT(数据类型[(长度)], 表达式[, 样式])
SELECT CONVERT(NVARCHAR, 123) -- 返回 '123'
-- CAST(表达式 AS 数据类型[(长度)])
SELECT CAST(123 AS NVARCHAR) -- 返回 '123'聚合函数
| 函数 | 说明 |
|---|---|
SUM() | 计算所有值之和 |
AVG() | 计算平均值 |
COUNT(列名) | 计算非空值的数量 |
COUNT(*) | 计算所有行的数量 |
MIN() / MAX() | 计算最小值 / 最大值 |
GROUP BY 分组
聚合函数只能求出单个字段的汇总值;GROUP BY 可以按字段把记录分组,对每组数据分别汇总。聚合函数与 GROUP BY 配合使用。
SELECT 字段a, 字段b, 聚合函数(字段c)
FROM 目标表
GROUP BY 字段a
-- WITH CUBE / WITH ROLLUP 可生成小计和总计使用 GROUP BY 的注意事项:
- 出现在
GROUP BY子句中的字段,必须出现在SELECT列表中(子集关系)。 GROUP BY与ORDER BY连用时,ORDER BY子句必须包含GROUP BY后的所有字段。GROUP BY后可使用多个字段作为分组字段,系统将按这些字段的先后顺序对结果集进行更详细的分组。
用户自定义函数
除内置函数外,SQL Server 允许用户创建自定义函数(UDF),把常用逻辑封装复用。按返回值分为:
- 标量函数:返回单个值,用
RETURNS 数据类型。 - 表值函数:返回一个表,用
RETURNS TABLE。
CREATE FUNCTION dbo.fn_GetAge(@birth DATE)
RETURNS INT
AS
BEGIN
RETURN DATEDIFF(YEAR, @birth, GETDATE());
END
GO
-- 调用标量函数需带上架构名
SELECT dbo.fn_GetAge('2000-01-01');最后更新于