【MySQL】内置函数

欢迎拜访雾里看山-CSDN博客
本篇主题 :【MySQL】内置函数
发布时间 :2025.2.20
隶属专栏MySQL

目录

日期函数

函数介绍

函数名称 描述
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() 当前日期时间

函数使用

current_date() 获得年月日

sql 复制代码
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2025-02-18     |
+----------------+
1 row in set (0.02 sec)

current_time() 获得时分秒

sql 复制代码
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 15:33:32       |
+----------------+
1 row in set (0.00 sec)

current_timestamp() 获得时间戳

sql 复制代码
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2025-02-18 15:33:37 |
+---------------------+
1 row in set (0.00 sec)

now() 获取日期时间

sql 复制代码
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2025-02-18 15:36:23 |
+---------------------+
1 row in set (0.00 sec)

date 截取日期

参数是具体时间

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

参数是时间函数

sql 复制代码
mysql> select date(now());
+-------------+
| date(now()) |
+-------------+
| 2025-02-18  |
+-------------+
1 row in set (0.00 sec)

date_add 日期加

具体日期加时间

sql 复制代码
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('2050-01-01', interval 10 month);
+-------------------------------------------+
| date_add('2050-01-01', interval 10 month) |
+-------------------------------------------+
| 2050-11-01                                |
+-------------------------------------------+
1 row in set (0.00 sec)

函数日期加时间

sql 复制代码
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2025-02-18 15:47:57 |
+---------------------+
1 row in set (0.00 sec)

mysql> select date_add(now(), interval 10 month);
+------------------------------------+
| date_add(now(), interval 10 month) |
+------------------------------------+
| 2025-12-18 15:47:59                |
+------------------------------------+
1 row in set (0.00 sec)

date_sub 日期减

具体日期减时间

sql 复制代码
mysql> select date_sub('2050-01-01', interval 10 day);
+-----------------------------------------+
| date_sub('2050-01-01', interval 10 day) |
+-----------------------------------------+
| 2049-12-22                              |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql> select date_sub('2050-01-01', interval 10 month);
+-------------------------------------------+
| date_sub('2050-01-01', interval 10 month) |
+-------------------------------------------+
| 2049-03-01                                |
+-------------------------------------------+
1 row in set (0.00 sec)

函数日期加时间

sql 复制代码
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2025-02-18 15:49:50 |
+---------------------+
1 row in set (0.00 sec)

mysql> select date_sub(now(), interval 10 month);
+------------------------------------+
| date_sub(now(), interval 10 month) |
+------------------------------------+
| 2024-04-18 15:50:00                |
+------------------------------------+
1 row in set (0.00 sec)

datediff 日期差

sql 复制代码
mysql> select datediff('2020-10-23', '2013-04-13');
+--------------------------------------+
| datediff('2020-10-23', '2013-04-13') |
+--------------------------------------+
|                                 2750 |
+--------------------------------------+
1 row in set (0.00 sec)

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

案例

案例1 :创建一张表,记录生日

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

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

插入数据

sql 复制代码
mysql> insert into tmp (brithday) values ('1990-02-24');
ERROR 1054 (42S22): Unknown column 'brithday' in 'field list'
mysql> insert into tmp (birthday) values ('1990-02-24');
Query OK, 1 row affected (0.00 sec)

mysql> insert into tmp (birthday) values ('1980-03-05');
Query OK, 1 row affected (0.01 sec)

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

mysql> select * from tmp;
+----+------------+
| id | birthday   |
+----+------------+
|  1 | 1990-02-24 |
|  2 | 1980-03-05 |
|  3 | 2025-02-18 |
+----+------------+
3 rows in set (0.00 sec)

案例二:创建一个留言表

sql 复制代码
mysql> create table msg(
    -> id bigint primary key auto_increment,
    -> content varchar(30) not null,
    -> sendtime datetime
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> desc msg;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| content  | varchar(30) | NO   |     | NULL    |                |
| sendtime | datetime    | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

插入数据

sql 复制代码
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-02-18 16:27:09 | 
|  2 | 不敢高声语,恐惊天上人                            | 2025-02-18 16:28:51 |
+----+-----------------------------------------------+---------------------+
2 rows in set (0.00 sec)

请查询在2分钟内发布的帖子
select * from msg where date_add(sendtime, interval 2 minute) > now();

或者
select * from msg where sendtime > date_sub(now(), interval 2 minute);

sql 复制代码
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            |
+----+-----------------------------------+---------------------+
|  3 | 举头望明月,低头思故乡                | 2025-02-18 16:44:15 |
+----+-----------------------------------+---------------------+
1 row in set (0.00 sec)

mysql> select * from msg where sendtime > date_sub(now(), interval 2 minute);
+----+-----------------------------------+---------------------+
| id | content                           | sendtime            |
+----+-----------------------------------+---------------------+
|  3 | 举头望明月,低头思故乡                | 2025-02-18 16:44:15 |
+----+-----------------------------------+---------------------+
1 row in set (0.00 sec)

字符串函数

函数介绍

函数 描述
charset(str) 返回字符串字符集
concat(string2 [, ...]) 连接字符串
instr(string,sunstring) 返回substring在string中出现的位置
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, position [, length]) 从str的position开始,取length个字符
ltrim(string) rtrim(string) trim(string) 去除前空格或者后空格

函数使用

charset 查字符集

应用场景:当插入时有的地方乱码了,可以查看字符集是否有问题。

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

mysql> select charset(sendtime) from msg;
+-------------------+
| charset(sendtime) |
+-------------------+
| binary            |
| binary            |
| binary            |
+-------------------+
3 rows in set (0.00 sec)

