字符串函数
1. 字符串拼接concat
-- 拼接字符串'hello'和'mysql',结果为'hellomysql'
-- 格式:concat(str1, str2, ...):拼接多个字符串
select concat('hello', 'mysql');
注意事项:若任一参数为null
,结果为null
(如concat('a', null)
返回null
)。
2. 大小写转换lower
/upper
-- 将字符串'HElLO'转为全小写,结果为'hello'
select lower('HElLO');-- 将字符串'hello'转为全大写,结果为'HELLO'
select upper('hello');
注意事项:仅对字母有效,非字母字符不处理(如lower('123A')
返回'123a'
)。
3. 填充函数lpad
/rpad
-- 左填充:将'01'用'-'填充至长度5,结果为'---01'
-- 格式:lpad(str, length, padstr):从左侧用padstr填充str至指定长度
select lpad('01', 5, '-');-- 右填充:将'02'用'*'填充至长度5,结果为'02***'
-- 格式:rpad(str, length, padstr):从右侧用padstr填充str至指定长度
select rpad('02', 5, '*');
注意事项:
- 若原字符串长度大于指定
length
,会截断超出部分(如lpad('12345', 3, '0')
返回'123'
); padstr
可为空,但无实际意义。
4. 去除空格trim
-- 去除字符串前后的空格(默认行为),结果为'HElLO mysql *'
-- 格式:trim(str):去除str头部和尾部的空格;也可指定去除字符(如trim('*' from '**abc**')返回'abc')
select trim(' HElLO mysql *');
注意事项:仅去除头部和尾部的指定字符,中间的不处理(如trim(' a b c ')
返回'a b c'
)。
5. 截取子串substring
-- 从第1个字符开始,截取7个字符,结果为'HElLO m'
-- 格式:substring(str, start, length):start为起始位置(从1开始),length为截取长度
select substring('HElLO mysql', 1, 7);
注意事项:
- 起始位置
start
为负数时,表示从尾部开始计算(如substring('abcde', -3, 2)
返回'cd'
); - 若
length
超出字符串长度,返回从start
到结尾的所有字符。
练习:表数据更新(结合字符串函数)
-- 查看emp表所有数据(用于对比更新前后的workno字段)
select * from emp;-- 更新emp表的workno字段:用lpad函数将workno左填充0至5位
-- 例如原workno为'1',更新后为'00001';原workno为'10',更新后为'00010'
update emp set workno = lpad(workno, 5, 0);
注意事项:更新操作需谨慎,建议先备份数据或用select
验证函数结果(如select lpad(workno,5,0) from emp
)。
数值函数
1. 向上取整ceil
-- 向上取整:1.1的向上取整结果为2
-- 格式:ceil(x):返回大于等于x的最小整数
select ceil(1.1); -- 结果:2
注意事项:对负数同样生效(如ceil(-1.1)
返回-1
)。
2. 向下取整floor
-- 向下取整:-0.5的向下取整结果为-1(取小于等于该数的最大整数)
select floor(-0.5); -- 结果:-1
注意事项:与ceil
相反,floor(1.9)
返回1
,floor(-1.1)
返回-2
。
3. 取余数mod
-- 取余数:-9.5除以2的余数,结果为-1.5(余数符号与被除数一致)
-- 格式:mod(x, y):等价于x % y
select mod(-9.5, 2); -- 结果:-1.5
注意事项:若y
为 0,返回null
(除数不能为 0)。
4. 随机数rand
-- 生成0-1之间的随机浮点数(包含0,不包含1)
select rand(); -- 示例结果:0.847539276155328
注意事项:每次调用结果不同;若需固定随机序列,可传入种子(如rand(1)
,相同种子生成相同序列)。
5. 四舍五入round
-- 四舍五入:3.55936412保留5位小数,结果为3.55936
-- 格式:round(x, d):x为数值,d为保留的小数位数(默认d=0,即取整数)
select round(3.55936412, 5); -- 结果:3.55936
注意事项:d
为负数时,对整数部分四舍五入(如round(123.45, -1)
返回120
)。
练习:生成 6 位随机验证码
-- 方式1:从rand()生成的随机数中截取第3位开始的6个字符(rand()格式为0.xxxxxx...)
-- 例如rand()=0.123456789,substring从第3位取6位,结果为'123456'
select substring(rand(), 3, 6);-- 方式2:生成0-1000000的随机整数,再用lpad左填充0至6位(确保是6位数)
-- round(rand()*1000000,0)生成0-1000000的整数,lpad确保不足6位时补0
select lpad(round(rand() * 1000000, 0), 6, 0);
注意事项:
- 方式 1 可能因
rand()
小数位数不足导致结果短于 6 位(如rand()
=0.1234,结果为 '1234'); - 方式 2 更可靠,确保始终返回 6 位数字(包括补 0 的情况)。
日期函数
1. 获取当前日期 / 时间
-- 获取当前日期(格式:YYYY-MM-DD)
select curdate(); -- 示例结果:2025-09-13-- 获取当前时间(格式:HH:MM:SS)
select curtime(); -- 示例结果:15:30:45-- 获取当前日期时间(格式:YYYY-MM-DD HH:MM:SS)
select now(); -- 示例结果:2025-09-13 15:30:45
注意事项:now()
返回的是 SQL 语句开始执行的时间,而非函数调用时的时间(若语句执行耗时较长)。
2. 提取日期部分
-- 提取当前日期的年份
select year(now()); -- 示例结果:2025-- 提取当前日期的月份
select month(now()); -- 示例结果:9-- 提取当前日期的日
select day(now()); -- 示例结果:13
注意事项:参数需为日期 / 时间类型,若为字符串需符合日期格式(如year('2024-05-10')
返回2024
)。
3. 日期加减date_add
-- 计算当前日期加79天后的日期
-- 格式:date_add(date, interval 数值 单位),单位可为day、month、year等
select date_add(now(), interval 79 day ); -- 示例结果:2025-12-01 15:30:45
注意事项:
- 单位需正确(如
interval 1 month
表示加 1 个月); - 减日期可用
date_sub
(如date_sub(now(), interval 1 day)
)。
4. 日期差datediff
-- 计算当前日期与'2024-01-01'的天数差(结果=当前日期 - 目标日期)
-- 格式:datediff(end_date, start_date):返回两个日期之间的天数
select datediff(now(), '2024-01-01'); -- 示例结果:620(假设间隔620天)
注意事项:
- 仅计算日期部分,忽略时间(如
datediff('2024-01-02 23:59', '2024-01-01 00:00')
返回1
); - 若
end_date < start_date
,结果为负数。
练习:表查询(结合日期函数)
-- 查看emp表所有数据(用于对比)
select * from emp;-- 查询员工的入职天数和姓名,并按入职天数倒序排序
-- datediff(curdate(), entrydate):计算当前日期与入职日期的天数差(即入职天数)
-- order by 入职天数 desc:按入职天数从大到小排序(最老员工在前)
select datediff(curdate(), entrydate) '入职天数', name from emp order by 入职天数 desc ;
注意事项:
entrydate
需为date
类型,否则datediff
可能返回null
;- 排序时可直接使用别名(如
order by 入职天数
),无需重复写函数。
总结:函数通用注意事项
- 参数类型需匹配:如日期函数需传入日期 / 时间类型,字符串函数需传入字符串类型,否则可能返回
null
或错误; - 边界值处理:如
lpad
/rpad
的长度小于原字符串时会截断,substring
的起始位置超出字符串长度时返回空; - 性能影响:聚合函数、复杂字符串 / 日期函数在大数据量下可能影响查询效率,建议合理使用索引或限制查询范围;
- 兼容性:部分函数(如
mysql_native_password
)在不同 MySQL 版本中行为可能不同,需注意版本兼容。