当前位置: 首页 > news >正文

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

※食用指南:文章内容为《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

相关文章:

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

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

[论文笔记] Data-Juicer: A One-Stop Data Processing System for Large Language Models

https://arxiv.org/pdf/2309.02033 GitHub - modelscope/data-juicer: A one-stop data processing system to make data higher-quality, juicier, and more digestible for (multimodal) LLMs! 🍎 🍋 🌽 ➡️ ➡️🍸 🍹 🍷为大模型提供更高质量、更丰富、更易”…...

期末速成复习资料——操作系统

体型:选择20判断10填空10*2简答4*5计算2*10 第一章 在一个计算机系统中,通常都含有多种硬件和软件资源。归纳起来可将这些资源分为四类:处理机、存储器、I/O设备以及文件(数据和程序)。相应地,OS的主要功能…...

Android之Service与IntentService区别

目录 Service特点使用场景示例 IntentService特点使用场景示例 区别总结线程管理:生命周期:使用场景:自动停止: 总结 在Android开发中,Service是一个可以在后台执行长时间运行操作的组件。主要有两种类型的Service&…...

【MySQL】表的设计

系列文章目录 第一章 数据库基础 第二章 数据库基本操作 第三章数据库约束 文章目录 系列文章目录前言一、表的设计二、表的关系总结 前言 在前文中,我们学会了基本的CRUD操作,对数据库中的数据进行约束以提高数据库的准确性。接下来介绍的表的设计就是…...

NC 用两个栈实现队列

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 用两个栈来实…...

用后端实现一个简单的登录模块2 前端页面

该模块能做到的功能: 1阶:输入账号和密码,输入正确即可返回登录成功的信息,反之则登录失败 2阶:有简单的前端页面,有登录成功和失败的弹窗,还有登录成功的主页面 3阶:前端页面的注…...

MySQL慢查询的查找语法

一、引言 数据库查询快慢是影响项目性能的一大因素,对于数据库,我们除了要优化SQL,更重要的是得先找到需要优化的SQL语句。 性能优化的思路 首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句其次使用explain命令去查…...

SQL中的聚合方法与Pandas的对应关系

在SQL和Pandas中,聚合方法是用来对数据进行汇总统计的重要工具。下面是SQL中的各种聚合方法及其与Pandas中相应操作的对应关系: 1. COUNT SQL: COUNT(*) 返回表中的行数。COUNT(column) 返回指定列中非空值的数量。 Pandas: count() 方法用于计算非空值…...

计算机毕业设计选题推荐-计算中心高性能集群共享平台-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

仿RabbitMq实现简易消息队列基础篇(future操作实现异步线程池)

TOC 介绍 std::future 是C11标准库中的一个模板类,他表示一个异步操作的结果,当我们在多线程编程中使用异步任务时,std::future可以帮助我们在需要的时候,获取任务的执行结果,std::future 的一个重要特性是能…...

经典算法题总结:数组常用技巧(双指针,二分查找和位运算)篇

双指针 在处理数组和链表相关问题时,双指针技巧是经常用到的,双指针技巧主要分为两类:左右指针和快慢指针。所谓左右指针,就是两个指针相向而行或者相背而行;而所谓快慢指针,就是两个指针同向而行&#xf…...

版本控制基础理论

一、本地版本控制 在本地记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人使用,如RCS. 二、集中式版本控制(代表SVN) 所有的版本数据都保存在服务器上,协同开发者从…...

微分方程(Blanchard Differential Equations 4th)中文版Section1.4

1.4 NUMERICAL TECHNIQUE: EULER’S METHOD 上一节中讨论的斜率场的几何概念与近似微分方程解的基本数值方法密切相关。给定一个初值问题 d y d t = f ( t , y ) , y ( t 0 ) = y 0 , \frac{dy}{dt}=f(t,y), \quad y(t_0) = y_0, dtdy​=f(t,y),y(t0​)=y0​, 我们可以通过首…...

求职Leetcode算法题(7)

1.搜索旋转排序数组 这道题要求时间复杂度为o(log n),那么第一时间想到的就是二分法,二分法有个前提条件是在有序数组下,我们发现在这个数组中存在两部分是有序的,所以我们只需要对前半部分和后半部分分别…...

ActiveMQ、RabbitMQ、Kafka、RocketMQ在事务性消息、性能、高可用和容错、定时消息、负载均衡、刷盘策略的区别

ActiveMQ、RabbitMQ、Kafka、RocketMQ这四种消息队列在事务性消息、性能、高可用和容错、定时消息、负载均衡、刷盘策略等方面各有其特点和差异。以下是对这些方面的详细比较: 1. 事务性消息 ActiveMQ:支持事务性消息。ActiveMQ可以基于JMS&#xff08…...

HanLP分词的使用与注意事项

1 概述 HanLP是一个自然语言处理工具包&#xff0c;它提供的主要功能如下&#xff1a; 分词转化为拼音繁转简、简转繁提取关键词提取短语提取词语自动摘要依存文法分析 下面将介绍其分词功能的使用。 2 依赖 下面是依赖的jar包。 <dependency><groupId>com.ha…...

Python 的进程、线程、协程的区别和联系是什么?

一、区别 1. 进程 • 定义&#xff1a;进程是操作系统分配资源的基本单位。 • 资源独立性&#xff1a;每个进程都有独立的内存空间&#xff0c;包括代码、数据和运行时的环境。 • 并发性&#xff1a;可以同时运行多个进程&#xff0c;操作系统通过时间片轮转等方式在不同…...

实时数据推送:Spring Boot 中两种 SSE 实战方案

在 Web 开发中&#xff0c;实时数据交互变得越来越普遍。无论是股票价格的波动、比赛比分的更新&#xff0c;还是聊天消息的传递&#xff0c;都需要服务器能够及时地将数据推送给客户端。传统的 HTTP 请求-响应模式在处理这类需求时显得力不从心&#xff0c;而服务器推送事件&a…...

数据守护者:SQL一致性检查的艺术与实践

标题&#xff1a;数据守护者&#xff1a;SQL一致性检查的艺术与实践 在数据驱动的商业世界中&#xff0c;数据的一致性是确保决策准确性和业务流程顺畅的关键。SQL作为数据查询和操作的基石&#xff0c;提供了多种工具来维护数据的一致性。本文将深入探讨如何使用SQL进行数据一…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...