MySQL从入门到高级 --- 6.函数

news2024/11/26 18:32:41

文章目录

    • 第六章:
      • 6.函数
        • 6.1 聚合函数
        • 6.2 数学函数
        • 6.3 字符串函数
        • 6.4 日期函数
          • 6.4.1 日期格式
        • 6.5 控制流函数
          • 6.5.1 if逻辑判断语句
          • 6.5.2 case when语句
        • 6.6 窗口函数
          • 6.6.1 序号函数
          • 6.6.2 开窗聚合函数
          • 6.6.3 分布函数
          • 6.6.4 前后函数
          • 6.6.5 头尾函数
          • 6.6.6 其他函数
          • 6.7 练习

第六章:

6.函数

作用:提高代码重用性和隐藏实现细节

分类

  • 聚合函数

  • 数学函数

  • 字符串函数

  • 日期函数

  • 控制流函数

  • 窗口函数

6.1 聚合函数
  • group_concat()

作用:根据group by指定的列进行分组,并用分隔符分隔,将同一个分组中的值连接起来,返回一个字符串结果,实现行的合并

语法:group_concat ([distinct] 字段名 [order by 排序字段 asc/desc] [separator ‘分隔符’] )

separator为一个字符串值,默认为逗号

在这里插入图片描述

6.2 数学函数
函数名功能
ABS(x)返回x的绝对值
CEIL(x)返回大于或等于x的最小整数
FLOOR(x)返回小于或等于x的最大整数
GREATEST(expr1, expr2, expr3, …)返回列表中的最大值
LEAST(expr1, expr2, expr3, …)返回列表中的最小值

在这里插入图片描述

函数名功能
MAX(expression)返回字段expression中的最大值
MIN(expression)返回字段expression中的最小值
MOD(x,y)返回x除以y后的余数
PI()返回圆周率 3.141593
POW(x,y)返回x的y次方

在这里插入图片描述

函数名功能
RAND()返回0到1的随机值
ROUND(x)返回离x最近的整数,遵循四舍五入规则
ROUND(x,y)返回指定位数的小数,遵循四舍五入规则
TRUNCATE(x,y)返回数值x保留到小数点后y位的值,不遵循四舍五入规则

在这里插入图片描述

6.3 字符串函数
函数名功能
CHAR_LENGTH(s)返回字符串s的字符数
CHARACTER_LENGTH(s)返回字符串s的字符数
CONCAT(s1,s2,s3,…)s1,s2等多个字符串合并成一个字符串
CONCAT_WS(s1,s2,s3,…)同CONCAT函数,每个字符串之间加上x,x可以是分隔符
FIELD(s,s1,s2,s3,…)返回第一个字符串s在字符串列表(s1,s2,…)中的位置

在这里插入图片描述

函数名功能
LTRIM(s)去除字符串s开始处的空格
MID(s,n,len)从字符串s的n位置开始截取长度为len的子字符串,同SUBSTRING函数
POSITION(s1 IN s)从字符串s中获取s1的开始位置
REPLACE(s,s1,s2)字符串s2替代字符串s中的字符串s1
REVERSE(s)字符串s的顺序反过来

在这里插入图片描述

函数名功能
RIGHT(s,n)返回字符串s的后n个字符
RTRIM(s)去除字符串s结尾处的空格
STRCMP(s1,s2)比较s1和s2,若相等返回0,s1>s2返回1,s1<s2返回-1
SUBSTR(s,start,len)从字符串s的start位置开始截取长度为len的子字符串
SUBTRING(s,start,len)从字符串s的start位置开始截取长度为len的子字符串

在这里插入图片描述

函数名功能
TRIM(s)去除字符串s开始和结尾处的空格
UCASE(s)字符串转换为大写
UPPER(s)字符串转换为大写
LCASE(s)字符串转换为小写
LOWER(s)字符串转换为小写

在这里插入图片描述

