MySQL内置函数

mysql -uroot -p

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() |
+----------------+
| 2026-05-26     |
+----------------+
1 row in set (0.00 sec)

获取时分秒

复制代码
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 13:48:03       |
+----------------+
1 row in set (0.00 sec)

获取时间戳

复制代码
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2026-05-26 13:48:14 |
+---------------------+
1 row in set (0.00 sec)

当前日期时间,now函数

复制代码
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2026-05-26 13:49:46 |
+---------------------+
1 row in set (0.00 sec)

获取某个时间的时间

复制代码
mysql> select date('1949-10-1 00:00:00');
+----------------------------+
| date('1949-10-1 00:00:00') |
+----------------------------+
| 1949-10-01                 |
+----------------------------+
1 row in set (0.00 sec)

添加时间

复制代码
mysql> select date_add('2050-01-01',interval 10 day);
+----------------------------------------+
| date_add('2050-01-01',interval 10 day) |
+----------------------------------------+
| 2050-01-11                             |
+----------------------------------------+
1 row in set (0.00 sec)

mysql> select date_add(now(),interval 10 day);
+---------------------------------+
| date_add(now(),interval 10 day) |
+---------------------------------+
| 2026-06-05 13:51:57             |
+---------------------------------+
1 row in set (0.00 sec)

减时间

复制代码
mysql> select date_sub(now(),interval 60 minute);
+------------------------------------+
| date_sub(now(),interval 60 minute) |
+------------------------------------+
| 2026-05-26 12:52:36                |
+------------------------------------+
1 row in set (0.00 sec)

相差多少天

复制代码
mysql> select datediff(now(),'1949-10-1');
+-----------------------------+
| datediff(now(),'1949-10-1') |
+-----------------------------+
|                       27996 |
+-----------------------------+
1 row in set (0.00 sec)

mysql> select datediff(date(now()),'1949-10-1');
+-----------------------------------+
| datediff(date(now()),'1949-10-1') |
+-----------------------------------+
|                             27996 |
+-----------------------------------+
1 row in set (0.00 sec)

2.时间函数样例

1.创建表记录生日

创建库

复制代码
mysql> create database if not exists test;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| d1                 |
| helloworld         |
| mysql              |
| performance_schema |
| scott              |
| sys                |
| test               |
| test_db            |
| user_db            |
+--------------------+
10 rows in set (0.00 sec)

mysql> use test;
Database changed

创建表

