【悄咪咪学MySql】5. 函数

107 阅读3分钟

一. 字符串函数

1. 常用字符串函数

函数功能
CONCAT(S1, S2, ..., Sn)字符串拼接
LOWER(str)转小写
UPPER(str)转大写
LPAD(str, n, pad)左填充,用字符串pad对str左边填充,达到n个字符长度
RPAD(str, n, pad)右填充,用字符串pad对str右边填充,达到n个字符长度
TRIM(str)去掉头尾的空格
SUBSTRING(str, start, len)截取str,在str的start位置截取len长度的字符串,索引从1开始

2. 案例

由于业务升级,公司对员工工号有新的要求,工号需要为 5 位,不足5位的前面补0

UPDATE 表名 SET WORKNO = LPAD(WORKNO, 5 , '0');

二. 数值函数

1. 常用的数值函数

函数功能
CEIL(x)向上取整
FLOOR(x)向下取整
MOD(x, y)返回 x/y的模
RAND()返回 0~1 内的随机值
ROUND(x, y)求x的四舍五入值,保留y位小数

2. 案例

通过数据库函数,生成6位数随机验证码

SELECT LPAD(FLOOR(RAND() * 1000000), 6, '0');

存在 RAND() 得出 0.00xxxx 的情况,导致不使用 LPAD 时不足 6 位的情况

三. 日期函数

1. 常用的日期函数

函数功能
CURDATE()获取当前日期
CURTIME()获取当前时间
NOW()获取当前日期和时间
YEAR(date)获取指定date的年份
MONTH(date)获取指定date的月份
DAY(date)获取指定date的日期
DATE_ADD(date, INTERVAL expr type)返回一个日期 / 时间值 加上一个时间间隔 expr 后的时间值
DATEDIFF(date1, date2)返回起始时间date1 和 结束时间date2 之间的天数,date1 - date2 如果 date1 < date2 那么会导致得数为负

2. 案例

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

SELECT NAME '姓名', DATEDIFF(CURDATE(), ENTRYDATE) '入职天数' FROM 表名 ORDER BY '入职天数' DESC;

四. 流程控制函数

1.常用流程控制函数

函数功能
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

2. 案例

  • 查询emp表的员工姓名和工作地址(北京/上海 --> 一线城市,其他 --> 二线城市)
-- IF()
SELECT
    NAME,
    IF(WORKADDRESS IN ('北京', '上海'), '一线城市', '二线城市') WORKADDRESSTYPE
FROM
    EMP;

-- CASE WHEN THEN ELSE END
SELECT
    NAME,
    (CASE WORKADDRESS 
        WHEN '北京' THEN '一线城市'
        WHEN '上海' THEN '一线城市'
        ELSE '二线城市'
    END) AS WORKADDRESSTYPE
FROM
    EMP;
  • 统计班级各个学员的成绩,展示的规则如下:
    • score表,id, name, math, english, chinese
    • >= 85,展示优秀
    • >= 60,暂时及格
    • 否则,暂时不及格
SELECT
    NAME,
    (CASE 
        WHEN MATH >= 85 THEN '优秀'
        WHEN MATH >= 60 THEN '及格'
        ELSE '不及格'
    END) AS '数学成绩',
    (CASE 
        WHEN ENGLISH >= 85 THEN '优秀'
        WHEN ENGLISH >= 60 THEN '及格'
        ELSE '不及格'
    END) AS '英语成绩',
    (CASE 
        WHEN CHINESE >= 85 THEN '优秀'
        WHEN CHINESE >= 60 THEN '及格'
        ELSE '不及格'
    END) AS '语文成绩'
FROM
    SCORE