【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) 两个日期的差,单位是天
now() 当前日期时间
  • 样例
cpp 复制代码
//获取当前的年月日
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2025-06-24     |
+----------------+
1 row in set (0.00 sec)

//获取当前的时分秒
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 14:50:45       |
+----------------+
1 row in set (0.00 sec)

//获取当前的时间戳
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2025-06-24 14:51:15 |
+---------------------+
1 row in set (0.00 sec)

//返回获取时间戳的日期部分
mysql> select date(current_timestamp());
+---------------------------+
| date(current_timestamp()) |
+---------------------------+
| 2025-06-24                |
+---------------------------+
1 row in set (0.00 sec)

//当前日期+5天
mysql> select date_add('2004-02-20',interval 5 day);
+---------------------------------------+
| date_add('2004-02-20',interval 5 day) |
+---------------------------------------+
| 2004-02-25                            |
+---------------------------------------+
1 row in set (0.00 sec)

//当前日期减去10天
mysql> select date_sub('2025=06-24',interval 10 day);
+----------------------------------------+
| date_sub('2025=06-24',interval 10 day) |
+----------------------------------------+
| 2025-06-14                             |
+----------------------------------------+
1 row in set, 1 warning (0.00 sec)

//计算两个日期直接相差的天数
mysql> select datediff(current_date(),'2004-02-20');
+---------------------------------------+
| datediff(current_date(),'2004-02-20') |
+---------------------------------------+
|                                  7795 |
+---------------------------------------+
1 row in set (0.00 sec)

//获取当前日期和时间
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2025-06-24 14:55:32 |
+---------------------+
1 row in set (0.00 sec)


//创建一张留言表
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> desc msg;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int         | NO   | PRI | NULL    | auto_increment |
| content  | varchar(30) | NO   |     | NULL    |                |
| sendtime | datetime    | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
//向表中插入数据
mysql> insert into msg(content,sendtime) values('人生自古谁无死',now());
Query OK, 1 row affected (0.00 sec)
mysql> insert into msg(content,sendtime) values('留取丹心照汗青',now());
Query OK, 1 row affected (0.00 sec)
//查表
mysql> select *from msg;
+----+-----------------------+---------------------+
| id | content               | sendtime            |
+----+-----------------------+---------------------+
|  1 | 人生自古谁无死        | 2025-06-24 14:58:31 |
|  2 | 留取丹心照汗青        | 2025-06-24 14:58:46 |
+----+-----------------------+---------------------+
2 rows in set (0.00 sec)
//显示所有留言的信息,只要日期,不要时间
mysql> select  content,date(sendtime) from msg;
+-----------------------+----------------+
| content               | date(sendtime) |
+-----------------------+----------------+
| 人生自古谁无死        | 2025-06-24     |
| 留取丹心照汗青        | 2025-06-24     |
+-----------------------+----------------+
2 rows in set (0.00 sec)
//查询在5分钟之内的留言信息
mysql> select * from msg where date_add(sendtime,interval 5 minute)>now();
+----+-----------------------+---------------------+
| id | content               | sendtime            |
+----+-----------------------+---------------------+
|  1 | 人生自古谁无死        | 2025-06-24 14:58:31 |
|  2 | 留取丹心照汗青        | 2025-06-24 14:58:46 |
+----+-----------------------+---------------------+
2 rows in set (0.00 sec)

2.字符串函数

函数名称 描述
charset(str) 返回字符串字符集
concat(string2 [,...]) 连接字符串
instr(string,substring) 返回substring在string中出现的位置,没有返回0
ucase(string2) 转换成大写
lcase(string2) 转换成小写
left(string2,length) 从string2中的左边起取length个字符
length(string) string的长度
replace(str,search_str,replace_str) 在str中用replace_str替换search_str
strcmp(string1,string2) 逐字符比较两字符串大小
substring(str,postion [,length]) 从str的postion位置开始,取length个字符
ltrim(string) rtrim(string) trim(string) 去除前空格/后空格
  • 样例
cpp 复制代码
//获取emp表ename列的字符集
mysql> select charset(ename) from emp;
+----------------+
| charset(ename) |
+----------------+
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
+----------------+
14 rows in set (0.00 sec)