6.4 日期函数
函数名功能
UNIX_TIMESTAMP()返回从1970-01-01 00:00:00到当前毫秒值
UNIX_TIMESTAMP(DATE_STRING)将制定日期转为毫秒值时间戳
FROM_UNIXTIME(BIGINT UNIXTIME[, STRING FORMAT])将毫秒值时间戳转为指定格式日期
CURDATE()返回当前日期
CURRENT_DATE()返回当前日期

在这里插入图片描述

函数名功能
TIMEDIFF(time1, time2)计算时间差值
DATE_FORMAT(d, f)按表达式f的要求显示日期d
STR_TO_DATE(string, format_mask)将字符串转为日期
DATE_SUB(date, INTERVAL expr type)函数从日期减去指定的时间间隔
在这里插入图片描述

在这里插入图片描述

6.4.1 日期格式
描述描述
%a缩写星期名
%b缩写月名
%c月,数值
%D带有英文前缀的月中的天
%d月的天,数值(00-31)
%e月的天,数值(0-31)
%f微秒
%H小时(00-23)
%h小时(01-12)
%I小时(01-12)
%i分钟,数值(00-59)
%j年的天(001-366)
%k小时(0-23)
%l小时(1-12)
%M月名
%m月,数值(00-12)
%pAM 或 PM
%r时间,12-小时(hh:mm:ss AM 或PM)
%S秒(00-59)
%s秒(00-59)
%T时间,24-小时(hh:mm:ss)
%U周(00-53)星期日是一周的第一天
%u周(00-53)星期一是一周的第一天
%V周(01-53)星期日是一周的第一天,与%X使用
%v周(01-53)星期一是一周的第一天,与%x使用
%W星期名
%w周的天(0=星期日, 6=星期六)
%X年,其中的星期日是周的第一天,4位,与%V使用
%x年,其中的星期一是周的第一天,4位,与%v使用
%Y年,4位
%y年,2位
6.5 控制流函数
6.5.1 if逻辑判断语句
格式含义
IF(expr, v1, v2)若表达式expr成立,返回结果v2,否则返回结果v2
IFNULL(v1, v2)若v1的值不为NULL,返回v1,否则返回v2
ISNULL(expression)判断表达式是否为NULL
NULLIF(expr1, expr2)若字符串expr1与expr2字符串相等返回NULL,否则返回expr1

在这里插入图片描述

6.5.2 case when语句

格式

CASE expression

WHEN conditon1 THEN result1

WHEN conditon2 THEN result2

....

WHEN conditonN THEN resultN

ELSE result

END

含义:CASE表示函数开始,END表示函数结束。若condition1成立,返回result1,condition2成立,返回result2,当全部不成立返回result,而当有一个成立后,后面将不再执行

在这里插入图片描述

6.6 窗口函数

窗口函数又被称为开窗函数。

非聚合窗口函数对于聚合函数来说,聚合函数是一组数据计算后返回单个值,非聚合函数一次指挥处理一行数据。窗口聚合函数在行记录上计算某个字段的结果时,可将窗口范围内的数据输入到聚合函数中,并不改变行数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

语法

windows_function (expr) OVER(
    PARTITION BY ...    
    ORDER BY ...
    frame_clause
)
  • windows_function:窗口函数名

  • expr:参数

  • OVER:包含三个选项

  1. 分区(PARTITION BY):用于将数据行拆分成多个分区。若省略PARTITION BY,所有数据作为一个组进行计算

  2. 排序(ORDER BY):用于指定分区内的排序方式

  3. 窗口大小(frame_clause):用于在当前分区内指定一个计算窗口

6.6.1 序号函数
  • ROW_NUMBER()

  • RANK()

  • DENSE_RANK()

作用:实现分组排序,并添加序号

语法

row_number() | rank() | dense_rank() over(
    partition by ...
    order by ...
)
create table emp(
    dname varchar(20),
    ename varchar(20),
    eid varchar(20),
    sal double
);

insert into emp values('技术部', '101', 'xiaoming', '3500');
insert into emp values('技术部', '101', 'xiaowang', '4000');
insert into emp values('技术部', '101', 'xiaoli', '3600');


