SQL基础教程(八)SQL高级处理

news2025/2/23 11:27:41

※食用指南:文章内容为《SQL基础教程》系列学习笔记,该书对新手入门非常友好,循序渐进,浅显易懂,本人主要用来补全学习MySQL中未涉及的部分,便于刷题和做项目。

官方电子书:《SQL基础教程》第2版——图灵社区

官方授权视频:《SQL基础教程》第2版 零基础6小时 

(个人觉得不是很有必要去看视频,自己看书做练习就够了)

目录:

第8章:SQL高级处理

8-1:窗口函数

(1)什么是窗口函数

(2)窗口函数语法

(3)语法的基本使用方法——使用RANK函数

(4)无需指定PARTITION BY

(5)专用窗口函数的种类

(6)窗口函数的适用范围

(7)作为窗口函数使用的聚合函数

(8)计算移动平均

(9)两个ORDER BY

8-2:GROUPING运算符

(1)同时得到合计行

(2)ROLLUP——同时得出合计和小计

(3)GROUPING函数——让NULL更加容易辨认

(4)CUBE——用数据来搭积木

(5)GROUPING SETS——取得期望的积木

章节练习:


第8章:SQL高级处理

8-1:窗口函数

(1)什么是窗口函数

窗口函数OLAP(Online Analytical Processing),对数据库数据进行实时分析处理(市场分析、创建财务报表、创建计划等)

(2)窗口函数语法

作为窗口函数使用的函数:

ROW_NUMBER、RANK、DENSE_RANK:专用窗口函数(排序函数)

SUM、AVG、COUNT、MAX、MIN:能够作为窗口函数的聚合函数

(3)语法的基本使用方法——使用RANK函数

RANK:用来记录排序的函数

PARTITION BY:设定排序的对象范围(根据什么分组)

ORDER BY:指定哪一列、何种顺序排序(默认升序,降序DECS)

❗根据不同种类(product_type),按照销售单价(sale_price)从低到高排序

PARTITION BY对表进行横向分组;ORDER BY决定纵向排序的规则

窗口函数兼具GROUP BY子句的分组功能以及ORDER BY子句的排序功能,但PARTITION BY不具备GROUP BY子句的汇总功能,因此使用RANK函数不会减少表中记录的行数

🔺PARTITION BY分组后的记录合集称为“窗口”,代表范围

因为在SQL中,“组”特指GROUP BY分割后的记录集合,为避免混淆使用PARTITION BY时称为窗口

(4)无需指定PARTITION BY

窗口函数中起到关键作用的是PARTITION BY、GROUP BY,其中PARTITION BY并不是必需的,即使不指定也可以正常使用窗口函数

和没有使用GROUP BY的聚合函数时效果一样,将整个表作为一个大的窗口来使用

(5)专用窗口函数的种类

ROW_NUMBER:唯一值连续位次

RANK:存在相同位次的记录,跳过之后的位次

DENSE_RANK:存在相同位次的记录,不跳过之后的位次

使用RANK或ROW_NUMBER时无需任何参数,只需要像RANK()或者ROW_NUMBER()保持括号中为空就行

练习:

LeetCode178题:

分数排名(不分组排序)

LeetCode184题:

每个部门工资最高的员工(分组排序)

①获得每个部门的员工及员工工资排序

②只提取工资最高的员工

salary_rank = 1:取每个分组降序后的第一个

t:取一个别名

使用RANK、DENSE_RANK都可以,因为如果工资都是一样的(位次),都要把它列出来

(6)窗口函数的适用范围

原则上窗口函数只能在SELECT子句中使用

窗口函数是对WHERE子句或者GROUP BY子句处理后的结果进行操作

(7)作为窗口函数使用的聚合函数

所有聚合函数都能用作窗口函数:SUM、AVG、COUNT、MAX、MIN

①计算销售单价的总计值,累计统计法

一行一行逐渐添加计算对象,按时间序列的顺序,计算各个时间的销售总额

②计算平均值,以当前记录为基准进行统计

(8)计算移动平均

窗口函数:将表以窗口为单位进行分割,并在其中进行排序的函数

框架:在窗口中指定更加详细的汇总范围的备选功能,该备选功能中的汇总范围

需要在ORDER BY子句之后使用指定范围的关键字

框架是根据当前记录来确定的,和固定的窗口不同,其范围会随着当前记录的变化而变化

①指定最靠近的3行作为汇总对象

ROWS(行)、PRECEDING(之前)