复制代码
mysql> create table tmp (
    -> id bigint primary key auto_increment,
    -> birthday date not null
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> desc tmp;
+----------+------------+------+-----+---------+----------------+
| Field    | Type       | Null | Key | Default | Extra          |
+----------+------------+------+-----+---------+----------------+
| id       | bigint(20) | NO   | PRI | NULL    | auto_increment |
| birthday | date       | NO   |     | NULL    |                |
+----------+------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

插入数据

复制代码
mysql> insert into tmp (birthday) values ('1990-01-01');
Query OK, 1 row affected (0.00 sec)

mysql> select * from tmp;
+----+------------+
| id | birthday   |
+----+------------+
|  1 | 1990-01-01 |
+----+------------+
1 row in set (0.00 sec)

mysql> insert into tmp (birthday) values (date(now()));
Query OK, 1 row affected (0.00 sec)

mysql> insert into tmp (birthday) values (current_timestamp());
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from tmp;
+----+------------+
| id | birthday   |
+----+------------+
|  1 | 1990-01-01 |
|  2 | 2026-05-26 |
|  3 | 2026-05-26 |
+----+------------+
3 rows in set (0.00 sec)

2.创建一个留言板

建表

复制代码
mysql> create table msg (
    -> id int primary key auto_increment,
    -> content varchar(30) not null,
    -> sendtime datetime
    -> );
Query OK, 0 rows affected (0.01 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            |
+----+---------------------------------------------+---------------------+
|  3 | 宝剑锋从磨砺出,梅花香自苦寒来               | 2026-05-26 14:09:42 |
|  4 | 梦里寻他千百度                              | 2026-05-26 14:10:44 |
+----+---------------------------------------------+---------------------+
2 rows in set (0.00 sec)

显示所有留言信息,发布日期只显示日期,不用显示时间

复制代码
mysql> select content,date(sendtime) from msg;
+---------------------------------------------+----------------+
| content                                     | date(sendtime) |
+---------------------------------------------+----------------+
| 宝剑锋从磨砺出,梅花香自苦寒来               | 2026-05-26     |
| 梦里寻他千百度                              | 2026-05-26     |
+---------------------------------------------+----------------+
2 rows in set (0.00 sec)

请查询在2分钟内发布的帖子
怎么确认表中的数据是2min以内的?

复制代码
mysql> select * from msg where date_add(sendtime, interval 2 minute) > now();
+----+-----------------------+---------------------+
| id | content               | sendtime            |
+----+-----------------------+---------------------+
|  4 | 梦里寻他千百度        | 2026-05-26 14:10:44 |
+----+-----------------------+---------------------+
1 row in set (0.00 sec)

mysql> insert into msg (content,sendtime) values ('同是天涯沦落人',now());
Query OK, 1 row affected (0.00 sec)

mysql> select * from msg where date_add(sendtime, interval 2 minute) > now();
+----+-----------------------+---------------------+
| id | content               | sendtime            |
+----+-----------------------+---------------------+
|  4 | 梦里寻他千百度        | 2026-05-26 14:10:44 |
|  5 | 同是天涯沦落人        | 2026-05-26 14:12:28 |
+----+-----------------------+---------------------+
2 rows in set (0.00 sec)

3.字符串函数

函数名称 描述
charset(str) 返回字符串字符集
concat(string2 [, ...]) 连接字符串
instr(string, substring) 返回substring在string中出现的位置,没有返回0
ucase(string2) 转换成大写
lcase(string2) 转换成小写
left(string2, length) 从string2中的左边起取length个字符
length(string) string的长度
replace(string, search_str, replace_str) 在str中用replace_str替换search_str
strcmp(string1, string2) 逐字符比较两字符串大小
substring(string, position [, length]) 从str的position开始,取length个字符
ltrim(string) rtrim(string) trim(string) 去除前空格或后空格

返回字符串字符集

复制代码
mysql> select charset('abcd');
+-----------------+
| charset('abcd') |
+-----------------+
| utf8            |
+-----------------+
1 row in set (0.00 sec)

连接字符集

复制代码
mysql> select concat('a','b','123','c');
+---------------------------+
| concat('a','b','123','c') |
+---------------------------+
| ab123c                    |
+---------------------------+
1 row in set (0.00 sec)

返回substring在string中出现的位置,没有返回0

复制代码
mysql> select instr('abcd1234efg','1234');
+-----------------------------+
| instr('abcd1234efg','1234') |
+-----------------------------+
|                           5 |
+-----------------------------+
1 row in set (0.00 sec)

mysql> select instr('abcd1234efg','1243');
+-----------------------------+
| instr('abcd1234efg','1243') |
+-----------------------------+
|                           0 |
+-----------------------------+
1 row in set (0.00 sec)

转换成大写

复制代码
mysql> select ucase('asdad123AKDA');
+-----------------------+
| ucase('asdad123AKDA') |
+-----------------------+
| ASDAD123AKDA          |
+-----------------------+
1 row in set (0.00 sec)

转换成小写

复制代码
mysql> select lcase('AKLC4870adjsk');
+------------------------+
| lcase('AKLC4870adjsk') |
+------------------------+
| aklc4870adjsk          |
+------------------------+
1 row in set (0.00 sec)

left

复制代码
mysql> select left('abcde3456',7);
+---------------------+
| left('abcde3456',7) |
+---------------------+
| abcde34             |
+---------------------+
1 row in set (0.00 sec)

right反之同理

length

复制代码
mysql> select length('abcde');
+-----------------+
| length('abcde') |
+-----------------+
|               5 |
+-----------------+
1 row in set (0.00 sec)

4.字符串函数样例

获取emp表的ename列的字符集

select charset(ename) from emp;

复制代码
mysql> use scott
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select charset(ename) from emp;
+----------------+
| charset(ename) |
+----------------+
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
+----------------+
14 rows in set (0.00 sec)

要求显示exam_result表中的信息,显示格式:"XXX的语文是XXX分,数学XXX分,英语XXX分"

复制代码
mysql> select concat('考生姓名:',name, ',总分:',chinese+math+english,',语文成绩:',chinese,',数学成绩:',math,',英语成绩:',english) msg from exam_result;
+----------------------------------------------------------------------------------------------------+
| msg                                                                                                |
+----------------------------------------------------------------------------------------------------+
| 考生姓名:唐三藏,总分:288,语文成绩:134,数学成绩:98,英语成绩:56                              |
| 考生姓名:猪悟能,总分:364,语文成绩:176,数学成绩:98,英语成绩:90                              |
| 考生姓名:曹孟德,总分:297,语文成绩:140,数学成绩:90,英语成绩:67                              |
| 考生姓名:孙权,总分:291,语文成绩:140,数学成绩:73,英语成绩:78                                |
| 考生姓名:宋公明,总分:275,语文成绩:150,数学成绩:95,英语成绩:30                              |
+----------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)

求学生表中学生姓名占用的字节数

复制代码
mysql> select name,length(name) from exam_result;
+-----------+--------------+
| name      | length(name) |
+-----------+--------------+
| 唐三藏    |            9 |
| 猪悟能    |            9 |
| 曹孟德    |            9 |
| 孙权      |            6 |
| 宋公明    |            9 |
+-----------+--------------+
5 rows in set (0.00 sec)

将emp表中所有名字中有S的替换成'上海'

复制代码
mysql> use scott;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
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)

