在 SQL 中,函数是处理数据的重要工具,可分为字符串函数 、数值函数 和日期函数三大类。它们用于对字符串、数字和日期类型的数据进行转换、计算或提取信息,极大提升了数据处理的灵活性。以下是详细讲解:
一、字符串函数
字符串函数用于处理字符型数据(如VARCHAR、CHAR类型),实现拼接、截取、转换等操作。
1. 字符串拼接:CONCAT(str1, str2, ...)
- 
功能:将多个字符串拼接为一个字符串。 
- 
语法 : CONCAT(字符串1, 字符串2, ...)
- 
示例 : sql SELECT CONCAT('Hello', ' ', 'SQL'); -- 结果:'Hello SQL' SELECT CONCAT(name, '_', workno) AS user_code FROM emp; -- 拼接姓名和工号作为用户编码
- 
注意事项 : - 若任一参数为NULL,结果为NULL(如CONCAT('a', NULL)返回NULL)。
- 部分数据库支持CONCAT_WS(分隔符, str1, str2),用指定分隔符拼接(如CONCAT_WS(',', 'a', 'b')返回'a,b')。
 
- 若任一参数为
2. 大小写转换:LOWER(str) / UPPER(str)
- 
功能 : - LOWER(str):将字符串转为全小写。
- UPPER(str):将字符串转为全大写。
 
- 
语法 : LOWER(字符串)或UPPER(字符串)
- 
示例 : sql SELECT LOWER('MySqL'); -- 结果:'mysql' SELECT UPPER(name) AS upper_name FROM emp; -- 将姓名转为大写
- 
注意事项 :仅对字母有效,非字母字符(如数字、符号)不处理(如 LOWER('123A!')返回'123a!')。
3. 填充函数:LPAD(str, length, padstr) / RPAD(str, length, padstr)
- 
功能 : - LPAD(str, length, padstr):从字符串左侧用- padstr填充,直到总长度为- length。
- RPAD(str, length, padstr):从字符串右侧用- padstr填充,直到总长度为- length。
 
- 
语法 : LPAD(原字符串, 目标长度, 填充字符)
- 
示例 : sql SELECT LPAD('123', 5, '0'); -- 结果:'00123'(左侧补0至长度5) SELECT RPAD(workno, 6, '*') FROM emp; -- 工号右侧补*至长度6
- 
注意事项 : - 若原字符串长度大于length,会截断超出部分(如LPAD('123456', 3, '0')返回'123')。
- 填充字符padstr可为空,但无实际意义。
 
- 若原字符串长度大于
4. 去除空格:TRIM(str)
- 
功能:去除字符串头部和尾部的空格(默认);也可指定去除特定字符。 
- 
语法 : - 去除空格:TRIM(字符串)
- 去除指定字符:TRIM(字符 FROM 字符串)(如TRIM('*' FROM '**abc**'))
 
- 去除空格:
- 
示例 : sql SELECT TRIM(' SQL '); -- 结果:'SQL'(去除首尾空格) SELECT TRIM('x' FROM 'xxHelloxx'); -- 结果:'Hello'(去除首尾的x)
- 
注意事项 :仅去除头部和尾部的字符,中间的不处理(如 TRIM(' a b c ')返回'a b c')。
5. 截取子串:SUBSTRING(str, start, length)
- 
功能 :从字符串的 start位置开始,截取length长度的子串(start从 1 开始计数)。
- 
语法 : SUBSTRING(原字符串, 起始位置, 截取长度)
- 
示例 : sql SELECT SUBSTRING('Database', 3, 4); -- 结果:'taba'(从第3位开始,取4个字符) SELECT SUBSTRING(idcard, 1, 6) AS area_code FROM emp; -- 截取身份证前6位(地区码)
- 
注意事项 : - 起始位置start为负数时,从字符串尾部开始计算(如SUBSTRING('abcde', -3, 2)返回'cd')。
- 若length省略,默认截取到字符串末尾(如SUBSTRING('abcde', 3)返回'cde')。
 
- 起始位置
6. 字符串长度:LENGTH(str)
- 
功能:返回字符串的字节长度(注意:中文在 UTF-8 编码下占 3 字节)。 
- 
示例 : sql SELECT LENGTH('SQL'); -- 结果:3(3个字母,每个1字节) SELECT LENGTH('数据库'); -- 结果:9(3个中文,UTF-8下每个3字节)
二、数值函数
数值函数用于对数值型数据(如INT、FLOAT、DECIMAL)进行计算,实现取整、求和、随机数生成等操作。
1. 取整函数:CEIL(x) / FLOOR(x)
- 
功能 : - CEIL(x):向上取整(返回大于等于- x的最小整数)。
- FLOOR(x):向下取整(返回小于等于- x的最大整数)。
 