insert into emp values('运营部', '102', 'xiaohua', '3000');
insert into emp values('运营部', '102', 'xiaohong', '3100');
insert into emp values('运营部', '102', 'xiaolu', '3300');

-- 对每个部门员工按薪资排序,给出排名
select dname,ename,sal,
 row_number() over(partition by dname order by sal desc) as rn1,
 rank() over(partition by dname order by sal desc) as rn2,
 dense_rank() over(partition by dname order by sal desc) as rn3
from emp;

-- 求出每个部门薪水排前两名的员工,分组求TOPN
select * from (select dname,ename,sal, dense_rank() over(partition by dname order by sal desc) as rn from emp)t where t.rn <= 2;

-- 对所有员工进行全局排序 
select dname,ename,sal,dense_rank() over(partition by dname order by sal desc) as rn from emp;
6.6.2 开窗聚合函数

SUM, AVG, MIN, MAX

  • 在窗口中每条记录动态地应用聚合函数,可动态计算在指定地窗口内的各种聚合函数值
create table emp(
    dname varchar(20),
    ename varchar(20),
    eid varchar(20),
    sal double
);

insert into emp values('技术部', '101', 'xiaoming', '3500');
insert into emp values('技术部', '101', 'xiaowang', '4000');
insert into emp values('技术部', '101', 'xiaoli', '3600');


insert into emp values('运营部', '102', 'xiaohua', '3000');
insert into emp values('运营部', '102', 'xiaohong', '3100');
insert into emp values('运营部', '102', 'xiaolu', '3300');

-- 对每个部门员工按薪资排序,给出排名
select dname,ename,sal,
 row_number() over(partition by dname order by sal desc) as rn1,
 rank() over(partition by dname order by sal desc) as rn2,
 dense_rank() over(partition by dname order by sal desc) as rn3
from emp;

-- 求出每个部门薪水排前两名的员工,分组求TOPN
select * from (select dname,ename,sal, dense_rank() over(partition by dname order by sal desc) as rn from emp)t where t.rn <= 2;

-- 对所有员工进行全局排序 
select dname,ename,sal,dense_rank() over(partition by dname order by sal desc) as rn from emp;

-- 若没有ORDER BY排序语句, 默认把分组内所有数据进行sum操作
select dname,ename,sal,sum(sal) over(partition by dname order by sal desc) as p1 from emp;
select dname,ename,sal,sum(sal) over(partition by dname ) as p2 from emp;
select dname,ename,sal,sum(sal) over(partition by dname rows between 3 preceding and current row) as p3 from emp;
select dname,ename,sal,sum(sal) over(partition by dname rows between 3 preceding and 1 following) as p4 from emp;
select dname,ename,sal,sum(sal) over(partition by dname rows between current row and unbounded following) as p5 from emp;
select dname,ename,sal,max(sal) over(partition by dname order by sal desc) as p5 from emp;
6.6.3 分布函数

CUME_DIST 和 PERECENT_RANK

  • CUME_DIST:用于分组内小于、等于当前rank值的行数/分组内总行数,应用于查询小于等于当前薪资(sal)比例
create table emp(
    dname varchar(20),
    ename varchar(20),
    eid varchar(20),
    sal double
);

insert into emp values('技术部', '101', 'xiaoming', '3500');
insert into emp values('技术部', '101', 'xiaowang', '4000');
insert into emp values('技术部', '101', 'xiaoli', '3600');
insert into emp values('技术部', '101', 'xiaoni', '3500');
insert into emp values('技术部', '101', 'xiaona', '3400');
insert into emp values('技术部', '101', 'xiaone', '3300');
insert into emp values('技术部', '101', 'xiaonl', '3200');

insert into emp values('运营部', '102', 'xiaohua', '3000');
insert into emp values('运营部', '102', 'xiaohong', '3100');
insert into emp values('运营部', '102', 'xiaolu', '3300');
insert into emp values('运营部', '102', 'xiaolo', '3800');
insert into emp values('运营部', '102', 'xiaola', '3700');
insert into emp values('运营部', '102', 'xiaole', '3600');
insert into emp values('运营部', '102', 'xiaolt', '3000');