mysql> select *from exam_result;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 唐三藏    |     134 |   98 |      56 |
|  3 | 猪悟能    |     176 |   98 |      90 |
|  4 | 曹孟德    |     140 |   90 |      67 |
|  5 | 刘玄德    |     110 |  115 |      45 |
|  6 | 孙权      |     140 |   73 |      78 |
|  7 | 宋公明    |     150 |   95 |      30 |
+----+-----------+---------+------+---------+
6 rows in set (0.00 sec)
//要求显示exam_result表中的信息,显示格式:姓名:XXX,总分:XXX,语文:XXXX,数学:XXX,英语:XXX
mysql> select concat('姓名:',name,',总分:',english+math+chinese ,',.语文:',chinese,,.数学:',math,,.英语:',eglish) as mag from exam_result;
+-------------------------------------------------------------------------+
| mag                                                                     |
+-------------------------------------------------------------------------+
| 姓名:唐三藏,总分:288,语文:134,数学:98,英语:56                     |
| 姓名:猪悟能,总分:364,语文:176,数学:98,英语:90                     |
| 姓名:曹孟德,总分:297,语文:140,数学:90,英语:67                     |
| 姓名:刘玄德,总分:270,语文:110,数学:115,英语:45                    |
| 姓名:孙权,总分:291,语文:140,数学:73,英语:78                       |
| 姓名:宋公明,总分:275,语文:150,数学:95,英语:30                     |
+-------------------------------------------------------------------------+
6 rows in set (0.00 sec)

//找后一个字符串在前一个字符串的什么位置
mysql> select instr('abcd1234ABCD','1234');
+------------------------------+
| instr('abcd1234ABCD','1234') |
+------------------------------+
|                            5 |
+------------------------------+
1 row in set (0.00 sec)
//转换成大写
mysql> select ucase('abcd1234ABCD');
+-----------------------+
| ucase('abcd1234ABCD') |
+-----------------------+
| ABCD1234ABCD          |
+-----------------------+
1 row in set (0.00 sec)
//转换成小写
mysql> select lcase('abcd1234ABCD');
+-----------------------+
| lcase('abcd1234ABCD') |
+-----------------------+
| abcd1234abcd          |
+-----------------------+
1 row in set (0.00 sec)
//从字符串左边开始取length个字符
mysql> select left('abcdefghi',4);
+---------------------+
| left('abcdefghi',4) |
+---------------------+
| abcd                |
+---------------------+
1 row in set (0.00 sec)
//从字符串右边开始取length个字符
mysql> select right('abcdefghi',4);
+----------------------+
| right('abcdefghi',4) |
+----------------------+
| fghi                 |
+----------------------+
1 row in set (0.00 sec)
//求字符串的长度
mysql> select length('abcdef');
+------------------+
| length('abcdef') |
+------------------+
|                6 |
+------------------+
1 row in set (0.01 sec)


mysql> select * from emp;
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
14 rows in set (0.00 sec)
//将ename列字符串中存在的'S'改成'上海'
mysql> select replace(ename,'S','上海') ,ename from emp;
+-----------------------------+--------+
| replace(ename,'S','上海')   | ename  |
+-----------------------------+--------+
| 上海MITH                    | SMITH  |
| ALLEN                       | ALLEN  |
| WARD                        | WARD   |
| JONE上海                    | JONES  |
| MARTIN                      | MARTIN |
| BLAKE                       | BLAKE  |
| CLARK                       | CLARK  |
| 上海COTT                    | SCOTT  |
| KING                        | KING   |
| TURNER                      | TURNER |
| ADAM上海                    | ADAMS  |
| JAME上海                    | JAMES  |
| FORD                        | FORD   |
| MILLER                      | MILLER |
+-----------------------------+--------+
14 rows in set (0.00 sec)
//比较两个字符串的大小
mysql> select strcmp('abd','abc');
+---------------------+
| strcmp('abd','abc') |
+---------------------+
|                   1 |
+---------------------+
1 row in set (0.00 sec)
//截取EMP表中ename字段的第二个到第三个字符
mysql> select substring(ename,2,2),ename from emp;
+----------------------+--------+
| substring(ename,2,2) | ename  |
+----------------------+--------+
| MI                   | SMITH  |
| LL                   | ALLEN  |
| AR                   | WARD   |
| ON                   | JONES  |
| AR                   | MARTIN |
| LA                   | BLAKE  |
| LA                   | CLARK  |
| CO                   | SCOTT  |
| IN                   | KING   |
| UR                   | TURNER |
| DA                   | ADAMS  |
| AM                   | JAMES  |
| OR                   | FORD   |
| IL                   | MILLER |
+----------------------+--------+
14 rows in set (0.00 sec)