- 
示例 : sql SELECT CEIL(2.1); -- 结果:3;CEIL(-2.1) → -2 SELECT FLOOR(2.9); -- 结果:2;FLOOR(-2.9) → -3
2. 四舍五入:ROUND(x, d)
- 
功能 :将数值 x四舍五入保留d位小数(d默认为 0,即取整数)。
- 
示例 : sql SELECT ROUND(3.14159, 2); -- 结果:3.14(保留2位小数) SELECT ROUND(123.45, -1); -- 结果:120(d为负数时,对整数部分四舍五入)
3. 取余数:MOD(x, y)
- 
功能 :返回 x除以y的余数(等价于x % y)。
- 
示例 : sql SELECT MOD(10, 3); -- 结果:1(10 ÷ 3 余1) SELECT MOD(-10, 3); -- 结果:-1(余数符号与被除数一致)
- 
注意事项 :若 y为 0,返回NULL(除数不能为 0)。
4. 随机数:RAND()
- 
功能:生成 0~1 之间的随机浮点数(包含 0,不包含 1)。 
- 
示例 : sql SELECT RAND(); -- 示例结果:0.7834521(每次调用结果不同) SELECT RAND(10); -- 传入种子(如10),生成固定序列的随机数(相同种子结果相同)
- 
应用场景 :生成随机验证码(结合字符串函数): sql -- 生成6位随机数字验证码 SELECT LPAD(FLOOR(RAND() * 1000000), 6, '0'); -- 结果:'058392'(不足6位补0)
5. 绝对值:ABS(x)
- 
功能 :返回 x的绝对值。
- 
示例 : sql SELECT ABS(-123); -- 结果:123;ABS(0) → 0
6. 截断:TRUNCATE(x, d)
- 
功能 :将数值 x截断(不是四舍五入)到d位小数。
- 
示例 : sql SELECT TRUNCATE(3.14159, 2); -- 结果:3.14(直接截断,不四舍五入) SELECT TRUNCATE(123.456, 0); -- 结果:123
三、日期函数
日期函数用于处理日期时间类型数据(如DATE、DATETIME),实现日期获取、计算、格式化等操作。
1. 获取当前日期时间:CURDATE() / CURTIME() / NOW()
- 
功能 : - CURDATE():返回当前日期(格式:- YYYY-MM-DD)。
- CURTIME():返回当前时间(格式:- HH:MM:SS)。
- NOW():返回当前日期时间(格式:- YYYY-MM-DD HH:MM:SS)。
 
- 
示例 : sql SELECT CURDATE(); -- 结果:'2025-09-14' SELECT CURTIME(); -- 结果:'10:30:45' SELECT NOW(); -- 结果:'2025-09-14 10:30:45'
2. 提取日期部分:YEAR(date) / MONTH(date) / DAY(date)
- 
功能:从日期中提取年、月、日。 
- 
示例 : sql SELECT YEAR('2025-09-14'); -- 结果:2025 SELECT MONTH(NOW()); -- 结果:9(当前月份) SELECT DAY(entrydate) AS join_day FROM emp; -- 提取员工入职的日
3. 日期加减:DATE_ADD(date, INTERVAL expr unit) / DATE_SUB(date, INTERVAL expr unit)
- 
功能 : - DATE_ADD:对日期增加指定时间间隔(年、月、日等)。
- DATE_SUB:对日期减少指定时间间隔。
 
- 
常用单位 : YEAR(年)、MONTH(月)、DAY(日)、HOUR(时)、MINUTE(分)等。
- 
示例 : sql -- 计算30天后的日期 SELECT DATE_ADD(CURDATE(), INTERVAL 30 DAY); -- 结果:'2025-10-14' -- 计算3个月前的日期 SELECT DATE_SUB(NOW(), INTERVAL 3 MONTH); -- 结果:'2025-06-14 10:30:45'
4. 日期差:DATEDIFF(end_date, start_date)
- 
功能 :计算两个日期之间的天数差(结果 = end_date-start_date)。
- 
示例 : sql -- 计算入职天数(当前日期 - 入职日期) SELECT name, DATEDIFF(CURDATE(), entrydate) AS work_days FROM emp; -- 计算两个固定日期的差 SELECT DATEDIFF('2025-12-31', '2025-01-01'); -- 结果:364
- 
注意事项 : - 仅计算日期部分,忽略时间(如DATEDIFF('2025-01-02 23:59', '2025-01-01 00:00')返回1)。
- 若end_date < start_date,结果为负数。
 
- 仅计算日期部分,忽略时间(如
5. 日期格式化:DATE_FORMAT(date, format)
- 
功能 :将日期按指定格式转换为字符串( format为格式符,如%Y表示 4 位年,%m表示 2 位月)。
- 
常用格式符 : - %Y:4 位年(如 2025);- %y:2 位年(如 25)
- %m:2 位月(01-12);- %d:2 位日(01-31)
- %H:24 小时制时(00-23);- %h:12 小时制时(01-12)
 
- 
示例 : sql SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i:%s'); -- 结果:'2025年09月14日 10:35:20' SELECT DATE_FORMAT(entrydate, '%Y-%m') AS join_month FROM emp; -- 入职年月(如2020-03)
总结与注意事项
- 参数类型匹配 :函数参数需与数据类型一致(如日期函数需传入日期型,否则可能返回NULL)。
- NULL 处理 :若输入为NULL,多数函数返回NULL(如CONCAT(NULL, 'a')→NULL)。
- 性能影响 :在WHERE子句中对字段使用函数(如WHERE YEAR(entrydate) = 2020)可能导致索引失效,建议优化为WHERE entrydate BETWEEN '2020-01-01' AND '2020-12-31'。
- 数据库差异 :部分函数在不同数据库中语法不同(如 SQL Server 用GETDATE()获取当前时间,而非NOW()),需注意兼容性。