文章目录
-
- [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:
-
创建一张表,记录生日
sqlmysql> 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:
-
创建一个留言表
sqlmysql> 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> -
显示所有留言信息,发布日期只显示日期,不用显示时间
sqlmysql> 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分钟以内发布的内容
sqlmysql> 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>