sql两个in并列_SQL高阶:窗口函数

本文详细介绍了SQL中的窗口函数,包括基本语法、使用方法和各种类型的窗口函数,如rank()、dense_rank()、row_number(),并提供了案例解析。此外,还讨论了聚合窗口函数的应用,如累计求和,以及移动平均。最后,文章探讨了存储过程,包括无参、有参和默认参数的存储过程及其在实际操作中的注意事项和作用。
摘要由CSDN通过智能技术生成

1.SQL高阶功能:窗口函数

0fd3d385107a9d9ec88f7775a53d948e.png

2.窗口函数重要知识点展开

2.1基本语法和如何使用窗口函数

2.1.1基本语法

<窗口函数> over (partition by (用于分组的列名)

order by(用于排序的列名))

2.1.2 如何使用

1)用partition by来分组。

2)用order by对分组后的结构进行排序。

*不用group by的原因:其分组汇总后会改变表的行数,一行只有一个类别

2.2分类和案例

200b497db455c54bea7dffbbb563036f.png

2.2.1专用窗口函数案例

rank(),dense rank(),row_number(

1)体现三者区别案例

select *, rank() over (order by 成绩 desc) as ranking,

dense_rank() over (order by 成绩 desc) as dese_rank,

row_number() over (order by 成绩 desc) as row_num

from 班级表

查询结果如下:

18915448926cb6bd5f5351693f8e29a6.png
查询结果

三个函数的查询结果区别:

5a47bf45ded5a04cb867afd835cb7f1f.png

再来一个例子一眼看懂区别:

1bca17790aabb27273de885cc8019caf.png

2)rank()-考虑并列+占用下个名次位置

【TOPN问题】编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分占用名词位置

4f6376a5298151d3e22a67c0e011fcc8.png

5bcf4548b66b43ad205d00814869b6c0.png
sql

00b43d04fa255aa2f77a9bb0fabb4924.png
结果

3)dense rank()-考虑并列+不占用下个名次位置

【TOPN问题】编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。

4f6376a5298151d3e22a67c0e011fcc8.png

8aed40e2973c55c60aabe7ae4fe5e289.png
SQL

0f7b37ed7c3a337cd0ccf9c273091213.png
结果

4)row_number()-不考虑并列情况

【TOPN问题】:现有成绩表score,记录了每个学生各科的成绩。表内容如下。问题:查找每个学生成绩最高的2个科目

4f6376a5298151d3e22a67c0e011fcc8.png
score

adc874eadd69e335e59d364201244203.png
sql语句

3c74d12b7e0c25686ee4eaf62ca59f62.png
结果

【TOPN万能模板】

517bd271e846110469a6ea969e826570.png

2.2.2聚合窗口函数和案例

1ec19e9f8023f3a2b47571554c9f2309.png

1)sum,avg,count,max,min使用案例

【问题】在成绩表中对自身记录、及位于自身记录以上的数据进行求和,平均,计数,求最大值,最小值

01ae4d2545d8f7f9e0bf84984ba911bb.png
SQL

0e2b1ed96989af8b88817df1d87c5029.png
查询结果

2)累计求和案例

“薪水表”中记录了员工发放的薪水。包含雇员编号,薪水,起始日期,结束日期四列。其中薪水即为该雇员在起始日期到结束日期这段时间内的薪水,当前薪水即满足(结束日期 = '9999-01-01')

7bf6157c46a0060cbba77785964cc0e0.png
薪水表,注:完整数据在excel表中

【问题1】按照雇员编号升序排列,查找薪水的累计和——累计薪水,其中累计薪水为前N个当前员工( 结束日期 = '9999-01-01')的薪水的累计和,其他以此类推

fc3e1a760ad298d05625c0d2ddbea251.png
SQL

1267a3649a3e945d5e21c412fea5afb0.png
结果

【问题2】根据确诊人数表按照日期进行升序排列,查找日期、确诊人数以及对应的累计确诊人数。

de26947af2104b94a70e77072863ed84.png
确诊人数表

a899d8ebcdf1e18ec0827e4df3921ad9.png
SQL

6274ed34ba60b352ab06894a131830a1.png
查询结果

3)如何在每个组里比较案例

【问题】查找单科成绩高于该科目平均成绩的学生名单

095c00753b2753ce5b13e483b41b7d6d.png
成绩表score

6a42d6b9717c405fcf5fa59b4cf7b403.png
SQL

a581904d5a80aa410d4aa380a5d5506c.png
查询结果

2.2.3 移动平均函数

ac879898821f15a1bd6ea4c519457a2a.png

【案例问题】查询薪资表中在职员工的自己和前2个员工的平均薪资

ec8866eb6320044f79df80bf0cf29c7b.png
薪资表

5aa05037f09783a82b001224ddcb6ec1.png
SQL

137b3cda89793dbbe4be8d80eaf499d4.png
查询结果

2.3 存储过程

ec6e81e17b106f8017899c91a8597e0b.png

2.3.1 无参存储过程

08d67a1490b1f5ce822ca714ba0a8e24.png

在navicat里运行以后,建立的存储过程就会出现在下图的地方:

43196309dcef1d6f8b9deb6460c41285.png

2.3.2 有参存储过程

2f97cd90d1c53d9cd7820cf36b5503ec.png

【对第3步进一步解释:】

一开始不知道指定学号是哪一个,只有使用的时候才知道业务需求。比如今天要查找学号0001,明天要查找学号002。这时候就需要用到参数,来灵活应对这种情况。把sql语句放入存储过程语法里就是:
create procedure getNum(num varchar(100)) begin select 姓名 from 学生表 where 学号=num; end;
其中getNum是存储过程的名称,后面括号里面的num varchar(100)是参数,参数由2部分组成:参数名称是num;参数类型是是varchar(100),这里表示是字符串类型。
存储过程里面的sql语句(where 学号=num)使用了这个参数num。这样在使用存储过程的时候,给定参数的值就可以灵活的按业务需求来查询了。

2.3.3默认参数存储过程

6a132659a6c353f4208e31f8dda7c528.png

1)in 输入参数

52ad6f6e21250692ff4ddd2652d0c801.png

2)out输出参数

581023f9a694a5f98277b82c12b5e3ab.png

3)inout输入输出参数

ee76172f94ffde5dc8f7cc737441b3fd.png

2.3.4存储过程注意事项和作用

6bffdc6c0b8ff7c7f148ba6c894e919c.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值