在 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()
),需注意兼容性。