mysql> select ename,replace(ename, 'S', '上海') ,ename from emp;
+--------+-------------------------------+--------+
| ename  | replace(ename, 'S', '上海')   | ename  |
+--------+-------------------------------+--------+
| SMITH  | 上海MITH                      | SMITH  |
| ALLEN  | ALLEN                         | ALLEN  |
| WARD   | WARD                          | WARD   |
| JONES  | JONE上海                      | JONES  |
| MARTIN | MARTIN                        | MARTIN |
| BLAKE  | BLAKE                         | BLAKE  |
| CLARK  | CLARK                         | CLARK  |
| SCOTT  | 上海COTT                      | SCOTT  |
| KING   | KING                          | KING   |
| TURNER | TURNER                        | TURNER |
| ADAMS  | ADAM上海                      | ADAMS  |
| JAMES  | JAME上海                      | JAMES  |
| FORD   | FORD                          | FORD   |
| MILLER | MILLER                        | MILLER |
+--------+-------------------------------+--------+
14 rows 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 concat(lcase(substring(ename, 1, 1)),substring(ename,2)) from emp;
+----------------------------------------------------------+
| concat(lcase(substring(ename, 1, 1)),substring(ename,2)) |
+----------------------------------------------------------+
| sMITH                                                    |
| aLLEN                                                    |
| wARD                                                     |
| jONES                                                    |
| mARTIN                                                   |
| bLAKE                                                    |
| cLARK                                                    |
| sCOTT                                                    |
| kING                                                     |
| tURNER                                                   |
| aDAMS                                                    |
| jAMES                                                    |
| fORD                                                     |
| mILLER                                                   |
+----------------------------------------------------------+
14 rows in set (0.00 sec)

语法1:SUBSTRING(str, start, length)
• str:原字符串
• start:开始位置(从1开始)
• length:要截取的长度

语法2:SUBSTRING(str, start)
• str:原字符串
• start:开始位置(从1开始)
• 省略length参数:从start位置截取到字符串末尾

ltrim去掉左空格 rtrim去掉右空格 trim去掉两边

复制代码
mysql> select ltrim('  你好  ') as res;
+----------+
| res      |
+----------+
| 你好     |
+----------+
1 row in set (0.00 sec)

5.数字函数

函数名称 描述
abs(number) 绝对值函数
bin(decimal_number) 十进制转换二进制
hex(decimalNumber) 转换成十六进制
conv(number, from_base, to_base) 进制转换
ceiling(number) 向上取整
floor(number) 向下取整
format(number, decimal_places) 格式化,保留小数位数
hex(decimalNumber) 转换成十六进制
rand() 返回随机浮点数,范围[0.0, 1.0)
mod(number, denominator) 取模,求余

绝对值

复制代码
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(11);
+---------+
| hex(11) |
+---------+
| B       |
+---------+
1 row in set (0.00 sec)

进制转换

复制代码
mysql> select conv(3,10,2);
+--------------+
| conv(3,10,2) |
+--------------+
| 11           |
+--------------+
1 row in set (0.00 sec)

向上取整

复制代码
mysql> select ceiling(3.3);
+--------------+
| ceiling(3.3) |
+--------------+
|            4 |
+--------------+
1 row in set (0.00 sec)

mysql> select ceiling(-3.4);
+---------------+
| ceiling(-3.4) |
+---------------+
|            -3 |
+---------------+
1 row in set (0.00 sec)

向下取整

