MySQL内置函数

文章目录

    • [1. 函数](#1. 函数)
      • [1.1 日期函数](#1.1 日期函数)
      • [1.2 字符串函数](#1.2 字符串函数)
      • [1.3 数学函数](#1.3 数学函数)
      • [1.4 其他函数](#1.4 其他函数)

1. 函数

1.1 日期函数

函数名称 描述
current_date() 返回当前日期
current_time() 返回当前时间
current_timestamp() 返回当前时间戳
date_add(date, interval d_value_type) 在 date 中添加日期或时间,interval 后的数值单位可以是:year、minute、second、second
date_sub(date, interval d_value_type) 在 date 中减去日期或时间,interval 后的数值单位可以是:year、minute、second、second
datediff(date1,date) 两个日期的差,单位是天
now() 当前日期时间
  • 获得年月日
sql 复制代码
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2026-03-08     |
+----------------+
1 row in set (0.00 sec)

mysql> 
  • 获得时分秒
sql 复制代码
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 14:27:41       |
+----------------+
1 row in set (0.00 sec)

mysql> 
  • 获得时间戳
sql 复制代码
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2026-03-08 14:28:25 |
+---------------------+
1 row in set (0.00 sec)

mysql> 
  • 在日期的基础上加日期
sql 复制代码
mysql> select date_add('2005-1-23',interval 20 day);
+---------------------------------------+
| date_add('2005-1-23',interval 20 day) |
+---------------------------------------+
| 2005-02-12                            |
+---------------------------------------+
1 row in set (0.00 sec)

mysql> select date_add('2005-1-23',interval 20 month);
+-----------------------------------------+
| date_add('2005-1-23',interval 20 month) |
+-----------------------------------------+
| 2006-09-23                              |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql> select date_add('2005-1-23',interval 20 year);
+----------------------------------------+
| date_add('2005-1-23',interval 20 year) |
+----------------------------------------+
| 2025-01-23                             |
+----------------------------------------+
1 row in set (0.00 sec)

mysql> 
  • 在日期的基础上减去时间
sql 复制代码
mysql> select date_sub('2005-1-23',interval 100 day);
+----------------------------------------+
| date_sub('2005-1-23',interval 100 day) |
+----------------------------------------+
| 2004-10-15                             |
+----------------------------------------+
1 row in set (0.00 sec)

mysql> 
  • 计算两个日期之间相差多少天
sql 复制代码
mysql> select datediff('2008-2-19','2024-3-19');
+-----------------------------------+
| datediff('2008-2-19','2024-3-19') |
+-----------------------------------+
|                             -5873 |
+-----------------------------------+
1 row in set (0.00 sec)

mysql> 

- 5873 仅仅表示相差 5873 天,符号表示 date1 早于 date2

案例1

  • 创建一张表,记录生日

    sql 复制代码
    mysql> create table if not exists birthday( id int unsigned primary key auto_increment, birth date );
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into birthday(birth) value('2000-2-22'),('2012-12-23');
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> select * from birthday;
    +----+------------+
    | id | birth      |
    +----+------------+
    |  1 | 2000-02-22 |
    |  2 | 2012-12-23 |
    +----+------------+
    2 rows in set (0.00 sec)
    
    mysql> 

案例2

  • 创建一个留言表

    sql 复制代码
    mysql> create table if not exists msg_form( id int unsigned primary key auto_increment, msg varchar(50) not null, send_time datetime );
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into msg_form(msg,send_time) value('hello,Jack',now()),('hello,Alice',now());
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> select * from msg_form;
    +----+-------------+---------------------+
    | id | msg         | send_time           |
    +----+-------------+---------------------+
    |  1 | hello,Jack  | 2026-03-08 14:59:33 |
    |  2 | hello,Alice | 2026-03-08 14:59:33 |
    +----+-------------+---------------------+
    2 rows in set (0.00 sec)
    
    mysql> 
  • 显示所有留言信息,发布日期只显示日期,不用显示时间

    sql 复制代码
    mysql> select msg,date(send_time) from msg_form;
    +-------------+-----------------+
    | msg         | date(send_time) |
    +-------------+-----------------+
    | hello,Jack  | 2026-03-08      |
    | hello,Alice | 2026-03-08      |
    +-------------+-----------------+
    2 rows in set (0.00 sec)
    
    mysql> 
  • 查询在5分钟以内发布的内容

    sql 复制代码
    mysql> select msg from msg_form where date_add(send_time,interval 5 minute) > now();
    +-------------+
    | msg         |
    +-------------+
    | hello,Jack  |
    | hello,Alice |
    +-------------+
    2 rows in set (0.00 sec)
    
    mysql>

1.2 字符串函数

函数 描述
charset(str) 返回字符串的字符集
concat(str1,str2,...) 连接字符串
instr(str,substr) 返回 substr 在 str 中的位置,没有则返回 0
ucase(str) 将字符串转换为大写
lcase(str) 将字符串转换为小写
left(str,n) 返回字符串左边的 n 个字符
right(str,n) 返回字符串右边的 n 个字符
length(str) 返回 str 的长度
replace(str,from_str,to_str) 在 str 中将 from_str 替换为 to_str
substring(str,pos,len) 从 str 的 pos 位置开始,返回长度为 len 的子字符串
ltrim(str) 去除字符串左边的空格
rtrim(str) 去除字符串右边的空格
trim(str) 去除字符串两边的空格

案例

  • 获取 emp 表中的 ename 列的字符集
sql 复制代码
mysql> select charset(ename) from emp;
+----------------+
| charset(ename) |
+----------------+
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
+----------------+
14 rows in set (0.00 sec)

mysql> 
  • 显示 exam_result 表中的信息,格式要求:"XXX的语文是XXX分,数学XXX分,英语XXX分"
sql 复制代码
mysql> select concat(name,'的语文成绩是',chinese,'分,数学',math,'分,英语是',english,'分') as 格式化分数 from exam_result;
+----------------------------------------------------------+
| 格式化分数                                               |
+----------------------------------------------------------+
| 小赵的语文成绩是68分,数学99分,英语是57分                 |
| 小钱的语文成绩是88分,数学79分,英语是78分                 |
| 小李的语文成绩是83分,数学85分,英语是68分                 |
| 小周的语文成绩是56分,数学96分,英语是46分                 |
| 小吴的语文成绩是81分,数学71分,英语是79分                 |
| 小郑的语文成绩是76分,数学76分,英语是31分                 |
+----------------------------------------------------------+
6 rows in set (0.00 sec)

mysql> 
  • 求学生表中学生姓名占用的字节数
sql 复制代码
mysql> select name,length(name) as name_length from students;
+----------+-------------+
| name     | name_length |
+----------+-------------+
| 小飞     |           6 |
| 小红     |           6 |
| 小花     |           6 |
| 小明     |           6 |
| xiaofang |           8 |
+----------+-------------+
5 rows in set (0.00 sec)

mysql> 

注:

  • length 返回字符串长度,以字节为单位
  • 如果是多字节符则计算多个字节数,如果是单字节符则算作一个字节
  • 比如:字母、数字算作一个字节,中文标识多个字节数(具体大小与字符集编码有关)
  • 将 emp 表中名字列包含 "S" 的都替换成 "孙"
sql 复制代码
mysql> select replace(ename,'S','孙') from emp;
+--------------------------+
| replace(ename,'S','孙')  |
+--------------------------+
| 孙MITH                   |
| ALLEN                    |
| WARD                     |
| JONE孙                   |
| MARTIN                   |
| BLAKE                    |
| CLARK                    |
| 孙COTT                   |
| KING                     |
| TURNER                   |
| ADAM孙                   |
| JAME孙                   |
| FORD                     |
| MILLER                   |
+--------------------------+
14 rows in set (0.00 sec)

mysql> 
  • 截取 emp 中 ename 字段的第二个到第三个字符
sql 复制代码
mysql> select substring(ename,2,2) from emp;
+----------------------+
| substring(ename,2,2) |
+----------------------+
| MI                   |
| LL                   |
| AR                   |
| ON                   |
| AR                   |
| LA                   |
| LA                   |
| CO                   |
| IN                   |
| UR                   |
| DA                   |
| AM                   |
| OR                   |
| IL                   |
+----------------------+
14 rows in set (0.00 sec)

mysql> 
  • 以首字母小写的方式显示所有员工的姓名
sql 复制代码
mysql> select concat(lcase(substr(ename,1,1)),substring(ename,2)) as lower_name from emp;
+------------+
| lower_name |
+------------+
| sMITH      |
| aLLEN      |
| wARD       |
| jONES      |
| mARTIN     |
| bLAKE      |
| cLARK      |
| sCOTT      |
| kING       |
| tURNER     |
| aDAMS      |
| jAMES      |
| fORD       |
| mILLER     |
+------------+
14 rows in set (0.00 sec)

mysql> 

sbustring 的第三个参数 len 如果省略,表示从起始位置截取到字符串末尾

1.3 数学函数

函数 描述
ABS(number) 返回 number 的绝对值
bin(decimal_number) 返回 decimal_number 的二进制表示
hex(decimal_number) 返回 decimal_number 的十六进制表示
conv(number, from_base, to_base) 在不同进制之间转换数字
ceiling(number) 向上取整
floor(number) 向下取整
round(number, decimals) 四舍五入
rand() 随机浮点数(范围 [0.0,1.0))
mod(number1, number2) 返回 number1 除以 number2 的余数
pow(base, exponent) 幂运算
sqrt(number) 平方根
log(number) 自然对数
log10(number) 十进制对数
exp(number) 指数
sin(number) 正弦
cos(number) 余弦
tan(number) 正切

关于取整,常见的取整方式有:0向取整、向上取整、向下取整、四舍五入

  • 绝对值
sql 复制代码
mysql> select abs(-102);
+-----------+
| abs(-102) |
+-----------+
|       102 |
+-----------+
1 row in set (0.00 sec)

mysql> 
  • 向上取整
sql 复制代码
mysql> select ceiling(23.9);
+---------------+
| ceiling(23.9) |
+---------------+
|            24 |
+---------------+
1 row in set (0.00 sec)

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

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

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

mysql> 
  • 向下取整
sql 复制代码
mysql> select floor(23.9);
+-------------+
| floor(23.9) |
+-------------+
|          23 |
+-------------+
1 row in set (0.00 sec)

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

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

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

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

mysql> 
  • 产生随机数
sql 复制代码
mysql> select rand();
+---------------------+
| rand()              |
+---------------------+
| 0.08729261633687896 |
+---------------------+
1 row in set (0.00 sec)

mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.9319024672097549 |
+--------------------+
1 row in set (0.00 sec)

mysql> 

1.4 其他函数

  • user() 查询当前用户
sql 复制代码
mysql> select user();
+--------+
| user() |
+--------+
| wyf@   |
+--------+
1 row in set (0.00 sec)

mysql> 
  • md5(str) 对一个字符串进行 MD5 哈希运算,得到一个 32 位的十六进制字符串
sql 复制代码
mysql> select md5('Hello');
+----------------------------------+
| md5('Hello')                     |
+----------------------------------+
| 8b1a9953c4611296a827abf8c47804d7 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> 
  • database() 显示当前正在使用的数据库
sql 复制代码
mysql> select database();
+--------------+
| database()   |
+--------------+
| mydb         |
+--------------+
1 row in set (0.00 sec)

mysql> 
  • password(str) 对一个字符串进行密码加密
sql 复制代码
mysql> select password('123456');
+------------------+
| password('123456') |
+------------------+
| *6C8989366EFC3D8B7A5C934927599A87C0D1F000 |
+------------------+
1 row in set (0.00 sec)

mysql> 
  • ifnull(val1, val2) 如果 val1 为 NULL,则返回 val2,否则返回 val1
sql 复制代码
mysql> select ifnull(123,'abc');
+-------------------+
| ifnull(123,'abc') |
+-------------------+
| 123               |
+-------------------+
1 row in set (0.00 sec)

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

mysql> 
相关推荐
@小匠2 小时前
Spring-Gateway-理论知识总结/常问面试题
数据库·spring·gateway
逍遥德2 小时前
postgresql数据库连接问题
数据库·postgresql
此方ls2 小时前
Redis源码研读八——listpack.c 1080-1528行
c语言·数据库·redis
隔壁小邓2 小时前
TIDB分布式数据库
数据库·分布式·tidb
wellc2 小时前
redis连接服务
数据库·redis·bootstrap
隔叶听风2 小时前
RocketMQ 与 Kafka 长轮询详解
数据库·kafka·rocketmq
袋鼠云数栈2 小时前
构建金融级数据防线:数栈 DataAPI 的全生命周期管理实践
java·大数据·数据库·人工智能·api
知识分享小能手2 小时前
PostgreSQL 入门学习教程,从入门到精通,PostgreSQL 16 数据备份与还原详解 —语法、案例与实战(16)
数据库·学习·postgresql
养了一只皮卡丘2 小时前
ubuntu22.04搭建mysql8.0.45 mgr (2)
android·adb