ROW 2 PRECEDING:截止到之前2行

-- 自身(当前记录)

-- 之前1行记录

-- 之前2行记录

以上的统计方法为移动平均(moving average),实时把控最近状态(常用于对股市趋势的实时跟踪)

②把PRECEDING替换成FOLLOWING,截止之后2行

汇总当前记录的前后行,同时使用PRECEDING、FOLLOWING

-- 之前1行的记录

-- 自身(当前记录)

-- 之后1行的记录

(能够熟练掌握框架功能,就可称之为窗口函数高手了)

(9)两个ORDER BY

注意:记录的排列顺序

使用窗口函数时必须要在OVER子句中使用ORDER BY,可能会误以为结果中的记录按照该ORDER BY 指定的顺序排序的

OVER子句中的OEDER BY只是用来决定窗口函数按照什么样的顺序进行计算的,对结果的排列顺序并没有影响

DBMS可以按照窗口函数的ORDER BY 子句所指定的顺序对结果进行排序,但也仅仅只是个例罢了

如果想让记录就按张ranking列的升序进行排序

在SELECT语句的最后,使用ORDER BY子句进行指定

使用两个ORDER BY 看起来有点怪,但这两个ORDER BY的动能完全不同

8-2:GROUPING运算符

(1)同时得到合计行

GROUP BY子句用来指定聚合键的场所,根据指定的键分割数据,不会出现合计行

合计行是不指定聚合键时得到的汇总结果

如果想要得到合计,分别计算出合计行和按照商品种类进行汇总的结果,再用UNION ALL连接在一起

(2)ROLLUP——同时得出合计和小计

GROUPING运算符:

ROLLUP

CUBE

GROUPING SETS

ROLLUP是卷起,卷起百叶窗、窗帘卷等,能够得到像从小计到合计,从最小的聚合级开始,聚合单位逐渐扩大的结果

ROLLUP(列1,列2,…),一次计算出不同聚合键组合的结果

-- GROUP BY()

-- GROUP BY(product_type)

GROUP BY():没有聚合键,相当于没有GROUP BY子句,会得到全部数据的合计行记录,超级分组记录(super group row)

超级分组记录的product_type列的键值(对DBMS来说)并不明确,会默认使用NULL

其他SQL语法:

MySQL专用语法:

①未使用ROLLUP前:

②使用ROLLUP后:

其他SQL语法:

MySQL专用语法:

使用ROLLUP多了合计行和3个不同商品种类的小计行(未使用登记日期作为聚合键的记录),这4行就是超级分组记录

SELECT语句使用UNION对3种模式的聚合级的不同结果进行连接

-- GROUP BY

-- GROUP BY(product_type)

-- GROUP BY(product_type,regist_date)

(3)GROUPING函数——让NULL更加容易辨认

regist_date中衣服有一列为NULL,而NULL作为了聚合键作为小计,两个NULL不易辨认

判断超级分组记录的NULL特定函数——GROUPING函数,参数列的值是超级分组记录产生NULL返回1,其他返回0

使用GROUPING函数可以在超级分组记录的键值中插入字符串

当GROUPING函数的返回值为1时,指定“合计”或者“小计”等字符串,其他情况返回通常的列的值

(实际业务中需要获取包含合计或者小计的汇总结果)

ELSE CAST(regist_date AS VARCHAR(16)) END AS regist_date,

满足CAST表达式所有分支的返回值必须一致的条件,否则各个分支分别返回日期和字符串类型的值,执行时发生语法错误

(4)CUBE——用数据来搭积木

CUBE:立方体

将ROLLUP替换为CUBE

把regist_date作为聚合键

-- GROUP BY

-- GROUP BY(product_type)

-- GROUP BY(product_date)

-- GROUP BY(product_type,regist_date)

CUBE将GROUP BY子句中聚合键的“所以可能的组合“汇总结果集中到一个结果中

组合的个数2n(n是聚合键的个数)

聚合键有2个,所以是4,如果是3个聚合键则为8

(5)GROUPING SETS——取得期望的积木

GROUPING SETS运算符:用于从ROLLUP、CUBE的结果中取出部分记录,个别条件对应的不固定的结果

想从中选取将“商品种类“和”登记日期“各自作为聚合键的结果

或不想得到合计“记录和使用2个聚合键的记录“

章节练习:

8.1

按照product_id升序排序,计算出截至当前行的最高销售单价

商品编号越来越大,计算最大值的对象范围也不断扩大

