C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 数据库原理

    • 数据库原理 - MySQL概述
    • 数据库原理 - 数据库是如何工作的
  • SQL语言

    • SQL语言 - 知识体系结构
    • SQL语言 - 语法
    • SQL语言 - 约束
    • SQL语言 - 函数
    • SQL语言 - 连接查询
    • SQL语言 - 多表查询
    • SQL语言 - 子查询
    • SQL语言 - 使用技巧
  • SQL - MySQL

    • MySQL基础

      • ♥MySQL语言知识体系详解♥
      • MySQL基础 - 基本概念
      • MySQL基础 - 三范式
      • MySQL基础 - 数据类型
      • MySQL基础 - 视图
      • MySQL基础 - 存储过程
    • MySQL进阶

      • MySQL进阶 - 存储引擎
      • MySQL进阶 - InnoDB引擎
      • MySQL进阶 - 索引基础
      • MySQL进阶 - 聚簇索引和非聚簇索引
      • MySQL进阶 - 索引使用
      • MySQL进阶 - SQL性能分析
      • MySQL进阶 - SQL性能优化
      • MySQL进阶 - 锁
      • MySQL进阶 - 触发器
      • MySQL进阶 - 事务
      • MySQL进阶 - 管理工具
    • MySQL运维

      • MySQL运维 - 主从复制
      • MySQL运维 - 分库分表
      • MySQL运维 - 读写分离
      • MySQL进阶 - 日志分析
    • MySQL实战

      • MySQL实战 - 一条 SQL 的执行过程详解
      • MySQL实战 - SQL是如何解析的
      • MySQL实战 - MyCat使用
  • NoSQL - Redis

    • Redis基础 - 简介
    • Redis基础 - 命令
    • Redis进阶 - 持久化
    • Redis进阶 - 事务
    • Redis进阶 - 删除策略
    • Redis进阶 - 主从复制
    • Redis进阶 - 哨兵模式
    • Redis应用 - 集群概念以及应用
    • Redis应用 - 企业级解决方案
  • NoSQL - ElasticSearch

    • ElasticSearch集群 - 概念
    • ElasticSearch集群 - 安装
    • ElasticSearch集群 - 部署
    • ElasticSearch数据 - 分析与处理
    • ElasticSearch数据 - 搜索
    • ElasticSearch数据 - 存储
    • ElasticSearch应用 - ES与MySQL数据同步

SQL语言 - 函数

