Skip to content

#函数

函数:是指一段可以直接被另一段程序调用的程序或代码。 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取值为时间单位,例如YEARMONTHDAY
expr type组合就是需要新增的值
例如 date_add(now(), interval 70 DAY) --> 表示要在当前时间基础上新增 70 天
DATEDIFF(date1,date2)返回起始时间 date1 和结束时间 date2 之间的天数

提示

CURDATE、CURTIME 中的CURcurrent 这个单词的缩写

  • 案例练习

查询所有员工的入职天数,并根据入职天数倒序排序。

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;

结果展示