(用于奥运会等竞技体育的最高纪录不断变化相似,随着运动员数量逐渐增加,要选出历史第一也会越来越难)

8.2

使用Proudct表,计算按照regist_date升序进行排列的各日期的sale_price的总额

排序需要将等级日期为NULL 的运动T恤记录排在第1位(看作弊比其他日期都早)

方法二:regist_date为NULL时,显示“1年1月1日“(日常骗一下DBMS)

方法一:regist_date为NULL时,将该记录放在最前显示(不推荐,可能因DBMS的需求改变无法使用)

————TBC

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

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

相关文章

掌握TCP连接管理与流量控制:从零开始

文章目录 1. TCP连接管理1.1 三次握手(Three-way Handshake)1.2 四次挥手(Four-way Handshake)1.3 TCP连接管理的重要性 2. TCP流量控制2.1 滑动窗口(Sliding Window)2.2 拥塞控制(Congestion C…

【ARM+Codesys 客户案例 】基于RK3568/A40i/STM32+CODESYS开发的控制器在自动输送分拣系统上的应用,支持定制

2021年“京东618” 累计下单金额超3438亿元,再次刷新纪录! 从下单到收货,各种货品均可在短短几天内通过四通八达的物流网络送达全国任何一个家庭。电子商务和快递物流的迅猛发展对仓储、分拣、配送效率和准确性均提出了更高的要求,加速了智能物流的发展。…

Java Resilience4j-RateLimiter学习

一. 介绍 Resilience4j-RateLimiter 是 Resilience4j 中的一个限流模块&#xff0c;我们对 Resilience4j 的 CircuitBreaker、Retry 已经有了一定的了解&#xff0c;现在来学习 RateLimiter 限流器&#xff1b; 引入依赖&#xff1b; <dependency><groupId>io.g…

序列建模之循环和递归网络 - 递归神经网络篇

序言 在序列建模的广阔领域中&#xff0c;递归神经网络&#xff08; Recursive Neural Network, RNN \text{Recursive Neural Network, RNN} Recursive Neural Network, RNN&#xff09;&#xff0c;注意此处的 RNN \text{RNN} RNN与常用于序列处理的循环神经网络在命名上有所…

【生成式人工智能-十五-经典的影像生成方法-GAN】

经典的影像生成方法-GAN GANDiscriminatorGenerator还需要加入额外信息么 GAN可以加在其他模型上面我们可以用影像生成模型做什么&#xff1f; 前面讲过VAE和Flow-based以及diffusion Model &#xff0c;今天讲最后一种经典的生成方法GAN。 GAN 前面讲的几种模型都是用加入额外…

红黑树剖析(插入部分)

文章目录 红黑树插入节点情景分析情景1&#xff1a;红黑树为空树情景2&#xff1a;插入节点的Key已存在情景3&#xff1a;插入节点的父节点为黑色节点情景4&#xff1a;插入节点的父节点为红色情景4.1 叔叔节点存在并且为红色节点情景4.2 叔叔节点存在而且是黑色节点情景4.3 叔…

xss 一些例子

目录 XSS 1.Ma Spaghet!​编辑 2.Jefff​编辑 3.Ugandan Knuckles​编辑 4.Ricardo Milos​编辑 5.Ah Thats Hawt​编辑 6.Ligma​编辑 7.Mafia​编辑 简单解法就是换一个函数 作者得原意解法 8.Ok, Boomer​编辑 XSS 1.Ma Spaghet! 这里接收了一个somebody参数&…

Chain of Thought (CoT) 系列论文:大模型思维链,提升 LLM 的推理能力

文章目录 1. COT&#xff1a;Chain of Thought1. 研究背景2. CoT的原理3. CoT Prompt 1. COT&#xff1a;Chain of Thought COT 是 2022.01 由 google 提出的针对提升 LLM 的推理能力的 Prompt Engineering 方法。 paper&#xff1a; Chain-of-Thought Prompting Elicits Re…

一器多能,数据文件处理的瑞士军刀 — dasel

Dasel&#xff1a;简化数据操作&#xff0c;提升开发效率。- 精选真开源&#xff0c;释放新价值。 概览 dasel是一款专为开发者设计的高效数据文件操作工具&#xff0c;它允许用户通过统一的接口对JSON、TOML、YAML、XML和CSV等格式的文件进行数据选择、插入和删除操作。这款工…

Kafka基本概念及消费流程

Kafka是消息中间件的一种&#xff0c;相较于其他消息中间件&#xff0c;其以极高的吞吐量闻名&#xff0c;常用于构建实时数据管道和流应用&#xff0c;能够处理高吞吐量的数据流。以下是Kafka中的重要概念&#xff1a; 1. 生产者 生产者是向Kafka主题发送消息的客户端。生产…

登录 k8s-Dashboard 显示 Your connection is not private

文章目录 一、背景二、解决方案 一、背景 部署好 kubernetes-Dashboard 后使用 master节点的 ipport 登录 Dashboard 显示 Your connection is not private 无论是 Edge 还是 Google Chrome 都是这样的情况 二、解决方案 点击网页空白处&#xff0c;英文输入法输入&#xf…

论文解读:LONGWRITER: UNLEASHING 10,000+ WORD GENERATION FROM LONG CONTEXT LLMS

摘要 现象&#xff1a;当前的大预言模型可以接受超过100,000个tokens的输入&#xff0c;但是却难以生成超过2000个token的输出。 原因&#xff1a;监督微调过程(SFT)中看到的样本没有足够长的样本。 解决方法&#xff1a; Agent Write&#xff0c;可以将长任务分解为子任务&a…

为什么MCU I2C波形中会出现的脉冲毛刺?

在I2C的波形中&#xff0c;经常会发现有这样的脉冲毛刺&#xff0c;会被认为是干扰或者器件不正常。 看到这个波形时&#xff0c;可以先数一下出现在第几个clock的位置&#xff0c;如果出现在第9个clock的低电平期间&#xff0c;就不是干扰或者器件异常导致。 在I2C的协议中&a…

Java并发类的主要API方法-CountDownLatch和CyclicBarrier

1.概念介绍 CountDownLatch 是一个计数器&#xff0c;计数器的初始值由创建它时指定。每次调用 countDown() 方法时&#xff0c;计数器会减1&#xff0c;直到计数器值变为0时&#xff0c;所有调用 await() 的线程都会被唤醒继续执行。 CyclicBarrier 是 Java 中另一个常用的同…

基于CDIO概念的人工智能物联网系统开发与实施的人才培养研究

目录 1. 引言&#xff08;Introduction&#xff09; 2. AIoT技术及其培训特点&#xff08;The Characteristics of AIOT and Its Training&#xff09; 3. 基于CDIO概念的AIoT课程改革&#xff08;CDIO Concept-based Reform of AIOT Course&#xff09; 4. AIoT课程内容安…

SweetAlert2

1. SweetAlert2 SweetAlert2是一个基于JavaScript的库, 用于在网页上替换标准的警告框(alert), 确认框(confirm)和提示框(prompt), 并提供更加美观和用户友好的界面.需要在项目中引入SweetAlert2, 可以通过CDN链接或者将库文件下载到你的项目中来实现这一点. 通过CDN引入:<…

C++:stack类(vector和list优缺点、deque)

目录 前言 数据结构 deque vector和list的优缺点 push pop top size empty 完整代码 前言 stack类就是数据结构中的栈 C数据结构&#xff1a;栈-CSDN博客 stack类所拥有的函数相比与string、vector和list类都少很多&#xff0c;这是因为栈这个数据结构是后进先出的…

SPRING09_ Bean后置处理器创建过程、SmartInstantiationAwareBeanPostProcessor预测方法调用

文章目录 ①. Bean后置处理器创建过程②. SmartInstantiationAwareBeanPostProcessor预测方法调用 ①. Bean后置处理器创建过程 ①. 坏境准备,在BeanPostProcessor的无参构造器、postProcessBeforeInitialization以及postProcessAfterInitialization打上断点.以xml的方式启动容…

秋招突击——8/15——新作{最大子数组和、合并区间、转轮数组、除自身以外的数组的乘积}

文章目录 引言新作最大子数组和个人实现参考实现 合并区间个人实现短板补充——自定义排序标准 参考实现 转轮数组最终实现 除自身以外数组的乘积个人实现 总结 引言 以前刷题的方式方法有问题&#xff0c;花太多时间了&#xff0c;应该先过一遍&#xff0c;然后再针对特定的题…

第一百九十四节 Java集合教程 - Java优先级队列

Java集合教程 - Java优先级队列 优先级队列是其中每个元素具有相关联的优先级的队列。具有最高优先级的元素将从队列中删除。 PriorityQueue 是一个实现类对于Java Collection Framework中的无界优先级队列。 我们可以使用在每个元素中实现的 Comparable 接口作为其优先事项。…