目录
[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)