mysql> select charset(content) from msg;
+------------------+
| charset(content) |
+------------------+
| utf8             |
| utf8             |
| utf8             |
+------------------+
3 rows in set (0.00 sec)

concat 拼接字符串

sql 复制代码
mysql> select concat('a', 'b', 'c', 123, 3.14) as res;
+------------+
| res        |
+------------+
| abc1233.14 |
+------------+
1 row in set (0.00 sec)

instr 查找子串

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

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

ucase 转大写

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

lcase 转小写

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

left 从左取length个字符

sql 复制代码
mysql> select left('abcd1234',5);
+--------------------+
| left('abcd1234',5) |
+--------------------+
| abcd1              |
+--------------------+
1 row in set (0.00 sec)

right 从右取length个字符

sql 复制代码
mysql> select right('abcd1234',5);
+---------------------+
| right('abcd1234',5) |
+---------------------+
| d1234               |
+---------------------+
1 row in set (0.00 sec)

length 字符串占的字节数

注意:length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;

如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)

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

ltrim , rtrim, trim

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

mysql> select rtrim('        你好             ') as res;
+----------------+
| res            |
+----------------+
|         你好   |
+----------------+
1 row in set (0.01 sec)

mysql> select trim('        你好             ') as res;
+--------+
| res    |
+--------+
| 你好   |
+--------+
1 row in set (0.00 sec)

案例

  1. 获取emp表的ename列的字符集
sql 复制代码
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)
  1. 要求显示exam_result表中的信息,显示格式:"考生姓名:XXX,总分:XXX,语文成绩:XXX,数学成绩XXX,英语成绩XXX"
sql 复制代码
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)
  1. 求学生表中学生姓名占用的字节数
sql 复制代码
mysql> select name, length(name) from exam_result;
+-----------+--------------+
| name      | length(name) |
+-----------+--------------+
| 唐三藏    |            9 |
| 猪悟能    |            9 |
| 曹孟德    |            9 |
| 孙权      |            6 |
| 宋公明    |            9 |
+-----------+--------------+
5 rows in set (0.00 sec)
  1. 将EMP表中所有名字中有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.00 sec)
  1. 截取EMP表中ename字段的第二个到第三个字符
sql 复制代码
mysql> select substring(ename, 2, 2) ename from emp;
+-------+
| ename |
+-------+
| MI    |
| LL    |
| AR    |
| ON    |
| AR    |
| LA    |
| LA    |
| CO    |
| IN    |
| UR    |
| DA    |
| AM    |
| OR    |
| IL    |
+-------+
14 rows in set (0.00 sec)
  1. 以首字母小写的方式显示所有员工的姓名
sql 复制代码
mysql> select ename, concat(lcase(substring(ename, 1, 1)),substring(ename,2)) from emp;
+--------+----------------------------------------------------------+
| ename  | concat(lcase(substring(ename, 1, 1)),substring(ename,2)) |
+--------+----------------------------------------------------------+
| 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)

数学函数

函数介绍

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

函数使用

绝对值

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

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

mysql> select abs(-10.23);
+-------------+
| abs(-10.23) |
+-------------+
|       10.23 |
+-------------+
1 row in set (0.00 sec)

十进制转换二进制

sql 复制代码
mysql> select bin(5);
+--------+
| bin(5) |
+--------+
| 101    |
+--------+
1 row in set (0.00 sec)

十进制转换十六进制

sql 复制代码
mysql> select hex(16);
+---------+
| hex(16) |
+---------+
| 10      |
+---------+
1 row in set (0.00 sec)

进制转换

sql 复制代码
mysql> select conv(20, 10 ,16);
+------------------+
| conv(20, 10 ,16) |
+------------------+
| 14               |
+------------------+
1 row in set (0.00 sec)

向上取整

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

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

向下取整

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

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

格式化,保留小数位数

会四舍五入

sql 复制代码
mysql> select format(3.1415926, 3);
+----------------------+
| format(3.1415926, 3) |
+----------------------+
| 3.142                |
+----------------------+
1 row in set (0.00 sec)

生成随机数

sql 复制代码
mysql> select format(rand()*100, 0);
+-----------------------+
| format(rand()*100, 0) |
+-----------------------+
| 77                    |
+-----------------------+
1 row in set (0.00 sec)

取模,求余

sql 复制代码
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)

其他函数

查看当前用户

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

查看所在数据库

sql 复制代码
mysql> select database();
+------------+
| database() |
+------------+
| scott      |
+------------+
1 row in set (0.00 sec)

md5(str)

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

sql 复制代码
mysql> select md5('afe152');
+----------------------------------+
| md5('afe152')                    |
+----------------------------------+
| cf3c4ad0dc7525587fc64a9f60d6f8e0 |
+----------------------------------+
1 row in set (0.01 sec)

password()

MySQL数据库使用该函数对用户加密

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

ifnull(val1, val2)

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

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

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

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

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

⚠️ 写在最后:以上内容是我在学习以后得一些总结和概括,如有错误或者需要补充的地方欢迎各位大佬评论或者私信我交流!!!

相关推荐
随风飘的云7 分钟前
mysql的innodb引擎对可重复读做了那些优化,可以避免幻读
mysql
二流小码农1 小时前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少2 小时前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker2 小时前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋2 小时前
Android 协程时代,Handler 应该退休了吗?
android
NineData11 小时前
NineData 迁移评估功能正式上线
数据库·dba
火柴就是我16 小时前
让我们实现一个更好看的内部阴影按钮
android·flutter
NineData16 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师18 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
砖厂小工1 天前
用 GLM + OpenClaw 打造你的 AI PR Review Agent — 让龙虾帮你审代码
android·github