MySQL 内置函数:日期函数、字符串函数、数学函数、其他函数

目录

[1. 日期函数](#1. 日期函数)

[1.1 案例](#1.1 案例)

[1.2 留言表](#1.2 留言表)

[2. 字符串函数](#2. 字符串函数)

[2.1 案例](#2.1 案例)

[3. 数学函数](#3. 数学函数)

[3.1 案例](#3.1 案例)

[4. 其他函数](#4. 其他函数)

[4.1 案例](#4.1 案例)


1. 日期函数

  • date():从日期时间中提取日期,'2024-05-20 14:30:45' -> '2024-05-20'

1.1 案例

  • 获得年月日
sql 复制代码
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2026-08-17     |
+----------------+
1 row in set (0.00 sec)
  • 获得时分秒
sql 复制代码
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 21:52:20       |
+----------------+
1 row in set (0.01 sec)
  • 获得时间戳
sql 复制代码
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2026-08-17 21:52:57 |
+---------------------+
1 row in set (0.00 sec)
  • 在日期的基础上加日期
sql 复制代码
mysql> select date_add('2027-10-28',interval 40 day);
+----------------------------------------+
| date_add('2027-10-28',interval 40 day) |
+----------------------------------------+
| 2027-12-07                             |
+----------------------------------------+
1 row in set (0.00 sec)
  • 在日期的基础上减去时间
sql 复制代码
mysql> select date_sub('2027-10-28',interval 40 day);
+----------------------------------------+
| date_sub('2027-10-28',interval 40 day) |
+----------------------------------------+
| 2027-09-18                             |
+----------------------------------------+
1 row in set (0.00 sec)
  • 计算两个日期前之间相差多少天
  • datediff(day1,day2),结果是 day1 - day2
sql 复制代码
mysql> select datediff('2001-01-10','2028-01-09');
+-------------------------------------+
| datediff('2001-01-10','2028-01-09') |
+-------------------------------------+
|                               -9860 |
+-------------------------------------+
1 row in set (0.00 sec)
  • 获取当前日期时间
sql 复制代码
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2026-08-17 21:58:03 |
+---------------------+
1 row in set (0.00 sec)

1.2 留言表

sql 复制代码
mysql> create table msg (
    ->  id int primary key auto_increment,
    ->  content varchar(30) not null,
    ->  sendtime datetime
    ->  );
Query OK, 0 rows affected (0.03 sec)


-- 插入数据
mysql> insert into msg(content,sendtime) values('hello1', now());
Query OK, 1 row affected (0.01 sec)

mysql> insert into msg(content,sendtime) values('hello2', now());
Query OK, 1 row affected (0.00 sec)

mysql> select *from msg;
+----+---------+---------------------+
| id | content | sendtime            |
+----+---------+---------------------+
|  1 | hello1  | 2026-08-17 21:59:43 |
|  2 | hello2  | 2026-08-17 21:59:52 |
+----+---------+---------------------+
2 rows in set (0.00 sec)

-- 只显示日期,不显示时间
mysql> select content,date(sendtime) from msg;
+---------+----------------+
| content | date(sendtime) |
+---------+----------------+
| hello1  | 2026-08-17     |
| hello2  | 2026-08-17     |
+---------+----------------+
2 rows in set (0.00 sec)

-- 查询 2 分钟以内发布的信息
mysql> select *from msg where date_add(sendtime,interval 5 minute)>now();
+----+---------+---------------------+
| id | content | sendtime            |
+----+---------+---------------------+
|  1 | hello1  | 2026-08-17 21:59:43 |
|  2 | hello2  | 2026-08-17 21:59:52 |
+----+---------+---------------------+
2 rows in set (0.00 sec)

2. 字符串函数

2.1 案例

  • 获取字段的字符集
sql 复制代码
mysql> select charset(ename) from emp;
+----------------+
| charset(ename) |
+----------------+
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
+----------------+
  • 将成绩表中的信息连接起来显示
sql 复制代码
mysql> select concat('姓名:',name,',语文成绩:',chinese,',数据成绩:',math) 
    ->from exam_result;
+-----------------------------------------------------------------------------+
| concat('姓名:',name,',语文成绩:',chinese,',数据成绩:',math)              |
+-----------------------------------------------------------------------------+
| 姓名:唐三藏,语文成绩:134,数据成绩:98                                     |
| 姓名:猪悟能,语文成绩:176,数据成绩:98                                     |
| 姓名:曹孟德,语文成绩:140,数据成绩:90                                     |
| 姓名:刘玄德,语文成绩:110,数据成绩:115                                    |
| 姓名:孙权,语文成绩:140,数据成绩:73                                       |
| 姓名:宋公明,语文成绩:150,数据成绩:95                                     |
+-----------------------------------------------------------------------------+
6 rows in set (0.00 sec)
  • 求数据所占用的字节数
  • length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)
  • uff8 中,中文占 3 字节,英文占 2 字节,数字占 1 字节
sql 复制代码
mysql> select length(name) name,length(chinese) ch from exam_result;
+------+------+
| name | ch   |
+------+------+
|    9 |    3 |
|    9 |    3 |
|    9 |    3 |
|    9 |    3 |
|    6 |    3 |
|    9 |    3 |
+------+------+
6 rows in set (0.00 sec)
  • 将名字中的所有 S 换成 '福建'
sql 复制代码
mysql> select ename,replace(ename,'S','福建') from emp;
+--------+-----------------------------+
| ename  | replace(ename,'S','福建')   |
+--------+-----------------------------+
| SMITH  | 福建MITH                    |
| ALLEN  | ALLEN                       |
| WARD   | WARD                        |
| JONES  | JONE福建                    |
| MARTIN | MARTIN                      |
| BLAKE  | BLAKE                       |
| CLARK  | CLARK                       |
| SCOTT  | 福建COTT                    |
| KING   | KING                        |
| TURNER | TURNER                      |
| ADAMS  | ADAM福建                    |
| JAMES  | JAME福建                    |
| FORD   | FORD                        |
| MILLER | MILLER                      |
+--------+-----------------------------+
14 rows in set (0.01 sec)
  • 截取字段数据的第 2 ~ 3 个字符
sql 复制代码
mysql> select ename,substring(ename,2,3) from emp;
+--------+----------------------+
| ename  | substring(ename,2,3) |
+--------+----------------------+
| SMITH  | MIT                  |
| ALLEN  | LLE                  |
| WARD   | ARD                  |
| JONES  | ONE                  |
| MARTIN | ART                  |
| BLAKE  | LAK                  |
| CLARK  | LAR                  |
| SCOTT  | COT                  |
| KING   | ING                  |
| TURNER | URN                  |
| ADAMS  | DAM                  |
| JAMES  | AME                  |
| FORD   | ORD                  |
| MILLER | ILL                  |
+--------+----------------------+
14 rows in set (0.00 sec)
  • 以首字母小写的方式展示所有名字
sql 复制代码
mysql> select ename,
    ->concat(lcase(substring(ename,1,1)),substring(ename,2)) '首字母小写' 
    ->from emp;
+--------+-----------------+
| ename  | 首字母小写      |
+--------+-----------------+
| SMITH  | sMITH           |
| ALLEN  | aLLEN           |
| WARD   | wARD            |
| JONES  | jONES           |
| MARTIN | mARTIN          |
| BLAKE  | bLAKE           |
| CLARK  | cLARK           |
| SCOTT  | sCOTT           |
| KING   | kING            |
| TURNER | tURNER          |
| ADAMS  | aDAMS           |
| JAMES  | jAMES           |
| FORD   | fORD            |
| MILLER | mILLER          |
+--------+-----------------+
14 rows in set (0.00 sec)

3. 数学函数

3.1 案例

  • 绝对值
sql 复制代码
mysql> select abs(-10);
+----------+
| abs(-10) |
+----------+
|       10 |
+----------+
1 row in set (0.00 sec)
  • 向上取整
sql 复制代码
mysql> select ceiling(3.1),ceiling(3.9);
+--------------+--------------+
| ceiling(3.1) | ceiling(3.9) |
+--------------+--------------+
|            4 |            4 |
+--------------+--------------+
1 row in set (0.00 sec)

mysql> select ceiling(-3.1),ceiling(-3.9);
+---------------+---------------+
| ceiling(-3.1) | ceiling(-3.9) |
+---------------+---------------+
|            -3 |            -3 |
+---------------+---------------+
1 row in set (0.00 sec)
  • 向下取整
sql 复制代码
mysql> select floor(3.1),floor(3.9);
+------------+------------+
| floor(3.1) | floor(3.9) |
+------------+------------+
|          3 |          3 |
+------------+------------+
1 row in set (0.00 sec)

mysql> select floor(-3.1),floor(-3.9);
+-------------+-------------+
| floor(-3.1) | floor(-3.9) |
+-------------+-------------+
|          -4 |          -4 |
+-------------+-------------+
1 row in set (0.00 sec)
  • 保留 2 位小数位数(小数四舍五入)
sql 复制代码
mysql> select format(3.1415926,2);
+---------------------+
| format(3.1415926,2) |
+---------------------+
| 3.14                |
+---------------------+
1 row in set (0.00 sec)

mysql> select format(3.1465926,2);
+---------------------+
| format(3.1465926,2) |
+---------------------+
| 3.15                |
+---------------------+
1 row in set (0.00 sec)
  • 产生随机数
  • rand 的范围是 [0,1)
sql 复制代码
mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.6491011014665488 |
+--------------------+
1 row in set (0.01 sec)

mysql> select format(rand()*1000,0);
+-----------------------+
| format(rand()*1000,0) |
+-----------------------+
| 774                   |
+-----------------------+
1 row in set (0.00 sec)

4. 其他函数

  • user() :查询当前用户
  • md5(str) :对一个字符串进行 md5 摘要,摘要后得到一个 32 位的字符串
  • database():显示当前正在使用的数据库
  • password():用于对用户密码进行哈希加密,返回 41 位字符串
  • ifnull(val1, val2):val1为null,返回val2,否则返回val1的值

4.1 案例

  • user() 查询当前用户
sql 复制代码
mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
  • md5(str) 对一个字符串进行 md5 摘要,摘要后得到一个 32 位的字符串
  • 可以用来向数据库中插入密文密码
sql 复制代码
mysql> select md5(123);
+----------------------------------+
| md5(123)                         |
+----------------------------------+
| 202cb962ac59075b964b07152d234b70 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select md5(1234567);
+----------------------------------+
| md5(1234567)                     |
+----------------------------------+
| fcea920f7412b5da7be0cf42b8c93759 |
+----------------------------------+
1 row in set (0.00 sec)
  • database() 显示当前正在使用的数据库
sql 复制代码
mysql> select database();
+------------+
| database() |
+------------+
| scott      |
+------------+
1 row in set (0.00 sec)
  • password() 函数,使用该函数对密码进行加密
  • MySQKL 5.7 及之前:password() 函数可用,用于对用户密码进行哈希加密,返回 41 位字符串。
  • MySQKL 8.0 及之后,出于安全考虑,官方彻底移除了 password() 函数
sql 复制代码
mysql->select password('root');
 +-------------------------------------------+
 | password('root')                         |
 +-------------------------------------------+
 | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
 +-------------------------------------------+
  • ifnull(val1,val2),如果 val1 为 null,返回 val2,否则返回 val1
sql 复制代码
mysql> select ifnull(null,100);
+------------------+
| ifnull(null,100) |
+------------------+
|              100 |
+------------------+
1 row in set (0.00 sec)

mysql> select ifnull(1,100);
+---------------+
| ifnull(1,100) |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)
相关推荐
ClouGence2 小时前
当 AI 开始直接操作数据库,传统数据库管理工具还有必要吗?
数据库·后端·agent
渣渣盟2 小时前
误删数据之后:MySQL、PostgreSQL、Oracle三库紧急恢复完全实操手册
mysql·postgresql·oracle
Hugh-Yu-1301232 小时前
zhangxuefeng-skill配置教程
数据库
布莱克6052 小时前
理解B+树:原理、特性与应用场景
数据结构·数据库·mysql
冰暮流星3 小时前
mysql之排序查询
数据库·mysql
7177773 小时前
让权限治理成为可复制资产:Gitee Team 空间配置方案与安全级别落地详解
数据库·gitee
今天AI了吗3 小时前
Agent & AI 名词大扫盲
数据库·人工智能·python·sql·rust
葡萄城技术团队3 小时前
告别宽表拖拽:SpreadJS 如何让 Web 表格承接 Excel 操作习惯
数据库·html·excel
2603_966437264 小时前
格式化之后数据还能恢复吗?说清恢复条件
linux·运维·数据库