跳至内容

函数

函数是一段特殊的程序代码,能对查询结果进行操作,让用户不必书写过多代码即可完成复杂操作。这篇讲系统内置函数(系统/日期/字符串/数学/转换/聚合)、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 BYORDER 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');
最后更新于