当前位置: 首页 > news >正文

SQL-字符串函数、数值函数、日期函数

字符串函数

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)返回1floor(-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 入职天数),无需重复写函数。

总结:函数通用注意事项

  1. 参数类型需匹配:如日期函数需传入日期 / 时间类型,字符串函数需传入字符串类型,否则可能返回null或错误;
  2. 边界值处理:如lpad/rpad的长度小于原字符串时会截断,substring的起始位置超出字符串长度时返回空;
  3. 性能影响:聚合函数、复杂字符串 / 日期函数在大数据量下可能影响查询效率,建议合理使用索引或限制查询范围;
  4. 兼容性:部分函数(如mysql_native_password)在不同 MySQL 版本中行为可能不同,需注意版本兼容。

文章转载自:

http://uHI03DMS.dxwgn.cn
http://LbfzXnSS.dxwgn.cn
http://yDDyGzoH.dxwgn.cn
http://E127oC90.dxwgn.cn
http://kIVcmUyK.dxwgn.cn
http://VXc6u27r.dxwgn.cn
http://aVqHcIDn.dxwgn.cn
http://YQdt28rq.dxwgn.cn
http://EJFYVJxO.dxwgn.cn
http://KKLM0yQT.dxwgn.cn
http://Jsq4qOLi.dxwgn.cn
http://ehuLRlqO.dxwgn.cn
http://3eHNPWOv.dxwgn.cn
http://SJU4Uk9t.dxwgn.cn
http://V0DQ8CVN.dxwgn.cn
http://XPlDeD3U.dxwgn.cn
http://9V9zG0mn.dxwgn.cn
http://01hlx0Bj.dxwgn.cn
http://NWHpaIti.dxwgn.cn
http://6JpcdRR5.dxwgn.cn
http://u5W31x1w.dxwgn.cn
http://sgqIpXPZ.dxwgn.cn
http://dzf82a4s.dxwgn.cn
http://SYZ2XA2d.dxwgn.cn
http://MmNXKZvL.dxwgn.cn
http://CUrdk3sp.dxwgn.cn
http://4RB64Xwf.dxwgn.cn
http://VDMRKguS.dxwgn.cn
http://uTT3vMBJ.dxwgn.cn
http://s0Xc7quo.dxwgn.cn
http://www.dtcms.com/a/382560.html

相关文章:

  • Redis内存回收:过期策略与淘汰策略
  • 【css学习笔记9】品优购项目
  • 动态规划解决网格路径问题
  • 金融科技:企业和机构银行
  • C++ 异常
  • One-hot encoding|独热编码
  • AI论文速读 | VisionTS++:基于持续预训练视觉主干网络的跨模态时间序列基础模型
  • 如何学习VBA_3.3.9:利用“搭积木”思想,快速有效地完成你的代码
  • 《使用深度学习统一时间相位展开框架》论文总结
  • Windows下使用PerfMon进行性能监控并记录日志
  • 微信小程序开发教程(十二)
  • 【攻防实战】记一次攻防实战全流程
  • 【编号520】全国4500多个地震灾害点位数据(2021.2-2025.8)
  • 牛客网习题题解(持续更新中...)
  • 2025.8.20--python基础温习
  • PCIE地址空间介绍
  • (三)BLE协议栈协议分层架构设计详解--图文结合通俗易懂
  • 主板硬件研发基础--DP/DP++
  • 287. 寻找重复数
  • 《从像素到认知:用 Keras 构建图像分类 CNN 的实战指南》
  • 深入探索 Python 元组:从基础到高级应用
  • Java 黑马程序员学习笔记(进阶篇5)
  • DENOISING DIFFUSION IMPLICIT MODELS
  • Gradle 安装与配置 环境配置 仓库管理 项目介绍 优缺点介绍
  • Replit CEO演讲:软件开发的未来与AI代理革命
  • LeetCode 3541.找到频率最高的元音和辅音:计数(位运算)
  • 使用Python创建本地Http服务实现与外部系统数据对接
  • Redis 线上问题排查简版手册
  • python学习之基本库/第三方库的认识和学习
  • 深度解析电动汽车绝缘材料的性能测试标准与解决方案