select dname,ename,sal, 
    cume_dist() over(order by sal) as rn1, -- 没有partition语句 所有数位于一组
    cume_dist() over(partition by ename order by sal) as rn2 
from emp;
  • PERECENT_RANK:用于每行按照公式(rank-1) / (rows-1)进行计算,rank为rank()函数产生的序号,rows为当前窗口的记录总行数。不常用。
select dname,ename,sal,
  rank() over(partition by dname order by sal desc) as rn,
    percent_rank() over(partition by dname order by sal desc) as rn2
 from emp;
6.6.4 前后函数

LAG和LEAD

  • 用于返回位于当前行的前n行(LAG(expr, n)或后n行(LEAD(expr, n)的expr值,应用于查询前1名同学的成绩和当前同学成绩的差值
 -- LAG 
 select dname,ename,sal,
    lag(sal,1,3500) over(partition by dname order by sal ) as last_1_sal,
    lag(sal,2) over(partition by dname order by sal ) as last_2_sal
from emp;

-- LEAD 
 select dname,ename,sal,
    lead(sal,1,3500) over(partition by dname order by sal ) as last_1_sal,
    lead(sal,2) over(partition by dname order by sal ) as last_2_sal
from emp;
6.6.5 头尾函数

FIRST_VALUE和LAST_VALUE

  • 用于返回第一个(FIRST_VALUE)或最后一个(LAST_VALUE)的expr值。应用于截止到目前,按入职编号排序查询第一个入职和最后一个入职的员工薪资
select dname, ename, sal, eid, -- 若不指定order by 将会排序混乱,出现错误的结果
    first_value(sal) over(partition by dname order by eid) as first,
    last_value(sal) over(partition by dname order by eid) as last 
from emp;
6.6.6 其他函数

NTH_VALUE(expr, n)和NTILE(n)

  • 用于返回窗口中第n个expr值。应用于截止到当前薪资,显示每个员工中薪资排第2或3的薪资
-- NTH_VALUE()
-- 查询各部门截止目前薪资排第2或3的员工个人信息
select dname, ename, sal, eid, -- 若不指定order by 将会排序混乱,出现错误的结果
    nth_value(sal,2) over(partition by dname order by eid) as second_sal,
    nth_value(sal,3) over(partition by dname order by eid) as thrid_sal 
from emp;

-- NTILE()
-- 根据入职编号将各部门员工分3组
select dname, ename, sal, eid, -- 若不指定order by 将会排序混乱,出现错误的结果
    ntile(3) over(partition by dname order by eid) as rn
from emp;

-- 取出各部门的第一组员工
select 
    * 
    from (select dname, ename, sal, eid, ntile(3) 
    over(partition by dname order by eid) 
    as rn from emp)t 
where t.rn = 1;
6.7 练习
-- 查询各部门平均薪水最高的部门名
select 
 a.deptno,a.dname,a.location,avg_sal
from
    dept a,
    (
    select *
    from 
    (
    select 
        *,
        rank() over(order by avg_sal desc ) rn 
    from
        (
        select deptno,avg(sal) avg_sal from emp group by deptno
        )t1
        )t2
    where rn = 1
    )t3 
    where a.deptno = t3.deptno;


--  查询员工比所属领导薪资高的员工个人信息
create view test_view 
    as
    select 
        a.ename ename,
        a.sal esal,
        b.ename mgrname,
        b.sal mgrsal, 
        a.deptno 
    from
        emp a,
        emp b 
    where 
        a.mgr = b.deptno
        and a.sal > b.sal;

select * from dept a join test_view b on a.deptno = b.deptno;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1671376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Offer必备算法38_贪心算法四_八道力扣题详解(由易到难)

目录 ①力扣56. 合并区间 解析代码 ②力扣435. 无重叠区间 解析代码 ③力扣452. 用最少数量的箭引爆气球 解析代码 ④力扣397. 整数替换 解析代码1_递归改记忆化搜索 解析代码2_贪心策略 ⑤力扣354. 俄罗斯套娃信封问题 解析代码1_动态规划&#xff08;超时&#xf…

SAP-MM-BASIS-采购审批权限配置

如何控制某用户的审批权限? 例如: 公司人员变动,审批流从原来的经理审批、总监审批,现在要改成主管审批、经理审批。 1、权限变更 1.1、找到配置路径 以经理为例:SU01 点击查看/更改, 点击角色,找到审批文件,双击角色ZM0019_3000 上图可以控制采购订单的凭证类型和…

AVL树的完全指南:平衡与性能

文章目录 AVL树简介AVL的操作建立一个AVL树插入操作删除操作 书写代码1.构造函数和析构函数2.获取最大值和最小值3.树的高度和节点个数3.前序中序和后序遍历4.判断树是否为空树5.四个旋转操作6.获取平衡因子7.插入操作8.删除操作9.搜索节点.h文件中的定义 总结 AVL树简介 AVL树…

企业邮箱是什么?怎么申请一个企业邮箱

企业邮箱是什么&#xff1f;企业邮箱包含着许多企业需要的功能&#xff0c;包含统一创建签名、大容量存储、域名定制等功能&#xff0c;这些功能能够帮助企业更好地展示企业的专业形象以及更好得协作办公。本文将详细介绍企业邮箱的概念、特征和企业邮箱的申请步骤。 一、企业…

EasyExcel 中实体类的注解@ExcelProperty

ExcelProperty(value "职务", index 0) value 与index 的优先级, 实测得出下面结论. 1、只有value : 按照value 的匹配 2、只有index: 按照index 的匹配 3、 同时有value和index: 按照index的匹配. 结果: 按照index的匹配, 找到的数据 {"administrat…

Django 安全性与防御性编程:如何保护 Django Web 应用

title: Django 安全性与防御性编程&#xff1a;如何保护 Django Web 应用 date: 2024/5/13 20:26:58 updated: 2024/5/13 20:26:58 categories: 后端开发 tags: CSRFXSSSQLUploadHTTPOnlyPasswordSession 跨站请求伪造&#xff08;CSRF&#xff09; 跨站请求伪造&#xff0…

TriCore:Interrupt 2

今天继续来看看 IR 模块。 名词缩写 缩写全称说明IRInterrupt Router SRService Request 包括&#xff1a; 1. External Resource 2. Internal Resource 3.SW&#xff08;Software&#xff09; SPService Privoder 包括&#xff1a; 1. CPU 2. DMA SRNService Request NodeS…

宁夏银川最牛起名大师的老师颜廷利:宝与饱,饿跟恶

对于中国优秀传统文化之根-汉语而言&#xff0c; 恶&#xff0c;对应着‘饿’&#xff1b; 宝&#xff0c;对应着‘饱’… 由此可见&#xff0c;无论是‘饿’&#xff08;与‘恶’同音&#xff09;&#xff0c;还是‘饱’&#xff08;与‘宝’通音&#xff09;&#xff0c;实际…

GDPU unity游戏开发 角色控制器与射线检测

在你的生活中&#xff0c;你一直扮演着你的角色&#xff0c;别被谁控制了。 小试 1. 创建一个角色控制器&#xff0c;通过键盘控制角色控制器的移动&#xff0c;角色控制器与家具发生碰撞后&#xff0c;通过Debug语句打印出被碰撞物体的信息(搜索OnControllerColliderHit的使用…

GO语言核心30讲 实战与应用 (WaitGroup和Once,context,Pool,Map,字符编码,string包,bytes包)

原站地址&#xff1a;Go语言核心36讲_Golang_Go语言-极客时间 一、sync.WaitGroup和sync.Once 1. sync.WaitGroup 比通道更加适合实现一对多的 goroutine 协作流程。 2. WaitGroup类型有三个指针方法&#xff1a;Wait、Add和Done&#xff0c;以及内部有一个计数器。 (1) Wa…

【报错合集】完美解决“虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本”

文章目录 解决方案&#xff1a;更改设置的硬件版本 今天我需要将别人的虚拟机克隆到我的VMware Workstation上运行&#xff0c;结果发生了以下的错误&#xff1a; 刚开始以为是VMware Workstation的版本问题太低导致的&#xff0c;所以我删除了原来的那个版本&#xff0c;下载…

51cto已购买的视频怎么下载到本地

你是否曾在学习51CTO的精品课程时&#xff0c;希望可以随时随地无网络干扰地进行学习&#xff0c;或是想要将这些已购买的课程永久珍藏&#xff1f;今天&#xff0c;你的愿望将要实现。我们将向你揭示如何轻松地将已购买的51CTO视频下载到本地&#xff0c;让学习的路上再也没有…

企业邮箱域名是什么?怎么注册一个企业邮箱域名?

企业邮箱域名是什么&#xff1f;企业邮箱域名是企业申请的专属域名&#xff0c;绑定专属的邮箱域名&#xff0c;能够在发送邮件时提高品牌识别性、专业性和宣传效果。那么&#xff0c;我们该怎么注册一个企业邮箱域名呢&#xff1f;本文将为你详细介绍。 一、企业邮箱域名是什…

本地搭建各大直播平台录屏服务结合内网穿透工具实现远程管理录屏任务

文章目录 1. Bililive-go与套件下载1.1 获取ffmpeg1.2 获取Bililive-go1.3 配置套件 2. 本地运行测试3. 录屏设置演示4. 内网穿透工具下载安装5. 配置Bililive-go公网地址6. 配置固定公网地址 本文主要介绍如何在Windows系统电脑本地部署直播录屏利器Bililive-go&#xff0c;并…

内网环境安装使用DBeaver使用第一天

之前一直使用navicat&#xff0c;现在出于某种原因不让使用了&#xff0c;于是上手了这个工具&#xff0c;说实话&#xff0c;真的&#xff0c;但是必须要用。 首先安装的时候&#xff0c;必须要选择MySQL驱动&#xff0c;如果外网直接选择以后就可以下载了&#xff0c;内网需…

【MySQL复合查询】

文章目录 一、基本的使用案例二、多表查询三、自连接四、子查询4.1单行子查询4.2多行子查询in关键字all关键字any关键字 4.3多列子查询4.4 在from子句中使用子查询 解决多表问题的本质五、合并查询1.union2.union all 一、基本的使用案例 注明&#xff1a;以下案例使用的均为一…

Docker-compose部署TRX节点

1、编写Dockerfile rootubuntu:~# mkdir /data/docker-compose/trx -p rootubuntu:~# cd /data/docker-compose/trx/ rootubuntu:/data/docker-compose/trx# ls rootubuntu:/data/docker-compose/trx# vim Dockerfile rootubuntu:/data/docker-compose/trx# cat Dockerfile FR…

鲁棒控制问题描述

复杂的合成问题成为一个具有特殊结构控制器的设计问题。 H无穷范数&#xff08;H∞ norm&#xff09;&#xff1a;对于线性时不变&#xff08;LTI&#xff09;系统&#xff0c;H∞范数通常定义为系统频率响应的最大幅值。换句话说&#xff0c;它是系统传递函数在复平面单位圆上…

基于SSM的“图书仓储管理系统”的设计与实现(源码+数据库+文档)

基于SSM的“图书仓储管理系统”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统登录页面 人员管理信息页面 添加人员信息页…

公司申请增加公众号数量

一般可以申请多少个公众号&#xff1f;众所周知&#xff0c;在2013年前后&#xff0c;公众号申请是不限制数量的&#xff0c;后来企业开始限制申请50个&#xff0c;直到2018年的11月tx又发布&#xff0c;其中个人主体可申请公众号由2个调整为1个&#xff0c;企业主体由50个调整…