文章目录
-
- [1 日期函数](#1 日期函数)
-
- [2 字符串函数](#2 字符串函数)
-
- [3 数学函数](#3 数学函数)
-
- [4 其它函数](#4 其它函数)
-
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() |
当前日期时间 |
日期函数示例
- 获得年月日:
sql
复制代码
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2025-10-25 |
+----------------+
1 row in set (0.00 sec)
- 获得时分秒:
sql
复制代码
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 11:51:50 |
+----------------+
1 row in set (0.00 sec)
- 获得时间戳:
sql
复制代码
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2025-10-25 11:52:13 |
+---------------------+
1 row in set (0.00 sec)
- 在日期的基础上加日期:
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)
- 在日期的基础上减去时间:
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)
- 计算两个日期之间相差的天数:(这里注意是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) |
分别去除字符串的前空格、后空格、前后空格 |
字符串函数案例
- 获取emp表的ename列的字符集:
sql
复制代码
mysql> select charset(ename) from EMP;
+----------------+
| charset(ename) |
+----------------+
| utf8mb4 |
+----------------+
14 rows in set (0.00 sec)
- 按指定格式显示学生分数(连接字符串):
sql
复制代码
-- 假设表名为student,包含name、chinese、math字段
select concat(name, '的语文是', chinese, '分,数学是', math, '分') as '分数' from student;
- 求学生姓名占用的字节数:
sql
复制代码
select length(name), name from student;
-- 注意:length按字节计数,如"张三"在UTF-8编码下length结果为6(1个中文占3字节)
- 替换字符串中的指定内容:
sql
复制代码
-- 将EMP表中ename字段里所有的'S'替换成'上海'
select replace(ename, 'S', '上海'), ename from EMP;
- 截取字符串:
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;
- 转换字符大小写并拼接:
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) |
数学函数示例
- 求绝对值:
sql
复制代码
mysql> select abs(-100.2);
+-------------+
| abs(-100.2) |
+-------------+
| 100.2 |
+-------------+
1 row in set (0.00 sec)
-- 结果:100.2
- 向上取整:
sql
复制代码
mysql> select ceiling(23.04);
+----------------+
| ceiling(23.04) |
+----------------+
| 24 |
+----------------+
1 row in set (0.00 sec)
-- 结果:24
- 向下取整:
sql
复制代码
mysql> select floor(23.7);
+-------------+
| floor(23.7) |
+-------------+
| 23 |
+-------------+
1 row in set (0.00 sec)
-- 结果:23
- 格式化数字(保留2位小数):
sql
复制代码
mysql> select format(12.3456, 2);
+--------------------+
| format(12.3456, 2) |
+--------------------+
| 12.35 |
+--------------------+
1 row in set (0.00 sec)
-- 结果:12.35(四舍五入)
- 生成随机数:
sql
复制代码
mysql>select rand();
+---------------------+
| rand() |
+---------------------+
| 0.14119383333362065 |
+---------------------+
1 row in set (0.00 sec)
-- 结果:随机浮点数(如0.654321)
- 进制转换:
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
- 取模(求余):
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的值 |
其它函数示例
- 查询当前用户:
sql
复制代码
select user();
-- 结果:| user() |
-- | root@localhost |(根据实际登录用户和主机变化)
- MD5摘要加密:
sql
复制代码
select md5('admin');
-- 结果:| md5('admin') |
-- | 21232f297a57a5a743894a0e4a801fc3 |
- 显示当前使用的数据库:
sql
复制代码
select database();
-- 结果:| database() |
-- | test |(根据实际使用的数据库变化)
- 用户密码加密:
sql
复制代码
select password('root');
-- 结果:| password('root') |
-- | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
- 处理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中经常出现