mysql数据库学习之常用函数(五)
文章目录
- 一、字符串函数
- 1.1 concat (str1.str2,......)
- 1.2 lower(str)
- 1.3 upper(str)
- 1.4 lpad(str,n,pad)
- 1.5 rpad(str,n,pad)
- 1.6 trim(str)
- 1.7 substring(str,start,len)
- 1.8 示例
- 二、数值函数
- 2.1 ceil(x)
- 2.2 floor(x)
- 2.3 mod(x,y)
- 2.4 rand()
- 2.5 round(x,y)
- 2.6 示例
- 三、日期函数
- 3.1 curdate()
- 3.2 curtime()
- 3.3 new()
- 3.4 YEAR(date)
- 3.5 MONTH(date)
- 3.6 DAY(date)
- 3.7 date_add(date,INTERVAL expr type)
- 3.8 DATEDIFF(date1,date2)
- 3.9 示例
- 四、流程函数
- 4.1 if(value,t,f)
- 4.2 ifnull(value1,value2)
- 4.3 case when then else end
- 4.4 示例
一、字符串函数
-
MySQL中内置了很多字符串函数,常用的几个如下:函数功能
函数 功能 concat(S1,S2,…Sn) 字符串拼接,将S1,S2,…Sn拼接成一个字符串 lower(str) 将字符串str全部转为小写 upper(str) 将字符串str全部转为大写 lpad(str,n,pad) 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度 rpad(str,n,pad) 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度 trim(str) 去掉字符串头部和尾部的空格 substring(str,start,len) 返回从字符串str从start位置起的len个长度的字符串
1.1 concat (str1.str2,…)
-- 字符串拼接,将S1,S2,...Sn拼接成一个字符串
mysql> select concat('Hello','World');
+-------------------------+
| concat('Hello','World') |
+-------------------------+
| HelloWorld |
+-------------------------+
1 row in set (0.00 sec)
1.2 lower(str)
-- 将字符串str全部转为小写mysql> select lower('Hello');+----------------+| lower('Hello') |+----------------+| hello |+----------------+1 row in set (0.00 sec)
1.3 upper(str)
-- 将字符串str全部转为大写
mysql> select upper('Hello');
+----------------+
| upper('Hello') |
+----------------+
| HELLO |
+----------------+
1 row in set (0.00 sec)
1.4 lpad(str,n,pad)
-- 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
mysql> select lpad('01', 5, '0');
+--------------------+
| lpad('01', 5, '0') |
+--------------------+
| 00001 |
+--------------------+
1 row in set (0.00 sec)
1.5 rpad(str,n,pad)
-- 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
mysql> select rpad('01', 5, '=');
+--------------------+
| rpad('01', 5, '=') |
+--------------------+
| 01=== |
+--------------------+
1 row in set (0.00 sec)
1.6 trim(str)
-- 去掉字符串头部和尾部的空格(字符中间的空格不受影响)
mysql> select trim(' Hello World ');
+-----------------------+
| trim(' Hello World ') |
+-----------------------+
| Hello World |
+-----------------------+
1 row in set (0.00 sec)
1.7 substring(str,start,len)
-- 返回从字符串str从start位置起的len个长度的字符串(索引是从1开始)
mysql> select substring('Hello MySQL',1,5);
+------------------------------+
| substring('Hello MySQL',1,5) |
+------------------------------+
| Hello |
+------------------------------+
1 row in set (0.00 sec)
1.8 示例
-- 由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如:1号员工的工号应该为000013
-- 创建emp表
CREATE TABLE emp (`id` int(10) NOT NULL,`workno` varchar(6) DEFAULT NULL,`name` varchar(5) DEFAULT NULL,`gender` varchar(3) DEFAULT NULL,`age` int(3) DEFAULT NULL,`idcard` varchar(255) DEFAULT NULL,`workaddress` varchar(255) DEFAULT NULL,`entrydate` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 插入数据
insert emp values("1","00001","张三","男",22,"12345678","北京","2000-01-01");
insert emp values("2","00002","李四","男",29,"12345679","上海","2003-01-01");
insert emp values("2","00003","王五","女",21,"12345676","深圳","2002-01-01");-- 运行结果
mysql> select * from emp;
+----+--------+------+--------+------+----------+-------------+---------------------+
| id | workno | name | gender | age | idcard | workaddress | entrydate |
+----+--------+------+--------+------+----------+-------------+---------------------+
| 1 | 00001 | 张三 | 男 | 22 | 12345678 | 北京 | 2000-01-01 00:00:00 |
| 2 | 00002 | 李四 | 男 | 29 | 12345679 | 上海 | 2003-01-01 00:00:00 |
| 2 | 00003 | 王五 | 女 | 21 | 12345676 | 深圳 | 2002-01-01 00:00:00 |
+----+--------+------+--------+------+----------+-------------+---------------------+
3 rows in set (0.00 sec)-- 企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0
mysql> update emp set workno = lpad(workno, 5, '0');
Query OK, 0 rows affected (0.00 sec)
Rows matched: 3 Changed: 0 Warnings: 0mysql> select * from emp;
+----+--------+------+--------+------+----------+-------------+---------------------+
| id | workno | name | gender | age | idcard | workaddress | entrydate |
+----+--------+------+--------+------+----------+-------------+---------------------+
| 1 | 00001 | 张三 | 男 | 22 | 12345678 | 北京 | 2000-01-01 00:00:00 |
| 2 | 00002 | 李四 | 男 | 29 | 12345679 | 上海 | 2003-01-01 00:00:00 |
| 2 | 00003 | 王五 | 女 | 21 | 12345676 | 深圳 | 2002-01-01 00:00:00 |
+----+--------+------+--------+------+----------+-------------+---------------------+
3 rows in set (0.00 sec)
二、数值函数
-
常见的数值函数如下:函数功能
函数 功能 ceil(x) 向上取整 floor(x) 向下取整 mod(x,y) 返回x/y的模 rand() 返回0~1内的随机数 round(x,y) 求参数x的四舍五入的值,保留y位小数
2.1 ceil(x)
-- 向上取整
mysql> select ceil(1.1);
+-----------+
| ceil(1.1) |
+-----------+
| 2 |
+-----------+
1 row in set (0.00 sec)
2.2 floor(x)
-- 向下取整
mysql> select floor(1.9);
+------------+
| floor(1.9) |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)
2.3 mod(x,y)
-- 返回x/y的模
mysql> select mod(7,4);
+----------+
| mod(7,4) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
2.4 rand()
-- 返回0~1内的随机数
mysql> select rand();
+--------------------+
| rand() |
+--------------------+
| 0.8702676127387841 |
+--------------------+
1 row in set (0.00 sec)
2.5 round(x,y)
-- 求参数x的四舍五入的值,保留y位小数
mysql> select round(2.34,3);
+---------------+
| round(2.34,3) |
+---------------+
| 2.340 |
+---------------+
1 row in set (0.00 sec)
2.6 示例
-- 通过数据库的两函数,生成一个六位数的随机验证码
mysql> select lpad(round(rand()*1000000,0),6,'0');
+-------------------------------------+
| lpad(round(rand()*1000000,0),6,'0') |
+-------------------------------------+
| 131400 |
+-------------------------------------+
1 row in set (0.00 sec)
三、日期函数
-
常见的日期函数如下
函数 功能 curdate() 返回当前日期 curtime() 返回当前时间 now() 返回当前日期和时间 YEAR(date) 获取指定date的年份 MONTH(date) 获取指定date的月份 DAY(date) 获取指定date的日期 date_add(date,INTERVAL expr type) 返回一个日期/时间值加上一个时间间隔expr后的时间值 DATEDIFF(date1,date2) 返回起始时间date1和结束时间date2之间的天数 3.1 curdate()
-- 返回当前日期 mysql> select curdate(); +------------+ | curdate() | +------------+ | 2025-09-30 | +------------+ 1 row in set (0.00 sec)
3.2 curtime()
-- 返回当前时间 mysql> select curtime(); +-----------+ | curtime() | +-----------+ | 21:44:33 | +-----------+ 1 row in set (0.00 sec)
3.3 new()
-- 返回当前日期和时间 mysql> select now(); +---------------------+ | now() | +---------------------+ | 2025-09-30 21:45:47 | +---------------------+ 1 row in set (0.00 sec)
3.4 YEAR(date)
-- 获取指定date的年份 mysql> select YEAR (now()); +--------------+ | YEAR (now()) | +--------------+ | 2025 | +--------------+ 1 row in set (0.00 sec)
3.5 MONTH(date)
-- 获取指定date的月份 mysql> select MONTH(now()); +--------------+ | MONTH(now()) | +--------------+ | 9 | +--------------+ 1 row in set (0.00 sec)
3.6 DAY(date)
-- 获取指定date的日期 mysql> select DAY(now()); +------------+ | DAY(now()) | +------------+ | 30 | +------------+ 1 row in set (0.00 sec)
3.7 date_add(date,INTERVAL expr type)
-- 返回一个日期/时间值加上一个时间间隔expr后的时间值 mysql> select date_add(now(), INTERVAL 70 YEAR ); +------------------------------------+ | date_add(now(), INTERVAL 70 YEAR ) | +------------------------------------+ | 2095-09-30 21:50:39 | +------------------------------------+ 1 row in set (0.00 sec)
3.8 DATEDIFF(date1,date2)
-- 返回起始时间date1和结束时间date2之间的天数 mysql> select datediff('2025-09-30', '2022-09-30'); +--------------------------------------+ | datediff('2025-09-30', '2022-09-30') | +--------------------------------------+ | 1096 | +--------------------------------------+ 1 row in set (0.00 sec)
3.9 示例
-- 案例:查询所有员工的入职天数,并根据入职天数倒字排序 mysql> select * from emp; +----+--------+------+--------+------+----------+-------------+---------------------+ | id | workno | name | gender | age | idcard | workaddress | entrydate | +----+--------+------+--------+------+----------+-------------+---------------------+ | 1 | 00001 | 张三 | 男 | 22 | 12345678 | 北京 | 2000-01-01 00:00:00 | | 2 | 00002 | 李四 | 男 | 29 | 12345679 | 上海 | 2003-01-01 00:00:00 | | 2 | 00003 | 王五 | 女 | 21 | 12345676 | 深圳 | 2002-01-01 00:00:00 | +----+--------+------+--------+------+----------+-------------+---------------------+ 3 rows in set (0.00 sec)mysql> select name,datediff(curdate(),entrydate) as 'entrydate' from emp order by entrydate desc; +------+-----------+ | name | entrydate | +------+-----------+ | 张三 | 9404 | | 王五 | 8673 | | 李四 | 8308 | +------+-----------+ 3 rows in set (0.00 sec)
四、流程函数
-
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率
函数 功能 IF(value,t,f) 如果value为true,则返回t,否则返回f IFNULL(value1,value2) 如果value1不为空,返回value1,否则返回value2 CASE WHEN [val1] THEN [res1]…ELSE [default] END 如果val1为true,返回res1,…否则返回default默认值 CASE [expr] WHEN [val1] THEN [res1] … ELSE [default] END 如果expr的值等于vall,返回res1,…否则返回defaul默认值 4.1 if(value,t,f)
-- 如果value为true,则返回t,否则返回f mysql> select if(false, 'ok', 'Error'); +----------------------------+ | if(false, 'ok', 'Error') | +----------------------------+ | Error | +----------------------------+ 1 row in set (0.00 sec)
4.2 ifnull(value1,value2)
-- 如果value1不为空,返回value1,否则返回value2 -- 非空 mysql> select ifnull('yes','default'); +-------------------------+ | ifnull('yes','default') | +-------------------------+ | yes | +-------------------------+ 1 row in set (0.00 sec)# 空 mysql> select ifnull(null,'default'); +------------------------+ | ifnull(null,'default') | +------------------------+ | default | +------------------------+ 1 row in set (0.00 sec)
4.3 case when then else end
-- 如果val1为true,返回res1,...否则返回default默认值 -- 需求:查询emp表的员工姓名和工作地址:(北京/上海---->一线城市,其他---->二线城市) mysql> select name,(case workaddress when'北京' then '一线城市' when '上海' then '一线城市' when '深圳' then '一线城市' else '二线城市' end) as '工作地址' from emp; +------+----------+ | name | 工作地址 | +------+----------+ | 张三 | 一线城市 | | 李四 | 一线城市 | | 王五 | 一线城市 | +------+----------+ 3 rows in set (0.00 sec)
4.4 示例
-- 案例:统计班级各个学员的成绩,尼示的规则如下: -- >=85,展示优秀 -- >= 60,展示及格 -- 否则,展示不及格-- 数据准备 create table score( id int comment 'ID', name varchar(20) comment '姓名', math int comment '数学', english int comment '英语', chinese int comment '语文' )comment '学员成绩表';insert into score(id, name, math, english, chinese) values(1,'Tom', 67, 88, 95), (2, 'Rose', 23, 66, 90), (3, 'Jack', 56, 98, 76);-- 案例sql命令 select id, name, (case when math >= 85 then '优秀' when math >=60 then '及格' else '不及格' end ),(case when english >= 85 then '优秀' when english >=60 then '及格' else '不及格' end ),(case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格' end ) from score;-- 运行结果 mysql> select id, name, (case when math >= 85 then '优秀' when math >=60 then '及格' else '不及格' end ),(case when english >= 85 then '优秀' when english >=60 then '及格' else '不及格' end ),(case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格' end ) from score; +------+------+----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+ | id | name | (case when math >= 85 then '优秀' when math >=60 then '及格' else '不及格' end ) | (case when english >= 85 then '优秀' when english >=60 then '及格' else '不及格' end ) | (case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格' end ) | +------+------+----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+ | 1 | Tom | 及格 | 优秀 | 优秀 | | 2 | Rose | 不及格 | 及格 | 优秀 | | 3 | Jack | 不及格 | 优秀 | 及格 | +------+------+----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+ 3 rows in set (0.00 sec)