select into from 用法_Play with SQL--SQL高级用法

c5b801d2c39d6b48fd75735dc850cfd9.png

关于sql的高级用法以前很少接触,在很多场景下其实是很实用的。

一,知识要点如下。

6d6671e8ba6ec95547e513aa4480ebc8.png

二,数据准备,依然是学校四表,这次需要加上一个class表。

insert into class (学号,班级,成绩) values ('0001','401',95);
insert into class (学号,班级,成绩) values ('0002','401',95);
insert into class (学号,班级,成绩) values ('0003','402',89);
insert into class (学号,班级,成绩) values ('0004','401',83);
insert into class (学号,班级,成绩) values ('0005','402',86);
insert into class (学号,班级,成绩) values ('0006','403',92);
insert into class (学号,班级,成绩) values ('0007','403',86);
insert into class (学号,班级,成绩) values ('0008','401',88);
insert into class (学号,班级,成绩) values ('0009','403',97);
insert into class (学号,班级,成绩) values ('0010','402',88);

41399f6d2594ed3742ae29b345d5bb9a.png

班级表新建成功。

三,练习

1,根据每门课程按成绩给学生进行排名

select *, rank() over (partition by 课程号 order by 成绩 desc) as 排名
from score;

6f24385038654cc1ad36b000c0cf3740.png

2,根据每门课程按成绩给学生进行排名(分别使用rank, dense_rank,row_number)

select *,
       rank() over (partition by 课程号 order by 成绩 desc) as rank排名,
       dense_rank() over (partition by 课程号 order by 成绩 desc) as dense_rank排名,
       row_number() over (partition by 课程号 order by 成绩 desc) as row_number排名
from score;

1e9661207aa9b4c07f477e7c36457239.png

由此处可以清晰地看出三者的区别:

  • rank函数的并列排名(课程号0001)会占用下一名次的位置,故而为1,1,3;
  • dense_rank函数的并列排名则不会占用,故而为1,1,2;
  • row_number函数无并列排名机制

3,班级表按成绩来排名,如果两个分数相同,那么排名要是并列的,且不占用下一名次的位置

select *, dense_rank() over (partition by 班级 order by 成绩 desc) as 名次
from class;

acbe32527bfcf267afd808a2a7ac8e2f.png

4,topN问题:查询各科成绩前两名的记录

select * from (
	select *, row_number() over (partition by 学号 order by 成绩 desc) as 名次 
	from score) as x
where 名次 <= 2;

278c0ad8e97aeabe30d3ef4d7cd5b560.png
迈迈的进化版:
select z.课程名称,y.姓名,x.成绩,x.名次
from (select *,row_number() over (partition by 课程号 order by 成绩 desc) as 名次
from score) as x
inner join student as y
on x.学号 = y.学号
inner join course as z
on x.课程号 = z.课程号
where 名次 <= 2;

79a3aae0dfe16b9c936ec1bde17ef19e.png

5,聚合窗口函数

对成绩表进行聚合运算。

select *,
       sum(成绩) over (order by 学号) as 按学号汇总,
       avg(成绩) over (order by 学号) as 按学号平均,
       count(成绩) over (order by 学号) as 按学号计数,
       max(成绩) over (order by 学号) as 按学号取最大,
       min(成绩) over (order by 学号) as 按学号取最小
from score;

3dd0ed64298af523b8ccc7829a39f1ec.png

查找单科成绩高于该科目平均成绩的学生名单(此处使用窗口函数)

select * from (
               select *, avg(成绩) over (partition by 课程号) as 平均分
               from score) as x
where 成绩 > x.平均分;

97b5abbae77b373d3827deafb123ae1c.png
迈迈的进化版:
SELECT z.课程名称, y.姓名, x.成绩, x.平均分
FROM (SELECT *,
AVG(成绩) OVER (PARTITION BY 课程号) AS 平均分
FROM score) AS x
INNER JOIN student AS y
ON x.学号 = y.学号
INNER JOIN course AS z
ON x.课程号 = z.课程号
WHERE x.成绩 > x.平均分;

7604d20eb4a490a6e5ff0671096b5f3f.png

6,班级总成绩表的相邻移动平均和总和

select *,
       avg(成绩) over (order by 学号 rows 1 preceding) as 相邻平均值,
       sum(成绩) over (order by 学号 rows 1 preceding) as 相邻总和
from class;

dcd93922a2984365ea37dc5ee66aec92.png

要点来说就是以上。

高级用法不是很熟,还需要几次的复习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值