MySQL快速入门——内置函数

MySQL快速入门------内置函数

  • [1. 日期函数](#1. 日期函数)
  • [2. 字符串函数](#2. 字符串函数)
  • [3. 数学函数](#3. 数学函数)
  • [4. 其他函数](#4. 其他函数)

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() 当前日期时间

1. 基本使用

  • 获得年月日:
sql 复制代码
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2025-11-09     |
+----------------+
1 row in set (0.03 sec)
  • 获得时分秒:
sql 复制代码
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 17:28:16       |
+----------------+
1 row in set (0.00 sec)
  • 获得时间戳:
sql 复制代码
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2025-11-09 17:28:52 |
+---------------------+
1 row in set (0.00 sec)
  • 在日期的基础上加日期:
sql 复制代码
mysql> select date_add('2017-10-28', interval 10 day);
+-----------------------------------------+
| date_add('2017-10-28', interval 10 day) |
+-----------------------------------------+
| 2017-11-07                              |
+-----------------------------------------+
1 row in set (0.01 sec)
  • 在日期的基础上减去时间:
sql 复制代码
mysql> select date_sub('2017-10-1', interval 2 day);
+---------------------------------------+
| date_sub('2017-10-1', interval 2 day) |
+---------------------------------------+
| 2017-09-29                            |
+---------------------------------------+
1 row in set (0.00 sec)
  • 计算两个日期之间相差多少天:
sql 复制代码
mysql> select datediff('2017-10-10', '2016-9-1');
+------------------------------------+
| datediff('2017-10-10', '2016-9-1') |
+------------------------------------+
|                                404 |
+------------------------------------+
1 row in set (0.00 sec)

2. 案例-1:

  • 创建一张表,记录生日:
sql 复制代码
create table tmp(
	id int primary key auto_increment,
	birthday date
);
  • 添加当前日期:
sql 复制代码
mysql> insert into tmp(birthday) values(current_date());
Query OK, 1 row affected (0.01 sec)

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

3. 案例-2:

  • 创建一个留言表:
sql 复制代码
create table msg (
	id int primary key auto_increment,
	content varchar(30) not null,
	sendtime datetime
);
  • 插入数据:
sql 复制代码
mysql> insert into msg(content,sendtime) values('hello1', now());
Query OK, 1 row affected (0.01 sec)

mysql> insert into msg(content,sendtime) values('hello2', now());
Query OK, 1 row affected (0.01 sec)

mysql> select * from msg;
+----+---------+---------------------+
| id | content | sendtime            |
+----+---------+---------------------+
|  1 | hello1  | 2025-11-09 17:51:00 |
|  2 | hello2  | 2025-11-09 17:51:09 |
+----+---------+---------------------+
2 rows in set (0.00 sec)
  • 显示所有留言信息,发布日期只显示日期,不用显示时间:
sql 复制代码
mysql> select content,date(sendtime) from msg;
+---------+----------------+
| content | date(sendtime) |
+---------+----------------+
| hello1  | 2025-11-09     |
| hello2  | 2025-11-09     |
+---------+----------------+
2 rows in set (0.00 sec)
  • 请查询在2分钟内发布的帖子:
sql 复制代码
mysql> select * from msg where date_add(sendtime, interval 2 minute) > now();
+----+---------+---------------------+
| id | content | sendtime            |
+----+---------+---------------------+
|  1 | hello1  | 2025-11-09 17:51:00 |
|  2 | hello2  | 2025-11-09 17:51:09 |
+----+---------+---------------------+
2 rows in set (0.00 sec)

2. 字符串函数


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

案例:

该案例用到来自oracle 9i的经典测试表,具体怎么构建这个测试表,请查看MySQL快速入门------基本查询(下)中的 group 章节。

  • 获取emp表的ename列的字符集:
sql 复制代码
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 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)
  • 要求显示exam_result表中的信息,显示格式:"XXX的语文是XXX分,数学XXX是分":
sql 复制代码
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)

mysql> select id, concat(name, '的语文是',chinese,'分,数学是',math,'分') as '分数' from student;
ERROR 1146 (42S02): Table 'test.student' doesn't exist
mysql> select id, concat(name, '的语文是',chinese,'分,数学是',math,'分') as '分数' from exam_result;
+----+-----------------------------------------------+
| id | 分数                                          |
+----+-----------------------------------------------+
|  1 | 唐三藏的语文是134分,数学是98分               |
|  3 | 猪悟能的语文是176分,数学是98分               |
|  4 | 曹孟德的语文是140分,数学是90分               |
|  5 | 刘玄德的语文是110分,数学是115分              |
|  6 | 孙权的语文是140分,数学是73分                 |
|  7 | 宋公明的语文是150分,数学是95分               |
+----+-----------------------------------------------+
6 rows in set (0.01 sec)
  • 求学生表中学生姓名占用的字节数:
sql 复制代码
mysql> select length(name), name from exam_result;
+--------------+-----------+
| length(name) | name      |
+--------------+-----------+
|            9 | 唐三藏    |
|            9 | 猪悟能    |
|            9 | 曹孟德    |
|            9 | 刘玄德    |
|            6 | 孙权      |
|            9 | 宋公明    |
+--------------+-----------+
6 rows in set (0.00 sec)

注意:length()函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)

  • emp表中所有名字中有S的替换成"上海":
    • 注意,此处替换仅仅只是在显示的时候替换了,并不影响数据库中实际存储的数据。
sql 复制代码
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)
  • 截取emp表中ename字段的第二个到第三个字符:
sql 复制代码
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)
  • 以首字母小写的方式显示所有员工的姓名:
sql 复制代码
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)

3. 数学函数


函数名称 描述
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.23);
+-------------+
| abs(-10.23) |
+-------------+
|       10.23 |
+-------------+
1 row in set (0.00 sec)
  • 向上取整:
sql 复制代码
mysql> select ceiling(23.04);
+----------------+
| ceiling(23.04) |
+----------------+
|             24 |
+----------------+
1 row in set (0.01 sec)
  • 向下取整:
sql 复制代码
mysql> select floor(23.7);
+-------------+
| floor(23.7) |
+-------------+
|          23 |
+-------------+
1 row in set (0.00 sec)
  • 保留2位小数位数(小数四舍五入):
sql 复制代码
mysql> select format(12.3456, 2);
+--------------------+
| format(12.3456, 2) |
+--------------------+
| 12.35              |
+--------------------+
1 row in set (0.01 sec)
  • 产生随机数:
sql 复制代码
mysql> select rand();
+---------------------+
| rand()              |
+---------------------+
| 0.39187480452645085 |
+---------------------+
1 row in set (0.00 sec)

4. 其他函数


1. user() 查询当前用户

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

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

  • md5具有不可逆属性,常用于对密码进行加密。
sql 复制代码
mysql> select md5('admin');
+----------------------------------+
| md5('admin')                     |
+----------------------------------+
| 21232f297a57a5a743894a0e4a801fc3 |
+----------------------------------+
1 row in set (0.00 sec)

3. database()显示当前正在使用的数据库

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

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

  • 最早MySQL使用password()函数对密码进行加密,但是该函数已经在5.7.6及后续版本中被弃用。

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

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

相关推荐
渡我白衣2 小时前
链接的迷雾:odr、弱符号与静态库的三国杀
android·java·开发语言·c++·人工智能·深度学习·神经网络
正经教主2 小时前
【App开发】02:Android Studio项目环境设置
android·ide·android studio
全栈软件开发3 小时前
最新版T5友价互站网源码商城PHP源码交易平台 完整带手机版源码网系统源码
android·开发语言·php
蒲公英源码4 小时前
uniapp开源ERP多仓库管理系统
mysql·elementui·uni-app·php
shykevin4 小时前
uni-app x开发商城系统,小程序发布,h5发布,安卓打包
android·小程序·uni-app
且白4 小时前
uniapp接入安卓端极光推送离线打包
android·uni-app
在狂风暴雨中奔跑4 小时前
使用MediaRecorder+MediaProjection高效实现Android录屏
android
小码过河.4 小时前
告别 mysqldump 痛点!用 mydumper 实现 MySQL 高效备份与恢复
数据库·mysql
YoungP4 小时前
让人头疼的AndroidStudio、Gradle、AGP..
android