【MySQL】 内置函数

发布于:2025-07-03 ⋅ 阅读:(24) ⋅ 点赞:(0)

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() 当前日期时间
  • 样例
//获取当前的年月日
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) 去除前空格/后空格
  • 样例
//获取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) 取模,求余
  • 样例
//求绝对值
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.其他函数

//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)