复制代码
mysql> select floor(7.8);
+------------+
| floor(7.8) |
+------------+
|          7 |
+------------+
1 row in set (0.00 sec)

mysql> select floor(-7.8);
+-------------+
| floor(-7.8) |
+-------------+
|          -8 |
+-------------+
1 row in set (0.00 sec)

格式化,保留小数位数

复制代码
mysql> select format(3.141592653,4);
+-----------------------+
| format(3.141592653,4) |
+-----------------------+
| 3.1416                |
+-----------------------+
1 row in set (0.00 sec)

返回随机浮点数,范围[0.0,1.0)

复制代码
mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.5271284361622561 |
+--------------------+
1 row in set (0.00 sec)

取模,求余

复制代码
mysql> select mod(10,3);
+-----------+
| mod(10,3) |
+-----------+
|         1 |
+-----------+
1 row in set (0.00 sec)

mysql> select mod(-10,-3);
+-------------+
| mod(-10,-3) |
+-------------+
|          -1 |
+-------------+
1 row in set (0.00 sec)

mysql> select mod(10,-3);
+------------+
| mod(10,-3) |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)

mysql> select mod(-10,3);
+------------+
| mod(-10,3) |
+------------+
|         -1 |
+------------+
1 row in set (0.00 sec)

6.其他函数

复制代码
mysql> create table user(
    -> id bigint primary key auto_increment,
    -> name varchar(20) not null,
    -> password char(32) not null
    -> );
Query OK, 0 rows affected (0.01 sec)

》user() 查询当前用户

复制代码
mysql> select user();
+--------+
| user() |
+--------+
| root@  |
+--------+
1 row in set (0.00 sec)

mysql> desc user;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| name     | varchar(20) | NO   |     | NULL    |                |
| password | char(32)    | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串

复制代码
mysql> insert into user (name,password) values ('张三','abcd1234');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+--------+----------+
| id | name   | password |
+----+--------+----------+
|  1 | 张三   | abcd1234 |
+----+--------+----------+
1 row in set (0.00 sec)

mysql> insert into user (name,password) values ('李四',md5('hellobit'));
Query OK, 1 row affected (0.00 sec)

mysql> select md5('a');
+----------------------------------+
| md5('a')                         |
+----------------------------------+
| 0cc175b9c0f1b6a831c399e269772661 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select md5('123456');
+----------------------------------+
| md5('123456')                    |
+----------------------------------+
| e10adc3949ba59abbe56e057f20f883e |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select name from user where name='李四' and password='hellobit';
Empty set (0.00 sec)

password()函数,MySQL数据库使用该函数对用户加密

复制代码
mysql> select password('1223');
+-------------------------------------------+
| password('1223')                          |
+-------------------------------------------+
| *0D7F7F31D85EF4BCE2C4BB738B9B3319F6D68B0F |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)

ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值

复制代码
mysql> select ifnull('abc', '123');
+----------------------+
| ifnull('abc', '123') |
+----------------------+
| abc                  |
+----------------------+
1 row in set (0.00 sec)

mysql>  select ifnull(null, '123');
+---------------------+
| ifnull(null, '123') |
+---------------------+
| 123                 |
+---------------------+
1 row in set (0.00 sec)

感谢你的观看,期待我们下次再见!

相关推荐
weixin_397574091 小时前
用自然语言查数据库出图表靠谱吗?一次智能问数实践复盘
数据库
字节跳动开源3 小时前
Viking AI 搜索 CLI 正式发布:会说话,就能做搜索推荐
数据库·人工智能·开源
TechWJ4 小时前
数据库在公司内网,出差路上想查数据怎么办?
服务器·数据库·mariadb
我是一颗柠檬4 小时前
【MySQL全面教学】MySQL事务与ACID Day9(2026年)
数据库·后端·mysql
橙子圆1234 小时前
Redis知识9之集群
数据库·redis·缓存
BlackHeart12034 小时前
【SQL】Oracle中序列(Sequence)作为默认值引发的ORA-00979
数据库·sql·oracle
bug菌5 小时前
【SpringBoot 3.x 第254节】夯爆了,数据库访问性能优化实战详解!
数据库·spring boot·后端
xxl大卡5 小时前
MySQL的执行流程
数据库·mysql
chicheese5 小时前
MySQL优化实践:选错JOIN 驱动表,性能相差几十倍
数据库·mysql
無限進步D5 小时前
MySQL 单行函数
数据库·mysql