MySQL常用内置函数整理:提高你的查询效率

文章目录

1 日期函数

函数名称 描述
current_date() 当前日期
current_time() 当前时间
current_timestamp() 当前时间戳
date(datetime) 返回datetime参数的日期部分
date_add(date, interval d_value_type) 在date中添加日期或时间,interval后的数值单位可以是:year、minute、second、day
date_sub(date, interval d_value_type) 在date中减去日期或时间,interval后的数值单位可以是:year、minute、second、day
datediff(date1, date2) 两个日期的差,单位是天(date1减去date2)
now() 当前日期时间

日期函数示例

  1. 获得年月日:
sql 复制代码
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2025-10-25     |
+----------------+
1 row in set (0.00 sec)
  1. 获得时分秒:
sql 复制代码
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 11:51:50       |
+----------------+
1 row in set (0.00 sec)
  1. 获得时间戳:
sql 复制代码
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2025-10-25 11:52:13 |
+---------------------+
1 row in set (0.00 sec)
  1. 在日期的基础上加日期:
sql 复制代码
mysql> select date_add('2017-10-28', interval 10 day);
+-----------------------------------------+
| date_add('2017-10-28', interval 10 day) |
+-----------------------------------------+
| 2017-11-07                              |
+-----------------------------------------+
1 row in set (0.00 sec)
  1. 在日期的基础上减去时间:
sql 复制代码
mysql> select date_sub('2017-10-1', interval 2 day);
+---------------------------------------+
| date_sub('2017-10-1', interval 2 day) |
+---------------------------------------+
| 2017-09-29                            |
+---------------------------------------+
1 row in set (0.00 sec)
  1. 计算两个日期之间相差的天数:(这里注意是date1-date2!)
sql 复制代码
mysql> select datediff('2017-10-10', '2016-9-1');
+------------------------------------+
| datediff('2017-10-10', '2016-9-1') |
+------------------------------------+
|                                404 |
+------------------------------------+
1 row in set (0.00 sec)

日期函数案例

案例-1:创建表记录生日
sql 复制代码
-- 创建表
mysql>create table tmp(
id int primary key auto_increment,
birthday date
);

-- 添加当前日期到表中
mysql>insert into tmp(birthday) values(current_date());

-- 查询结果
mysql> select * from tmp;
+----+------------+
| id | birthday   |
+----+------------+
|  1 | 2025-10-25 |
+----+------------+
1 row in set (0.00 sec)
案例-2:创建留言表并查询指定条件数据
sql 复制代码
-- 创建留言表
mysql> create table msg (
id int primary key auto_increment,
content varchar(30) not null,
sendtime datetime
);

-- 插入数据(使用now()获取当前日期时间)
mysql> insert into msg(content,sendtime) values('hello1', now());
mysql> insert into msg(content,sendtime) values('hello2', now());

-- 查询所有留言,发布日期只显示日期(不显示时间)
mysql> select content, date(sendtime) from msg;
+---------+----------------+
| content | date(sendtime) |
+---------+----------------+
| hello1  | 2025-10-25     |
| hello2  | 2025-10-25     |
+---------+----------------+
2 rows in set (0.01 sec)

-- 查询2分钟内发布的帖子
mysql> select * from msg where date_add(sendtime, interval 2 minute) > now();
-- 理解:判断"留言发布时间+2分钟"是否晚于当前时间,若是则属于2分钟内发布的帖子

2 字符串函数

函数名称 描述
charset(str) 返回字符串字符集
concat(string2 [, ...]) 连接字符串
instr(string, substring) 返回substring在string中第一次出现的位置,没有则返回0,下标从1开始
ucase(string2) 转换成大写
lcase(string2) 转换成小写
left(string2, length) 从string2的左边起取length个字符
right(string2, length) 从string2的右边起取length个字符
length(string) 返回string的长度(以字节为单位:字母/数字占1字节,中文占多字节,与字符集相关)
replace(str, search_str, replace_str) 在str中用replace_str替换所有的search_str
strcmp(string1, string2) 逐字符比较两字符串大小(按字符的ASCII码值比较)
substring(str, position [, length]) 从str的position位置开始(position从1开始),取length个字符
ltrim(string)、rtrim(string)、trim(string) 分别去除字符串的前空格、后空格、前后空格

字符串函数案例

  1. 获取emp表的ename列的字符集:
sql 复制代码
mysql> select charset(ename) from EMP;
+----------------+
| charset(ename) |
+----------------+
| utf8mb4        |
+----------------+
14 rows in set (0.00 sec)
  1. 按指定格式显示学生分数(连接字符串):
sql 复制代码
-- 假设表名为student,包含name、chinese、math字段
select concat(name, '的语文是', chinese, '分,数学是', math, '分') as '分数' from student;
  1. 求学生姓名占用的字节数:
sql 复制代码
select length(name), name from student;
-- 注意:length按字节计数,如"张三"在UTF-8编码下length结果为6(1个中文占3字节)
  1. 替换字符串中的指定内容:
sql 复制代码
-- 将EMP表中ename字段里所有的'S'替换成'上海'
select replace(ename, 'S', '上海'), ename from EMP;
  1. 截取字符串:
sql 复制代码
-- 截取EMP表中ename字段的第2个到第3个字符(从位置2开始,取2个字符)
select substring(ename, 2, 2), ename from EMP;

-- (笔记补充)从EMP表中ename字段的右边起取2个字符
select right(ename, 2), ename from EMP;
  1. 转换字符大小写并拼接:
sql 复制代码
-- 以首字母小写的方式显示所有员工姓名(截取首字母转小写,再拼接剩余字符)
select concat(lcase(substring(ename, 1, 1)), substring(ename, 2)) from EMP;

3 数学函数

函数名称 描述
abs(number) 绝对值函数
bin(decimal_number) 将十进制数转换为二进制字符串
hex(decimalNumber) 将十进制数转换为十六进制字符串
conv(number, from_base, to_base) 进制转换(将number从from_base进制转换为to_base进制) ,可以替代上面的进制转换函数
ceiling(number) 向上去整(如3.1→4,-3.1→-3)
floor(number) 向下去整(如3.7→3,-3.1→-4)
format(number, decimal_places) 格式化数字,保留decimal_places位小数(小数部分四舍五入)
rand() 返回随机浮点数,范围为[0.0, 1.0)
mod(number, denominator) 取模(求余),结果与number的符号一致(如mod(7,3)=1,mod(-7,3)=-1)

数学函数示例

  1. 求绝对值:
sql 复制代码
mysql> select abs(-100.2);
+-------------+
| abs(-100.2) |
+-------------+
|       100.2 |
+-------------+
1 row in set (0.00 sec)
-- 结果:100.2
  1. 向上取整:
sql 复制代码
mysql> select ceiling(23.04);
+----------------+
| ceiling(23.04) |
+----------------+
|             24 |
+----------------+
1 row in set (0.00 sec)
-- 结果:24
  1. 向下取整:
sql 复制代码
mysql> select floor(23.7);
+-------------+
| floor(23.7) |
+-------------+
|          23 |
+-------------+
1 row in set (0.00 sec)
-- 结果:23
  1. 格式化数字(保留2位小数):
sql 复制代码
mysql> select format(12.3456, 2);
+--------------------+
| format(12.3456, 2) |
+--------------------+
| 12.35              |
+--------------------+
1 row in set (0.00 sec)
-- 结果:12.35(四舍五入)
  1. 生成随机数:
sql 复制代码
mysql>select rand();
+---------------------+
| rand()              |
+---------------------+
| 0.14119383333362065 |
+---------------------+
1 row in set (0.00 sec)
-- 结果:随机浮点数(如0.654321)
  1. 进制转换:
sql 复制代码
-- 将十进制10转换为二进制
mysql> select bin(10);
+---------+
| bin(10) |
+---------+
| 1010    |
+---------+
1 row in set (0.00 sec)
-- 结果:1010

-- 将十进制10转换为十六进制
mysql> select hex(10);
+---------+
| hex(10) |
+---------+
| A       |
+---------+
1 row in set (0.00 sec)
-- 结果:A

-- 将二进制1010(即十进制10)转换为八进制
mysql> select conv(1010, 2, 8);
+------------------+
| conv(1010, 2, 8) |
+------------------+
| 12               |
+------------------+
1 row in set (0.00 sec)
-- 结果:12
  1. 取模(求余):
sql 复制代码
mysql> select mod(7, 3), mod(-7, 3);
+-----------+------------+
| mod(7, 3) | mod(-7, 3) |
+-----------+------------+
|         1 |         -1 |
+-----------+------------+
1 row in set (0.00 sec)

4 其它函数

函数名称 描述
user() 查询当前登录的MySQL用户(格式为"用户名@登录主机")
md5(str) 对字符串str进行MD5摘要,生成32位十六进制字符串(常用于密码加密存储)
database() 显示当前正在使用的数据库
password() MySQL用于对用户密码进行加密的函数(生成41位加密字符串,仅用于用户认证)
ifnull(val1, val2) 判断val1是否为null:若val1为null,返回val2;否则返回val1的值

其它函数示例

  1. 查询当前用户:
sql 复制代码
select user();
-- 结果:| user()          |
--       | root@localhost  |(根据实际登录用户和主机变化)
  1. MD5摘要加密:
sql 复制代码
select md5('admin');
-- 结果:| md5('admin')                          |
--       | 21232f297a57a5a743894a0e4a801fc3     |
  1. 显示当前使用的数据库:
sql 复制代码
select database();
-- 结果:| database() |
--       | test       |(根据实际使用的数据库变化)
  1. 用户密码加密:
sql 复制代码
select password('root');
-- 结果:| password('root')                          |
--       | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
  1. 处理null值:
sql 复制代码
-- val1不为null,返回val1
select ifnull('abc', '123');
-- 结果:abc

-- val1为null,返回val2
select ifnull(null, '123');
-- 结果:123

#tips:ifnull需要与select搭配使用 
#eg.select ifnull(...,null) as 别名;这在Oj中经常出现
相关推荐
chxii4 小时前
ISO 8601日期时间标准及其在JavaScript、SQLite与MySQL中的应用解析
开发语言·javascript·数据库
bug攻城狮6 小时前
SaaS多租户架构实践:字段隔离方案(共享数据库+共享Schema)
mysql·架构·mybatis·springboot·1024程序员节
小丁爱养花6 小时前
Redis 内部编码/单线程模型/string
数据库·redis·缓存·1024程序员节
l1t6 小时前
利用DuckDB SQL求解集合数学题
数据库·sql·算法·集合·duckdb
siriuuus6 小时前
MySQL 慢查询日志及优化
mysql·1024程序员节
筵陌6 小时前
MYSQL表的操作
数据库·mysql·1024程序员节
一 乐7 小时前
汽车销售|汽车推荐|基于SprinBoot+vue的新能源汽车个性化推荐系统(源码+数据库+文档)
java·数据库·vue.js·汽车·毕设·汽车个性化推荐