以下是 SQL Server 函数的详细分类说明及用法示例,涵盖常用函数及核心场景。内容基于 SQL Server 2019+ 版本,部分函数在旧版本中可能不可用。
一、字符串函数
1. CONCAT(str1, str2, ...)
- 功能: 拼接多个字符串(自动处理
NULL
值)。 - 示例:sql复制SELECT CONCAT(‘Hello’, ‘ ‘, ‘World’); — 输出 ‘Hello World’ SELECT CONCAT(first_name, ‘ ‘, last_name) AS full_name FROM employees;
- 注意: 若使用
+
拼接,遇到NULL
会返回NULL
。CONCAT
将NULL
视为空字符串。
2. SUBSTRING(str, start, length)
- 功能: 截取子字符串。
- 示例:sql复制SELECT SUBSTRING(‘SQL Server’, 5, 6); — 输出 ‘Server’
3. REPLACE(str, old_str, new_str)
- 功能: 替换字符串内容。
- 示例:sql复制SELECT REPLACE(‘I love apples’, ‘apples’, ‘oranges’); — 输出 ‘I love oranges’
4. LEN(str)
- 功能: 返回字符串字符数(不包含末尾空格)。
- 示例:sql复制SELECT LEN(‘SQL Server’); — 输出 10
5. CHARINDEX(substr, str, start)
- 功能: 查找子字符串位置。
- 示例:sql复制SELECT CHARINDEX(‘Server’, ‘SQL Server’); — 输出 5
二、数值函数
1. ROUND(number, decimals)
- 功能: 四舍五入到指定小数位。
- 示例:sql复制SELECT ROUND(3.1415, 2); — 输出 3.1400
2. CEILING(number)
与 FLOOR(number)
- 功能:
CEILING()
: 向上取整。FLOOR()
: 向下取整。
- 示例:sql复制SELECT CEILING(2.3); — 输出 3 SELECT FLOOR(2.7); — 输出 2
3. RAND([seed])
- 功能: 生成 0~1 之间的随机数。
- 示例:sql复制SELECT RAND(); — 输出类似 0.654321 SELECT FLOOR(RAND() * 100); — 生成 0~99 的整数
三、日期时间函数
1. GETDATE()
- 功能: 返回当前日期和时间。
- 示例:sql复制SELECT GETDATE(); — 输出 ‘2023-10-25 14:30:00.000’
2. DATEADD(unit, number, date)
- 功能: 日期加减。
- 示例:sql复制SELECT DATEADD(DAY, 7, GETDATE()); — 7天后 SELECT DATEADD(MONTH, 1, ‘2023-12-31’); — 输出 ‘2024-01-31’
3. DATEDIFF(unit, start_date, end_date)
- 功能: 计算两个日期的差值。
- 示例:sql复制SELECT DATEDIFF(DAY, ‘2023-10-25’, ‘2023-10-31’); — 输出 6
4. FORMAT(date, format)
- 功能: 格式化日期(类似 C# 语法)。
- 示例:sql复制SELECT FORMAT(GETDATE(), ‘yyyy-MM-dd HH:mm:ss’); — 输出 ‘2023-10-25 14:30:00’ SELECT FORMAT(GETDATE(), ‘MMMM dd, yyyy’); — 输出 ‘October 25, 2023’
四、聚合函数
1. SUM(column)
- 功能: 计算数值列总和。
- 示例:sql复制SELECT SUM(sales) FROM orders WHERE year = 2023;
2. COUNT(expression)
- 区别:
COUNT(*)
: 统计所有行。COUNT(column)
: 忽略NULL
值。
- 示例:sql复制SELECT COUNT(*) FROM customers; — 总客户数
3. STRING_AGG(expression, separator)
- 功能: 合并分组中的字符串。
- 示例:sql复制SELECT department_id, STRING_AGG(name, ‘, ‘) FROM employees GROUP BY department_id; — 输出每个部门员工姓名列表,逗号分隔
五、条件函数
1. IIF(condition, true_value, false_value)
- 功能: 简化版
CASE WHEN
。 - 示例:sql复制SELECT IIF(score >= 60, ‘Pass’, ‘Fail’) AS result FROM exams;
2. CASE WHEN
- 功能: 多条件分支。
- 示例:sql复制SELECT CASE WHEN age < 18 THEN ‘Minor’ WHEN age BETWEEN 18 AND 65 THEN ‘Adult’ ELSE ‘Senior’ END AS age_group FROM users;
3. COALESCE(value1, value2, ...)
- 功能: 返回第一个非
NULL
值。 - 示例:sql复制SELECT COALESCE(middle_name, ‘N/A’) FROM users;
六、窗口函数
1. ROW_NUMBER()
- 功能: 为分组内的行生成唯一序号。
- 示例:sql复制SELECT name, salary, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank FROM employees;
2. RANK()
与 DENSE_RANK()
- 区别:
RANK()
: 允许并列排名(如 1,1,3)。DENSE_RANK()
: 允许并列排名(如 1,1,2)。
七、转换函数
1. CAST(expression AS data_type)
- 功能: 类型转换。
- 示例:sql复制SELECT CAST(‘123’ AS INT); — 输出 123
2. CONVERT(data_type, expression, style)
- 功能: 类型转换(支持日期格式化)。
- 示例:sql复制SELECT CONVERT(VARCHAR, GETDATE(), 112); — 输出 ‘20231025’(格式代码 112)
3. TRY_CONVERT(data_type, expression)
- 功能: 安全转换(失败返回
NULL
)。 - 示例:sql复制SELECT TRY_CONVERT(INT, ‘abc’); — 输出 NULL
八、系统函数
1. ISNULL(check_expression, replacement_value)
- 功能: 替换
NULL
值。 - 示例:sql复制SELECT ISNULL(middle_name, ‘N/A’) FROM users;
2. NEWID()
- 功能: 生成唯一 GUID。
- 示例:sql复制SELECT NEWID(); — 输出类似 ‘6F9619FF-8B86-D011-B42D-00C04FC964FF’
注意事项
- 性能优化:
- 避免在
WHERE
或JOIN
条件中对字段使用函数(可能破坏索引)。 - 示例错误写法:sql复制SELECT * FROM logs WHERE FORMAT(create_time, ‘yyyyMM’) = ‘202310’;
- 正确优化:sql复制SELECT * FROM logs WHERE create_time >= ‘2023-10-01’ AND create_time < ‘2023-11-01’;
- 避免在
- 版本兼容性:
STRING_AGG
需 SQL Server 2017+。FORMAT
函数需 SQL Server 2012+。
- NULL 处理:
- 使用
ISNULL()
或COALESCE()
处理默认值。
- 使用
THE END