主题
#函数
函数:是指一段可以直接被另一段程序调用的程序或代码。 mysql 中内置了很多的函数,我们要做的只是去调用这些程序来完成我们的业务需求就行
函数的应用场景举例
字符串函数
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 位置(索引从 1 开始)起的 len 个长度的字符串 |
- 语法
sql
select 函数(参数);
-- 例如: select concat('Hello', ' Mysql'); ==> Hello Mysql
- 案例练习
由于业务需求变更,企业员工的工号,统一为 5 位数,目前不足 5 位数的全部在前面补 0。比如:1 号员工的工号应该为 00001。
sql
update emp set workno = lpad(workno, 5, '0');
数值函数
常见的数值函数
函数 | 功能 |
---|---|
CEIL(x) | 向上取整 |
FLOOR(x) | 向下取整 |
MOD(x,y) | 返回 x/y 的模 |
RAND() | 返回 0 ~ 1 内的随机数,例如:0.7657166577556326 |
ROUND(x,y) | 求参数 x 的四舍五入的值,保留 y 位小数 |
- 案例练习
通过数据库的函数,生成一个六位数的随机验证码。
sql
select substring(rand(), 3,6);
select lpad(round(rand() * 1000000, 0), 6, '0');
select rpad(round(rand() * 1000000, 0), 6, '0');
日期函数
常见的日期函数
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 例如:2020-01-02 |
CURTIME() | 返回当前时间 例如:23:12:00 |
NOW() | 返回当前日期和时间 例如:2020-01-02 23:10:15 |
YEAR(date) | 获取指定 date 的年份 例如:2021 |
MONTH(date) | 获取指定 date 的月份 例如:10 |
DAY(date) | 获取指定 date 的日期 例如:11 |
DATE_ADD(date, INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔 expr 后的时间值 提示: INTERVAL 是固定写法expr 是一个变量,一般为数值type 取值为时间单位,例如YEAR 、MONTH 、DAY expr type 组合就是需要新增的值例如 date_add(now(), interval 70 DAY) --> 表示要在当前时间基础上新增 70 天 |
DATEDIFF(date1,date2) | 返回起始时间 date1 和结束时间 date2 之间的天数 |
提示
CURDATE、CURTIME 中的CUR
是 current
这个单词的缩写
- 案例练习
查询所有员工的入职天数,并根据入职天数倒序排序。
sql
select name,datediff(curdate(), entrydate) as entrydates from emp order by entrydates desc;
流程函数
流程函数可以在 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(表达式) 的值等于 val1,返回 res1,..否则返回 default 默认值 |
- 示例
sql
--1. if
select if(false, 'OK', 'ERR'); -- ERR
select if(123, 'OK', 'ERR'); -- OK
-- 2. ifnull
select ifnull(null, 'NULL'); -- NULL
select ifnull(123, 'NULL'); -- 123
select ifnull('', 'NULL'); -- ''
-- 3. case when val1 then res1 else delfault end
-- 需求:查询emp表的员工姓名和工作地址(北京/上海—>一线城市,其他>二线城市)
select
name,
workaddress,
( case when ( workaddress = '北京' or workaddress = '上海' ) then '一线城市' else '二线城市' end ) as city
from
emp;
-- 或者
select
name,
workaddress,
(case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as city
from
emp;
- 案例练习
前提条件,准备一张学员成绩表
sql
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
/*
统计班级各个学员的成绩,展示的规则如下:
>=85,展示优秀
>=60,展示及格
否则,展示不及格
*/
select
name,
(case when math >=85 then '优秀' when math >= 60 then '及格' else '不及格' end) math,
(case when english >=85 then '优秀' when english >= 60 then '及格' else '不及格' end) english,
(case when chinese >=85 then '优秀' when chinese >= 60 then '及格' else '不及格' end) chinese
from score;
结果展示