文章目录
- 前言
- [1. 日期函数](#1. 日期函数)
-
- [1.1 current_date():获取当前日期](#1.1 current_date():获取当前日期)
- [1.2 current_time():获取当前时间](#1.2 current_time():获取当前时间)
- [1.3 select current_timestamp():获取当前时间戳](#1.3 select current_timestamp():获取当前时间戳)
- [1.4 now():获取当前日期+时间](#1.4 now():获取当前日期+时间)
- [1.5 date(datetime):返回datetime参数的日期部分](#1.5 date(datetime):返回datetime参数的日期部分)
- [1.6 date_add()](#1.6 date_add())
- [1.7 date_sub()](#1.7 date_sub())
- [1.8 datediff():计算两个日期之间相差时间](#1.8 datediff():计算两个日期之间相差时间)
- [1.9 案例一](#1.9 案例一)
- [1.10 案例二(留言板)](#1.10 案例二(留言板))
- [2. 字符串函数](#2. 字符串函数)
-
- [2.1 charset():返回参数字符串采用的字符集](#2.1 charset():返回参数字符串采用的字符集)
- [2.2 concat():连接字符串](#2.2 concat():连接字符串)
- [2.3 instr(string,sub):返回字串在主串中出现的位置](#2.3 instr(string,sub):返回字串在主串中出现的位置)
- [2.4 ucase():将参数字符串转换为大写](#2.4 ucase():将参数字符串转换为大写)
- [2.5 lcase():将参数字符串转换为小写](#2.5 lcase():将参数字符串转换为小写)
- [2.6 left(string,length):在string中从左边开始取length个字符](#2.6 left(string,length):在string中从左边开始取length个字符)
- [2.7 length(string):求字符串占用字节数](#2.7 length(string):求字符串占用字节数)
- [2.8 replace(str,search_str,replace _str):将字符串str中的search_str字串替换成replace_str](#2.8 replace(str,search_str,replace _str):将字符串str中的search_str字串替换成replace_str)
- [2.9 strcmp(str1,str2):字符串比较](#2.9 strcmp(str1,str2):字符串比较)
- [2.10 substring(str,position,length)](#2.10 substring(str,position,length))
- [2.11 trim(),ltrim(),rtrim()](#2.11 trim(),ltrim(),rtrim())
- [2.12 综合案例:以首字母小写的方式显示所有员工的姓名](#2.12 综合案例:以首字母小写的方式显示所有员工的姓名)
前言
MySQL提供了数百个内置函数,涵盖数据处理、计算、转换、分析等各个方面。这些函数就像SQL的"瑞士军刀",让数据处理变得异常强大!
前面的文章中我们以及学习了其中的聚合函数,这篇文件再来讲解一些其它的常用内置函数
1. 日期函数

下面通过例子来讲解它们的使用
1.1 current_date():获取当前日期
要获取当前日期,就可以使用current_date()函数
怎么用呢?
select current_date();

1.2 current_time():获取当前时间
sql
select current_time();

1.3 select current_timestamp():获取当前时间戳
sql
select current_timestamp();
时间戳:从1970年1月1日00时00分00秒开始总秒数,表示为 yyyy-mm-dd HH:ii:ss 格式

1.4 now():获取当前日期+时间
sql
select now();

我们看到他和select current_timestamp();的返回结果是一样的
1.5 date(datetime):返回datetime参数的日期部分
演示一下:
sql
select date('2025-12-20 08:00:00');

那我们上面学的now()不是会返回当前时间嘛,所以也可以这样:
sql
select date(now());
将now()的返回值作为date函数的参数

1.6 date_add()

举个栗子:
今天是2026-02-08,我想在这个日期的基础上+10天,看得到的新日期是多少
+40天
interval后面的单位可以是year,minute,second,day
我们来试试其它的
+三年
+300分钟
加300分钟后日期是不变的,而且我们看到后面显示的时间是05:00:00,5小时刚好300分钟,所以参数日期时间字符串中若不包含时间部分,MySQL会将其默认为'00:00:00'
当然指定日期的同时我们可以手动指定具体的时间。
比如:
在当前时间的基础上+10分钟
select date_add(now(),interval 10 minute);
+20秒
当然没用那么准确,因为当前时间是一直在变化的。
上面都是+,当然也可以-
1.7 date_sub()

比如:

用法和date_sub是一样的,就不过多介绍了。
1.8 datediff():计算两个日期之间相差时间
sql
select datediff('2026-02-08','2025-12-21');

1.9 案例一
创建一张表,记录生日
sql
create table tmp(
id int primary key auto_increment,
birthday date not null
);

然后我们来插入一些数据:
我们可以自己给一个日期,比如
当然也可以插入上面我们学的日期函数的返回值
比如:
插入当前日期current_date
时间戳也可以
当前时间current_time其实也可以
当然建议你如果插入日期最好就只用current_date
1.10 案例二(留言板)
创建一个留言表:
sql
create table msg (
id int primary key auto_increment,
content varchar(30) not null,
sendtime datetime
);

我们平时在一些社交媒体平台比如微博抖音等发表评论的时候,发出去的时候会自动带上发布的时间和IP。
那现在如果我们在留言表中插入评论时,想让他带上发布的时间,其实也很简单
插入的时候时间这一列我们直接插入now()就可以了
这样插入的时候就自动记录了发布评论的时间
如果只显示评论日期,不显示后面的具体时间
查询两分钟内发布的评论
即当前时间-评论发布的时间<2分钟
也即评论发布时间+2分钟>当前时间
那我们上面学到的函数就可以用到了
select * from msg where date_add(sendtime,interval 2 minute)>now();
现在查到是空,因为所有评论发布都已经超过两分钟了
现在我来新插入一条
然后就可以查到了
2. 字符串函数

2.1 charset():返回参数字符串采用的字符集
比如:
sql
select charset('dshuidhs');
sql
select charset('中国');

传其他非字符串类型的参数会被转换成字符串:
比如:
当 CHARSET() 函数收到数字时,MySQL 会先将其转换为二进制字符串
binary 表示数据以原始二进制形式存储,没有字符编码
另外,如果表中某列的类型是字符串类型,也可以作为参数:
结果就会显示该列所有数据的字符集
那我们什么时候会使用这个东西呢?
比如我们在查看一个表的时候,发现某列的数据中,有些是正常显示的,但是有些出现了乱码。那一定是编码出现了问题,这时候就可以查看一下该列数据采用的编码。
2.2 concat():连接字符串
比如:
sql
select concat('hello ','world');

参数可以有多个:


传其他类型会被转换为字符串然后拼接:

案例:要求显示exam_result表中的信息,显示格式:"XXX的语文是XXX分,数学XXX分,英语XXX分"
回到我们之前文章中用到的这张表
现在要显示所有同学的成绩,格式为:XXX的语文是XXX分,数学XXX分,英语XXX分
那我们拼接一下就可以
select concat(name,'的语文成绩是',chinese,',数学成绩是',math,',英语成绩是',english) from exam_result;
2.3 instr(string,sub):返回字串在主串中出现的位置
返回sub在string中出现的位置(从1开始),没有找到则返回0
举例:
select instr('dsfdfhds123snj','123');
如果查找一个不存在的字串
则返回0
2.4 ucase():将参数字符串转换为大写
举例:
sql
select ucase('dsakand888JSJSJSN');

2.5 lcase():将参数字符串转换为小写
举例:
sql
select lcase('dsakand888JSJSJSN');

2.6 left(string,length):在string中从左边开始取length个字符
举例:
sql
select left('dadas12312',5);

当然也有right,那就是从右边开始取length个字符

2.7 length(string):求字符串占用字节数
length函数返回字符串长度,以字节为单位 。
如果是多字节字符则计算多个字节数;如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)
举例:
一个英文字符一个字节,故长度为7
一个中文字符占3个字节(部分生僻字可能占4个字节),故这里长度为6
求学生表中学生姓名列所有数据占用的字节数:
select length(name), name from student;
2.8 replace(str,search_str,replace _str):将字符串str中的search_str字串替换成replace_str
举例:

案例:将EMP表中所有名字中有S的替换成'上海'
现在要将名字这一列中的所有's'替换成'上海'
select replace(ename,'S','上海'),ename from emp;
当然这并不会修改表中的内容
2.9 strcmp(str1,str2):字符串比较
MySQL中的strcmp(str1,str2)其实就类似我们之前C语言中学的strcmp函数:
比较它们对应位置的字符,一个一个的比较,如果相等就比较下一个,不相等的时候,看两个字符谁大谁小,返回对应的值。
但是MySQL中的strcmp默认不区分大小写
2.10 substring(str,position,length)
substring(str,position,length):
从str的position位置开始(第一个字符的位置是1),截取length个字符(不指明length则默认截取到结尾)
案例:截取EMP表中ename字段的第二个到第三个字符
即第2个和第3个两个字符
select substring(ename,2,2),ename from emp;
2.11 trim(),ltrim(),rtrim()
TRIM(), LTRIM(), RTRIM() 是 MySQL 中用于去除字符串首尾空白字符的三个重要函数,对于数据清洗、用户输入处理等场景非常有用。
举例:

中间的空格不做处理

2.12 综合案例:以首字母小写的方式显示所有员工的姓名

怎么做?
将名字的首字母变成小写,其余不动,那我们先想办法把首字母和剩余部分分开
然后我们就可以将第一个字符变成小写
然后再将这两部分拼接起来即可
select ename,concat(lcase(substring(ename,1,1)),substring(ename,2)) from emp;



