函数是指一段可以直接被另一段程序调用的程序或代码。

    概述

    函数是指一段可以直接被另一段程序调用的程序或代码。这一段程序或代码在MySQL中已经提供了,我们需要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。

    两个场景:

    • 在企业的OA或其他的人力系统中,经常会提供的有这样一个功能,每一个员工登录上来之后都能够看到当前员工入职的天数。 而在数据库中,存储的都是入职日期,如 2005-1-1,那如果快速计算出天数呢?

    • 在做报表这类的业务需求中,要展示出学员的分数等级分布。而在数据库中,存储的是学生的分数值,如98/75,如何快速判定分数的等级呢?

    上述的这一类的需求呢,通过MySQL中的函数都可以很方便的实现。

    MySQL中的函数主要分为以下四类:

    • 字符串函数
    • 数值函数
    • 日期函数
    • 流程函数

    字符串函数

    常用函数:

    函数功能
    CONCAT(s1, s2, ..., sn)字符串拼接,将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从start位置起的len个长度的字符串

    使用示例:

    详情
    -- 拼接
    SELECT CONCAT('Hello', 'World');
    -- 小写
    SELECT LOWER('Hello');
    -- 大写
    SELECT UPPER('Hello');
    -- 左填充
    SELECT LPAD('01', 5, '-');
    -- 右填充
    SELECT RPAD('01', 5, '-');
    -- 去除空格
    SELECT TRIM(' Hello World ');
    -- 切片(起始索引为1)
    SELECT SUBSTRING('Hello World', 1, 5);
    
    
    mysql> SELECT CONCAT('Hello', 'World');
    +--------------------------+
    | CONCAT('Hello', 'World') |
    +--------------------------+
    | HelloWorld               |
    +--------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT LOWER('Hello');
    +----------------+
    | LOWER('Hello') |
    +----------------+
    | hello          |
    +----------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT UPPER('Hello');
    +----------------+
    | UPPER('Hello') |
    +----------------+
    | HELLO          |
    +----------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT LPAD('01', 5, '-');
    +--------------------+
    | LPAD('01', 5, '-') |
    +--------------------+
    | ---01              |
    +--------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT RPAD('01', 5, '-');
    +--------------------+
    | RPAD('01', 5, '-') |
    +--------------------+
    | 01---              |
    +--------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT TRIM(' Hello World ');
    +-----------------------+
    | TRIM(' Hello World ') |
    +-----------------------+
    | Hello World           |
    +-----------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT SUBSTRING('Hello World', 1, 5);
    +--------------------------------+
    | SUBSTRING('Hello World', 1, 5) |
    +--------------------------------+
    | Hello                          |
    +--------------------------------+
    1 row in set (0.00 sec)
    
    
    由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如: 1号员工的工号应该为00001。
    
    update emp set workno = lpad(workno, 5, '0');
    
    mysql> select * from emp;
    +------+--------+-----------+--------+------+--------------------+-------------+------------+
    | id   | workno | name      | gender | age  | idcard             | workaddress | entrydate  |
    +------+--------+-----------+--------+------+--------------------+-------------+------------+
    |    1 | 1      | 柳岩    | 女    |   20 | 123456789012345678 | 北京      | 0002-01-01 |
    |    2 | 2      | 张无忌 | 男    |   18 | 123456789012345670 | 北京      | 2005-09-01 |
    |    3 | 3      | 韦一笑 | 男    |   38 | 123456789712345670 | 上海      | 2005-08-01 |
    |    4 | 4      | 赵敏    | 女    |   18 | 123456757123845670 | 北京      | 2009-12-01 |
    |    5 | 5      | 小昭    | 女    |   16 | 123456769012345678 | 上海      | 2007-07-01 |
    |    6 | 6      | 杨逍    | 男    |   28 | 12345678931234567X | 北京      | 2006-01-01 |
    |    7 | 7      | 范瑶    | 男    |   40 | 123456789212345670 | 北京      | 2005-05-01 |
    |    8 | 8      | 黛绮丝 | 女    |   38 | 123456157123645670 | 天津      | 2015-05-01 |
    |    9 | 9      | 范凉凉 | 女    |   45 | 123156789012345678 | 北京      | 2010-04-01 |
    |   10 | 10     | 陈友谅 | 男    |   53 | 123456789012345670 | 上海      | 2011-01-01 |
    |   11 | 11     | 张士诚 | 男    |   55 | 123567897123465670 | 江苏      | 2015-05-01 |
    |   12 | 12     | 常遇春 | 男    |   32 | 123446757152345670 | 北京      | 2004-02-01 |
    |   13 | 13     | 张三丰 | 男    |   88 | 123656789012345678 | 江苏      | 2020-11-01 |
    |   14 | 14     | 灭绝    | 女    |   65 | 123456719012345670 | 西安      | 2019-05-01 |
    |   15 | 15     | 胡青牛 | 男    |   70 | 12345674971234567X | 西安      | 2018-04-01 |
    |   16 | 16     | 周芷若 | 女    |   18 | NULL               | 北京      | 2012-06-01 |
    +------+--------+-----------+--------+------+--------------------+-------------+------------+
    16 rows in set (0.00 sec)
    
    mysql> update emp set workno = lpad(workno, 5, '0');
    Query OK, 16 rows affected (0.01 sec)
    Rows matched: 16  Changed: 16  Warnings: 0
    
    mysql> select * from emp;
    +------+--------+-----------+--------+------+--------------------+-------------+------------+
    | id   | workno | name      | gender | age  | idcard             | workaddress | entrydate  |
    +------+--------+-----------+--------+------+--------------------+-------------+------------+
    |    1 | 00001  | 柳岩    | 女    |   20 | 123456789012345678 | 北京      | 0002-01-01 |
    |    2 | 00002  | 张无忌 | 男    |   18 | 123456789012345670 | 北京      | 2005-09-01 |
    |    3 | 00003  | 韦一笑 | 男    |   38 | 123456789712345670 | 上海      | 2005-08-01 |
    |    4 | 00004  | 赵敏    | 女    |   18 | 123456757123845670 | 北京      | 2009-12-01 |
    |    5 | 00005  | 小昭    | 女    |   16 | 123456769012345678 | 上海      | 2007-07-01 |
    |    6 | 00006  | 杨逍    | 男    |   28 | 12345678931234567X | 北京      | 2006-01-01 |
    |    7 | 00007  | 范瑶    | 男    |   40 | 123456789212345670 | 北京      | 2005-05-01 |
    |    8 | 00008  | 黛绮丝 | 女    |   38 | 123456157123645670 | 天津      | 2015-05-01 |
    |    9 | 00009  | 范凉凉 | 女    |   45 | 123156789012345678 | 北京      | 2010-04-01 |
    |   10 | 00010  | 陈友谅 | 男    |   53 | 123456789012345670 | 上海      | 2011-01-01 |
    |   11 | 00011  | 张士诚 | 男    |   55 | 123567897123465670 | 江苏      | 2015-05-01 |
    |   12 | 00012  | 常遇春 | 男    |   32 | 123446757152345670 | 北京      | 2004-02-01 |
    |   13 | 00013  | 张三丰 | 男    |   88 | 123656789012345678 | 江苏      | 2020-11-01 |
    |   14 | 00014  | 灭绝    | 女    |   65 | 123456719012345670 | 西安      | 2019-05-01 |
    |   15 | 00015  | 胡青牛 | 男    |   70 | 12345674971234567X | 西安      | 2018-04-01 |
    |   16 | 00016  | 周芷若 | 女    |   18 | NULL               | 北京      | 2012-06-01 |
    +------+--------+-----------+--------+------+--------------------+-------------+------------+
    16 rows in set (0.00 sec)
    
    

    数值函数

    常见函数:

    函数功能
    CEIL(x)向上取整
    FLOOR(x)向下取整
    MOD(x, y)返回x/y的模
    RAND()返回0~1内的随机数
    ROUND(x, y)求参数x的四舍五入值,保留y位小数
    详情
    -- A. ceil:向上取整
    	select ceil(1.1);
    -- B. floor:向下取整
    	select floor(1.9);
    -- C. mod:取模
    	select mod(7,4);
    -- D. rand:获取随机数
    	select rand();
    -- E. round:四舍五入
    	select round(2.344,2);
    -- F. 通过数据库的函数,生成一个六位数的随机验证码。
    -- 	思路: 获取随机数可以通过rand()函数,但是获取出来的随机数是在0-1之间的,所以可以在其基础上乘以1000000,然后舍弃小数部分,如果长度不足6位,补0
    	select lpad(round(rand()*1000000 , 0), 6, '0');
    	
    	
    mysql> select ceil(1.1);
    +-----------+
    | ceil(1.1) |
    +-----------+
    |         2 |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> select floor(1.9);
    +------------+
    | floor(1.9) |
    +------------+
    |          1 |
    +------------+
    1 row in set (0.00 sec)
    
    mysql> select mod(7,4);
    +----------+
    | mod(7,4) |
    +----------+
    |        3 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> select rand();
    +--------------------+
    | rand()             |
    +--------------------+
    | 0.9710186402974824 |
    +--------------------+
    1 row in set (0.00 sec)
    
    mysql> select round(2.344,2);
    +----------------+
    | round(2.344,2) |
    +----------------+
    |           2.34 |
    +----------------+
    1 row in set (0.00 sec)
    
    mysql> select lpad(round(rand()*1000000 , 0), 6, '0');
    +-----------------------------------------+
    | lpad(round(rand()*1000000 , 0), 6, '0') |
    +-----------------------------------------+
    | 657867                                  |
    +-----------------------------------------+
    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之间的天数

    例子:

    详情
    -- A. curdate:当前日期
     	select curdate();
    -- B. curtime:当前时间
     	select curtime();
    -- C. now:当前日期和时间
     	select now();
    -- D. YEAR , MONTH , DAY:当前年、月、日
     	select YEAR(now());
     	select MONTH(now());
     	select DAY(now());
    -- E. date_add:增加指定的时间间隔
    	select date_add(now(), INTERVAL 70 YEAR );
    -- F. datediff:获取两个日期相差的天数
     	select datediff('2021-10-01', '2021-12-01');
    -- G. 查询所有员工的入职天数,并根据入职天数倒序排序。
    -- 	思路: 入职天数,就是通过当前日期 - 入职日期,所以需要使用datediff函数来完成。
     	select name, datediff(curdate(), entrydate) as 'entrydays' from emp order by entrydays desc;
    	
    mysql> select curdate();
    +------------+
    | curdate()  |
    +------------+
    | 2022-08-27 |
    +------------+
    1 row in set (0.01 sec)
    
    mysql> select curtime();
    +-----------+
    | curtime() |
    +-----------+
    | 13:27:04  |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> select now();
    +---------------------+
    | now()               |
    +---------------------+
    | 2022-08-27 13:27:12 |
    +---------------------+
    1 row in set (0.00 sec)
    
    mysql> select YEAR(now());
    +-------------+
    | YEAR(now()) |
    +-------------+
    |        2022 |
    +-------------+
    1 row in set (0.00 sec)
    
    mysql> select MONTH(now());
    +--------------+
    | MONTH(now()) |
    +--------------+
    |            8 |
    +--------------+
    1 row in set (0.00 sec)
    
    mysql> select DAY(now());
    +------------+
    | DAY(now()) |
    +------------+
    |         27 |
    +------------+
    1 row in set (0.00 sec)
    
    mysql> select date_add(now(), INTERVAL 70 YEAR );
    +------------------------------------+
    | date_add(now(), INTERVAL 70 YEAR ) |
    +------------------------------------+
    | 2092-08-27 13:27:39                |
    +------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select datediff('2021-10-01', '2021-12-01');
    +--------------------------------------+
    | datediff('2021-10-01', '2021-12-01') |
    +--------------------------------------+
    |                                  -61 |
    +--------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select name, datediff(curdate(), entrydate) as 'entrydays' from emp order by entrydays desc;
    +-----------+-----------+
    | name      | entrydays |
    +-----------+-----------+
    | 柳岩    |    738028 |
    | 常遇春 |      6782 |
    | 范瑶    |      6327 |
    | 韦一笑 |      6235 |
    | 张无忌 |      6204 |
    | 杨逍    |      6082 |
    | 小昭    |      5536 |
    | 赵敏    |      4652 |
    | 范凉凉 |      4531 |
    | 陈友谅 |      4256 |
    | 周芷若 |      3739 |
    | 黛绮丝 |      2675 |
    | 张士诚 |      2675 |
    | 胡青牛 |      1609 |
    | 灭绝    |      1214 |
    | 张三丰 |       664 |
    +-----------+-----------+
    16 rows in set (0.00 sec)
    
    

    流程函数

    常用函数:

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

    例子:

    详情
    -- A. if
    -- 	select ifnull('Ok','Default');
    -- B. ifnull
    -- 	select ifnull('Ok','Default');
    -- 	select ifnull('','Default');
    -- 	select ifnull(null,'Default');
    -- C. case when then else end
    -- 	需求: 查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)
    -- 	select name,( case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end ) as '工作地址' from emp;
    
    mysql> select ifnull('Ok','Default');
    +------------------------+
    | ifnull('Ok','Default') |
    +------------------------+
    | Ok                     |
    +------------------------+
    1 row in set (0.00 sec)
    
    mysql> select ifnull('Ok','Default');
    +------------------------+
    | ifnull('Ok','Default') |
    +------------------------+
    | Ok                     |
    +------------------------+
    1 row in set (0.00 sec)
    
    mysql> select ifnull('','Default');
    +----------------------+
    | ifnull('','Default') |
    +----------------------+
    |                      |
    +----------------------+
    1 row in set (0.00 sec)
    
    mysql> select ifnull(null,'Default');
    +------------------------+
    | ifnull(null,'Default') |
    +------------------------+
    | Default                |
    +------------------------+
    1 row in set (0.00 sec)
    
    mysql> select name,( case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end ) as '工作地址' from emp;
    +-----------+-------------+
    | name      | 工作地址 |
    +-----------+-------------+
    | 柳岩    | 一线城市      |
    | 张无忌  | 一线城市      |
    | 韦一笑  | 一线城市      |
    | 赵敏    | 一线城市      |
    | 小昭    | 一线城市      |
    | 杨逍    | 一线城市      |
    | 范瑶    | 一线城市      |
    | 黛绮丝  | 二线城市      |
    | 范凉凉  | 一线城市      |
    | 陈友谅  | 一线城市      |
    | 张士诚  | 二线城市      |
    | 常遇春  | 一线城市      |
    | 张三丰  | 二线城市      |
    | 灭绝    | 二线城市      |
    | 胡青牛  | 二线城市      |
    | 周芷若  | 一线城市      |
    +-----------+-------------+
    
    
    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);
    
    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  姓名	数学	英语	语文
    1	Tom		及格	优秀	优秀
    2	Rose	不及格	及格	优秀
    3	Jack	不及格	优秀	及格
    
    
    Last Updated:
    Contributors: klc407073648
    Prev
    SQL语言 - 约束
    Next
    SQL语言 - 连接查询