我的编程空间,编程开发者的网络收藏夹
学习永远不晚

(二)《SQL进阶教程》学习记录-

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

(二)《SQL进阶教程》学习记录-

(二)《SQL进阶教程》学习记录-

GROUP BY、PARTITION BY,分组取前几条,分组完整记录,排名、排序

(一) 《SQL进阶教程》学习记录--CASE
(二) 《SQL进阶教程》学习记录--GROUP BY、PARTITION BY

1、语法

GROUP BY <列名1>, <列名2>, <列名3>,根据列分组,通常配合聚合函数用于一些统计的需求。
例1:统计成绩

-- 各科目最高分
select subject,max(fraction) from study group by subject
-- 各科目平均分
select subject,round(avg(fraction),2) from study group by subject

下面简丰富一下表结构改名fraction,插入两期成绩例2:取两期成绩相同
配合HAVING,找两期成绩一样的同学、科目。

select username,subject,fraction from fraction GROUP BY username,subject,fraction HAVING count(1)>1

2、关联子查询

通常例1无法满我们的需求,还要知道最高分是谁,哪一期成绩等,包括前三、前十等需求
例3:取各科目最高、前三

--各科最高
select * from fraction f1 where fraction = (select max(fraction) from fraction f2 where f1.subject = f2.subject) 
--各科前三
select * from fraction f where 3 > (select count(*) from fraction where subject = f.subject and fraction>f.fraction ) order by subject,fraction desc; 

看到结果条数好像不太对,是因为同分的也查了出来,这是其一,还有另一个问题,写起where条件也麻烦,比如只查第一期成绩。

select * from fraction f where 3 > (select count(*) from fraction where subject = f.subject and fraction>f.fraction and createtime="2021-6-30" ) and createtime="2021-6-30"  order by subject,fraction desc; 

实际业务、表结构都要比例子要复杂的多,sql语句会变得无比冗长,而且子查询还有性能问题。

3、PARTITION BY

GROUP BY 和 PARTITION BY 都可以根据指定的列为表分组,区别在于 GROUP BY 在分组之后会把每个分组聚合成一行数据。partition by 通常会和 ROW_NUMBER()、RANK() 等窗口函数配合使用。
例4:各种分组、排名、排序
三个窗口函数,选择合适的完成需求,分组、排序、where条件写起来方便简单,逻辑清晰。rank,dense_rank的区别是一个跳号,一个不跳号。

select *,ROW_NUMBER() OVER(PARTITION BY subject ORDER BY subject,fraction desc) rownumber,
	 RANK() OVER(PARTITION BY subject  ORDER BY subject,fraction desc) rank ,
	 DENSE_RANK() OVER(PARTITION BY subject ORDER BY subject,fraction desc) denserank from fraction where createtime="2021-6-30" 

4、本文Get小技巧

(1)、字段拼接

直接使用 || 合并, 例如 SELECT username || subject || "成绩 : " || fraction as info FROM study
或者函数concat_ws,例如 SELECT concat_ws("",username,subject,"成绩 : ",fraction) as info FROM study where fraction=100
效果相同

(2)、循环

比如测试插入表数据,简单的循环需求,可以用函数generate_series返回一个数组,不用存储过程和游标。
例如:INSERT INTO study_test SELECT "体测", "张三", round(random()::numeric,2) * 100 FROM generate_series(1,10)

测试签名

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

(二)《SQL进阶教程》学习记录-

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

(二)《SQL进阶教程》学习记录-

GROUP BY、PARTITION BY,分组取前几条,分组完整记录,排名、排序 (一) 《SQL进阶教程》学习记录--CASE(二) 《SQL进阶教程》学习记录--GROUP BY、PARTITION BY1、语法GROUP BY , , ,根据列分
(二)《SQL进阶教程》学习记录-
2016-09-20

Go 语言进阶freecache源码学习教程

这篇文章主要为大家介绍了Go 语言进阶freecache源码学习教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-15

vuex学习进阶篇之getters的使用教程

getters用于获取state里的数据,它类似于计算属性,如果要获取的数据并没有发生变化的话,就会返回缓存的数据,下面这篇文章主要给大家介绍了关于vuex学习进阶篇之getters的使用教程,需要的朋友可以参考下
2022-11-13

Python学习记录-多进程和多线程

[TOC]1. 进程和线程进程狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。广义定义:进程是一个具有一定独立功能的程序关于某个数据集
2023-01-31

node学习记录之搭建web服务器教程

web服务器的基本知识 功能:1.接收HTTP请求(get,post,delete,put)2.处理HTTP请求 常见的web服务器架构: 1. Nginx/Apache:负责接收http请求,确定谁来处理请求,并返回请求的结果 2. ph
2022-06-04

好程序员web前端教程分享JavaScript学习笔记之Event事件二

  好程序员web前端教程分享JavaScript学习笔记之Event事件二,今天来聊一聊事件的执行机制。  什么是事件的执行机制呢?  思考一个问题?  当一个大盒子嵌套一个小盒子的时候,并且两个盒子都有点击事件你点击里面的小盒子,外面的
2023-06-03

Python教程学习入门视频到进阶,Python全套视频合集助你快速提升

毫无疑问,Python是当下最炙手可热的编程语言之一,尤其是随着人工智能的快速发展,学习Python已经成为很多年轻人的选择。对于很多零基础小白来说,深入的掌握Python看似是一件非常困难的事情,其实,只要掌握了科学的方法,并制定严格的学
2023-06-02

编程热搜

目录