//去除空格
mysql> select trim('      你好           ') as msg;
+--------+
| msg    |
+--------+
| 你好   |
+--------+
1 row in set (0.00 sec)
mysql> select ltrim('      你好           ') as msg;
+-------------------+
| msg               |
+-------------------+
| 你好              |
+-------------------+
1 row in set (0.00 sec)
mysql> select rtrim('      你好           ') as msg;
+--------------+
| msg          |
+--------------+
|       你好   |
+--------------+
1 row in set (0.00 sec)
//以首字母小写的方式显示所有员工的姓名
mysql> select ename,concat(lcase(substring(ename,1,1)),substring(ename,2)) as ename from emp;
+--------+--------+
| ename  | 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.数学函数

函数名称 描述
abs(number) 绝对值函数
bin(number) 十进制转二进制
hex(number) 转换成十六进制
conv(number,from_base,to_base) 进制转换
ceiling(number) 向上取整
floor(number) 向下取整
format(number,decimal_places) 格式化,保留小数位数
rand() 生成随机数
mod(number,denominator) 取模,求余
  • 样例
cpp 复制代码
//求绝对值
mysql> select abs(12);
+---------+
| abs(12) |
+---------+
|      12 |
+---------+
1 row in set (0.00 sec)
mysql> select abs(-12);
+----------+
| abs(-12) |
+----------+
|       12 |
+----------+
1 row in set (0.00 sec)
//转换成二进制
mysql> select bin(10);
+---------+
| bin(10) |
+---------+
| 1010    |
+---------+
1 row in set (0.00 sec)
//转换成十六进制
mysql> select hex(10);
+---------+
| hex(10) |
+---------+
| A       |
+---------+
1 row in set (0.00 sec)
//将10从十进制转换成十六进制
mysql> select conv(10,10,16);
+----------------+
| conv(10,10,16) |
+----------------+
| A              |
+----------------+
1 row in set (0.00 sec)
//向上取整
mysql> select ceiling(4.1);
+--------------+
| ceiling(4.1) |
+--------------+
|            5 |
+--------------+
1 row in set (0.00 sec)
mysql> select ceiling(-4.3);
+---------------+
| ceiling(-4.3) |
+---------------+
|            -4 |
+---------------+
1 row in set (0.00 sec)
//向下取整
mysql> select floor(4.1);
+------------+
| floor(4.1) |
+------------+
|          4 |
+------------+
1 row in set (0.00 sec)
mysql> select floor(-4.3);
+-------------+
| floor(-4.3) |
+-------------+
|          -5 |
+-------------+
1 row in set (0.00 sec)
//格式化,保留2位小数
mysql> select format(3.1415926,2);
+---------------------+
| format(3.1415926,2) |
+---------------------+
| 3.14                |
+---------------------+
1 row in set (0.00 sec)
//生成随机数 范围[0.0,1.0)
mysql> select rand();
+------------------+
| rand()           |
+------------------+
| 0.74572997237158 |
+------------------+
1 row in set (0.00 sec)
//取模
mysql> select mod(10,3);
+-----------+
| mod(10,3) |
+-----------+
|         1 |
+-----------+
1 row in set (0.00 sec)

4.其他函数

cpp 复制代码
//user() 查询当前用户
mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
//md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串
mysql> select md5('123456');
+----------------------------------+
| md5('123456')                    |
+----------------------------------+
| e10adc3949ba59abbe56e057f20f883e |
+----------------------------------+
1 row in set (0.00 sec)
//ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值
select ifnull('abc', '123');
+----------------------+
| ifnull('abc', '123') |
+----------------------+
| abc 				   |
+----------------------+
1 row in set (0.01 sec)
select ifnull(null, '123');
+---------------------+
| ifnull(null, '123') |
+---------------------+
| 123 				  |
+---------------------+
1 row in set (0.00 sec)
相关推荐
Fleshy数模9 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
az44yao10 小时前
mysql 创建事件 每天17点执行一个存储过程
mysql
秦老师Q11 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
橘子1312 小时前
MySQL用户管理(十三)
数据库·mysql
Dxy123931021612 小时前
MySQL如何加唯一索引
android·数据库·mysql
我真的是大笨蛋12 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怣5012 小时前
MySQL数据检索入门:从零开始学SELECT查询
数据库·mysql
人道领域12 小时前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
千寻技术帮13 小时前
10404_基于Web的校园网络安全防御系统
网络·mysql·安全·web安全·springboot
spencer_tseng14 小时前
MySQL table backup
mysql