【MySQL】数据处理的瑞士军刀——常用的内置函数(上)

文章目录

  • 前言
  • [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;

相关推荐
萧曵 丶9 小时前
Vue 中父子组件之间最常用的业务交互场景
javascript·vue.js·交互
e***8909 小时前
MySQL 8.0版本JDBC驱动Jar包
数据库·mysql·jar
冬奇Lab10 小时前
Android系统启动流程深度解析:从Bootloader到Zygote的完整旅程
android·源码阅读
Amumu1213810 小时前
Vue3扩展(二)
前端·javascript·vue.js
NEXT0610 小时前
JavaScript进阶:深度剖析函数柯里化及其在面试中的底层逻辑
前端·javascript·面试
牛奶12 小时前
你不知道的 JS(上):原型与行为委托
前端·javascript·编译原理
泓博12 小时前
Android中仿照View selector自定义Compose Button
android·vue.js·elementui
牛奶12 小时前
你不知道的JS(上):this指向与对象基础
前端·javascript·编译原理
牛奶12 小时前
你不知道的JS(上):作用域与闭包
前端·javascript·电子书
zhangphil13 小时前
Android性能分析中trace上到的postAndWait
android