开始之前,先明确一下这篇教程的核心内容:
- 深入理解 MySQL 内置函数的功能与用途,掌握其实际调用方法。
- 熟练运用常用字符串函数、数值函数、日期函数,实现对数据的快速处理与转换。
- 掌握聚合函数的使用技巧,完成数据统计与分析任务。
- 学会条件判断函数,在 SQL 中实现灵活的逻辑判断与分支处理。
- 最终能够在真实查询场景中灵活组合这些函数,大幅提升数据查询与处理效率。
一.函数
1.日期函数
1.1.介绍与简单使用
| 函数名称 | 描述 |
|---|---|
| current_date() | 获取当前系统日期 |
| current_time() | 获取当前系统时间 |
| current_timestamp() | 获取当前时间戳(日期+时间) |
| date(datetime) | 返回 datetime 参数中的日期部分 |
| date_add(date, interval d_value_type) | 在指定日期上增加一段时间,interval 后的单位可选:year、month、day、hour、minute、second |
| date_sub(date, interval d_value_type) | 在指定日期上减去一段时间,interval 后的单位可选:year、month、day、hour、minute、second |
| datediff(date1, date2) | 计算两个日期相差的天数 |
| now() | 获取当前日期和时间 |
使用案例:
先看几个基础用法——获取当前日期:
select current_date();

获取当前时间(仅显示时分秒):
select current_time();

获取时间戳,即完整的日期时间信息:
select current_timestamp();

select now();

注意:current_timestamp() 和 now() 返回结果几乎相同,区别在于前者是 SQL 标准函数,后者是 MySQL 中更常用、更简洁的写法。
在日期基础上增加一段时间:
select date_add('2017-10-28', interval 10 day);select date_add('2017-10-28', interval 10 year);select date_add('2017-10-28', interval 10 month);

减去时间也是同样的操作方式:
select date_sub('2027-10-1', interval 2 day);select date_sub('2027-10-1', interval 2 month);select date_sub('2027-10-1', interval 2 year);

计算两个日期之间相差的具体天数:
select datediff('2027-10-10', '2066-9-1');

1.2.案例演示
创建一个用于记录生日的表:
create table tmp(id int primary key auto_increment,birthday date);
insert into tmp (birthday) values(current_date());

再创建一个留言板表:
create table msg(id int primary key auto_increment,content varchar(30) not null,sendtime datetime);
insert into msg(content,sendtime) values('hello1', now());insert into msg(content,sendtime) values('少偶好甜', now());

如果只想显示留言的日期,不显示具体时间,可以使用 date() 提取日期部分:
select content,date(sendtime) from msg;

再比如,查询在2分钟内发布的帖子,具体思路如下:

insert into msg(content,sendtime) values('少偶99', now());select * from msg where date_add(sendtime, interval 2 minute) > now();

2.字符串函数
2.1.介绍
| 函数名称 | 描述 |
|---|---|
charset(str) | 返回字符串的字符集名称 |
concat(string1 [, string2, ...]) | 连接多个字符串为一个整体 |
instr(string, substring) | 返回 substring 在 string 中首次出现的位置,未找到时返回 0 |
ucase(string) | 将字符串转换为全大写 |
lcase(string) | 将字符串转换为全小写 |
left(string, length) | 从字符串左侧截取指定长度的字符 |
length(string) | 返回字符串的长度(以字节为单位) |
replace(str, search_str, replace_str) | 将字符串 str 中的 search_str 替换为 replace_str |
strcmp(string1, string2) | 逐字符比较两个字符串大小 |
substring(str, position [, length]) | 从 str 的指定位置开始截取指定长度的字符(省略 length 时截取到末尾) |
ltrim(string) | 去除字符串左侧的空格 |
rtrim(string) | 去除字符串右侧的空格 |
trim(string) | 去除字符串两端的空格 |
2.2.使用实例
注意:下面用到的表是之前已经创建好的。
获取 emp 表中 ename 列的字符集:
select charset(ename) from emp;

要求显示 exam_result 表中的信息,格式为“XXX的语文是XX分,数学XX分,英语XX分”:
select concat(name, '的语文是',chinese,'分,数学是',math,'分') as '分数' from exam_result;

求学生姓名占用的字节数(注意:length 返回的是字节数,多字节字符如中文会占用多个字节):
select length(name), name from exam_result;

举个例子,字母和数字各占一个字节,而中文则根据字符集编码可能占用多个字节:

将 emp 表中所有名字里的 'S' 替换成 '上海':
select replace(ename, 's', '上海') ,ename from emp;

字符串大小写转换:
select ucase('ASDddf');select ucase('aaaddf');select lcase('ASDFGH');select lcase('ASsdgsGH');

截取 emp 表中 ename 字段的第二个到第三个字符:
select substring(ename, 2, 2), ename from emp;

以首字母小写的方式显示所有员工姓名:

去除字符串空格:
select ltrim(' sdssf');select rtrim('sdssf ');select rtrim(' sdssf ');

逐字符比较两个字符串的大小:
select strcmp('fgdsf','dsdsd');

3.数学函数
1.介绍
| 函数名称 | 描述 |
|---|---|
abs(number) | 返回数值的绝对值 |
bin(decimal_number) | 将十进制数转换为二进制字符串 |
hex(decimal_number) | 将十进制数转换为十六进制字符串 |
conv(number, from_base, to_base) | 在不同进制之间进行转换 |
ceiling(number) | 向上取整(返回不小于该数的最小整数) |
floor(number) | 向下取整(返回不大于该数的最大整数) |
format(number, decimal_places) | 格式化数字,保留指定小数位数(四舍五入) |
rand() | 返回 [0.0, 1.0) 范围内的随机浮点数 |
mod(number, denominator) | 取模运算,返回余数 |
2.使用案例
绝对值:
select abs(-1);select abs(-100);

进制转换:
select bin(10);select bin(100);

select hex(16);select hex(160);

select conv(10,10,2); //10进制到二进制的转换select conv(10,10,3); //10进制到三进制的转换select conv(10,10,16); //10进制到十六进制的转换

取整:
select ceiling(23.04);select floor(23.04);

保留指定小数位数(四舍五入):
select format(12.3456, 2);select format(3.1415926, 2);select format(3.1415926, 10);

生成随机数:
select rand(); select rand();

想要范围更大,直接乘以对应倍数即可:
select rand()*1000;

取模(求余数):
select mod(10,2);select mod(10,3);select mod(100,5.6);

4.其它函数
查询当前登录用户:
select user();

MD5 摘要,对一个字符串进行 MD5 加密,得到 32 位十六进制字符串:
select md5('admin');

显示当前正在使用的数据库名称:
select database();

MySQL 的 password() 函数用于对用户密码进行加密处理:
select password('root');

ifnull(val1, val2):如果 val1 为 null,则返回 val2,否则返回 val1:
select ifnull('abc', '123');select ifnull(null, '123');

总结:本文系统介绍了 MySQL 中常用的内置函数,涵盖日期函数、字符串函数、数学函数以及其他实用函数。日期函数用于获取和处理日期时间数据,能方便地进行时间计算与日期格式化;字符串函数支持拼接、截取、替换、大小写转换等操作;数学函数提供绝对值、取整、随机数、进制转换等常见运算;此外还学习了 user()、database()、md5()、ifnull() 等实用工具。熟练掌握这些内置函数,不仅可以简化 SQL 编写、提升开发效率,还能减少应用层代码的负担,使数据处理更加灵活高效,为后续学习高级查询、视图、存储过程等知识打下坚实基础。
