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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web安全:SqlMap工具

一、简介 sqlmap 是一款开源的渗透测试工具,可以自动化进行SQL注入的检测、利用,并能接管数据库服务器。它具有功能强大的检测引擎,为渗透测试人员提供了许多专业的功能并且可以进行组合,其中包括数据库指纹识别、数据读取和访问底层文件系统…

柔性超级电容器咋储能?生物聚合物在其中起啥作用?有啥挑战?

*本文只作阅读笔记分享* 一、引言 随着对化石燃料影响的日益关注,开发用于先进电化学能量存储设备的绿色和可再生材料变得至关重要。超级电容器因其出色的寿命、安全性和宽温度操作范围等优势而成为有前途的储能候选者。柔性超级电容器特别适合为轻质可穿戴电子设…

我常用的几个傻瓜式爬虫工具,收藏!

爬虫类工具主要两种,一种是编程语言第三方库,比如Python的scrapy、selenium等,需要有一定的代码基础,一种是图形化的web或桌面应用,比如Web Scraper、后羿采集器、八爪鱼采集器、WebHarvy等,接近于傻瓜式操…

qt生成一幅纯马赛克图像

由于项目需要&#xff0c;需生成一幅纯马赛克的图像作为背景&#xff0c;经过多次测试成功&#xff0c;记录下来。 方法一&#xff1a;未优化方法 1、代码&#xff1a; #include <QImage> #include <QDebug> #include <QElapsedTimer>QImage generateMosa…

MyBatis全解

目录 一&#xff0c; MyBatis 概述 1.1-介绍 MyBatis 的历史和发展 1.2-MyBatis 的特点和优势 1.3-MyBatis 与 JDBC 的对比 1.4-MyBatis 与其他 ORM 框架的对比 二&#xff0c; 快速入门 2.1-环境搭建 2.2-第一个 MyBatis 应用程序 2.3-配置文件详解 (mybatis-config.…

Pikachu-XSS漏洞之cookie值获取、钓鱼结果和键盘记录实战记录

目录 Pikachu-XSS漏洞之cookie值获取、钓鱼结果和键盘记录实战记录 一、XSS&#xff08;get型&#xff09;之cookie值获取&#xff1a; 二、xss&#xff08;post型&#xff09;之cookie值获取 三、Xss之钓鱼攻击 四、XSS获取键盘记 Pikachu-XSS漏洞之cookie值获取、钓鱼结果…

坐牢第二十七天(聊天室)

基于UDP的网络聊天室 一.项目需求&#xff1a; 1.如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息 2.如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息 3.如果有人下线&#xff0c;其他用户可以收到这个人的下线信息 4.服务器可以发送系统信息…

算法工程师第四十天(647. 回文子串 516.最长回文子序列 动态规划总结篇 )

参考文献 代码随想录 一、回文子串 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s "abc"…

【stm32项目】多功能智能家居室内灯光控制系统设计与实现(完整工程资料源码)

多功能智能家居室内灯光控制系统设计与实现 目录&#xff1a; 目录&#xff1a; 前言&#xff1a; 一、项目背景与目标 二、国内外研究现状&#xff1a; 2.1 国内研究现状&#xff1a; 2.2 国外研究现状&#xff1a; 2.3 发展趋势 三、硬件电路设计 3.1 总体概述 3.2 硬件连接总…

图像压缩算法

8.1 JPEG压缩 (JPEG Compression) 介绍 JPEG&#xff08;Joint Photographic Experts Group&#xff09;压缩是最常用的有损图像压缩算法之一。它通过减少图像中的冗余数据来实现高效压缩&#xff0c;特别适用于自然图像。 原理 JPEG压缩的基本步骤包括颜色空间转换、离散余…

WPF篇(18)-DataGrid数据表格控件+ComboBox下拉框控件

DataGrid数据表格控件 DataGrid是一个可以多选的数据表格控件。所以&#xff0c;它继承一个支持多选的父类——MultiSelector。 public abstract class MultiSelector : Selector {protected MultiSelector();public IList SelectedItems { get; }protected bool CanSelectMu…

Python学习day16-类与对象

这里写目录标题 类示例 成员方法self关键字 类与对象构造方法其他类内置方法&#xff08;魔术方法&#xff09;_str_符号_Lt_符号le小于等于比较eq比较运算小结 类 在Python中&#xff0c;class&#xff08;类&#xff09;是一种用于创建对象的模板或蓝图。它封装了数据&#…

基于Django的停车场车辆出入管理系统,可识别车牌图片

研究背景 随着城市化进程的加快&#xff0c;车辆数量不断增加&#xff0c;停车场的管理成为一个日益重要的课题。传统的停车场管理系统依赖人工登记和监控&#xff0c;不仅效率低下&#xff0c;而且容易出现疏漏和错误&#xff0c;难以满足现代社会对停车场管理智能化、高效化…

STM32标准库学习笔记-3.外部中断

参考教程&#xff1a;【STM32入门教程-2023版 细致讲解 中文字幕】 中断 中断含义&#xff1a;在计算机执行主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&…

2024 国内自闭症学校排名榜:突破边界,创造无限可能

在 2024 年&#xff0c;当家长们面对国内自闭症学校的排名榜时&#xff0c;心中或许充满了期待与困惑。然而&#xff0c;这些排名榜虽然能提供一定的参考&#xff0c;但绝不能成为选择学校的唯一依据。家长们更需要深入了解每所学校的真实情况&#xff0c;通过线下考察&#xf…

python及pycharm安装配置

PS&#xff1a;这篇是对于初学者的python以及pycharm配置教程&#xff0c;配置完成后可以直接看我的python学习笔记来进行python全套学习&#xff0c;现在已更新第一部分。 Python学习笔记&#xff08;一&#xff09;-CSDN博客 目录 一、python以及pycharm的安装配置 1.1 py…

Nuxt3:构建的时候报错Search string not found: “for (const existingRoot of buildInfoVersionMap.roots)

我们完成初步页面开发后&#xff0c;需要构建下项目生成我们需要的页面&#xff0c;在执行构建的时候报错&#xff1a; 找了很多资料&#xff0c;这个问题是由于 vue-tsc v1 版本引起&#xff0c;只需要将 vue-tsc 升级到v2 即可 我们在执行删除的时候&#xff0c;结果发现它…

【MySQL】数据库约束

系列文章目录 第一章 数据库基础 第二章 数据库基本操作 文章目录 系列文章目录前言约束关键字一览NOT NULLUNIQUEDEFAULTPRIMARY KEY自增主键 FOREIGN KEY总结 前言 在学习了数据库的增删改查操作之后&#xff0c;接下来就需要进阶的学习关键字来完善SQL语句的条件。学习数据…

数据结构----链表

一丶概念 链表又称单链表、链式存储结构&#xff0c;用于存储逻辑关系为“一对一”的数据。 和顺序表不同同&#xff0c;使用链表存储数据&#xff0c;不强制要求数据在内存中集中存储&#xff0c;各个元素可以分散存储在内存中。 二丶特点 特点&#xff1a;内存不连…

DolphinScheduler集群部署问题(趟坑)总结

目录 官方文档 官方项目地址 问题解决 官方文档 DolphinScheduler | 文档中心 (apache.org) 官方项目地址 部署及使用过程中的问题可以参见项目Issue:Issues apache/dolphinscheduler GitHub GitHub - apache/dolphinscheduler at 3.2.2-release 问题解决 1、JVM在运…