读SQL进阶教程笔记13_SQL中的分组和层级

这篇具有很好参考价值的文章主要介绍了读SQL进阶教程笔记13_SQL中的分组和层级。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

读SQL进阶教程笔记13_SQL中的分组和层级文章来源地址https://www.toymoban.com/news/detail-420031.html

1. 数据分组

1.1. SQL的语句中具有分组功能的是GROUP BY和PARTITION BY

1.1.1. 两者都有数学的理论基础

1.1.2. 都可以根据指定的列为表分组

1.1.3. 区别仅仅在于,GROUP BY在分组之后会把每个分组聚合成一行数据

1.1.4. GROUP BY的作用是将一个个元素划分成若干个子集

1.2. 示例

1.2.1.

 SELECT member, team, age ,

          RANK() OVER(PARTITION BY team ORDER BY age DESC) rn,
          DENSE_RANK() OVER(PARTITION BY team ORDER BY age DESC) dense_rn,
          ROW_NUMBER() OVER(PARTITION BY team ORDER BY age DESC) row_num
      FROM Members
     ORDER BY team, rn;

1.3. 分割后的子集

1.3.1. 它们全都是非空集合

1.3.1.1. 还有一种只包含NULL的集合

1.3.2. 所有子集的并集等于划分之前的集合

1.3.3. 任何两个子集之间都没有交集

1.3.4. 满足以上3个性质的各子集称为“类”(partition)

1.4. 类的概念(即partition)

1.4.1. 群论中有很多非常有趣的类,比如“剩余类”

1.4.1.1. 通过对3取余给自然数集合N分类后

1.4.1.1.1. “模3剩余类”

1.4.1.2. 模在SQL中也有实现,就是取模函数MOD

1.4.1.2.1. --对从1到10的整数以3为模求剩余类
    SELECT MOD(num, 3) AS modulo,
          num
      FROM Natural
     ORDER BY modulo, num;

1.4.1.3. --从原来的表中抽出(大约)五分之一行的数据

    SELECT *
      FROM SomeTbl
     WHERE MOD(seq, 5) = 0;
    --表中没有连续编号的列时,使用ROW_NUMBER函数就可以了
    SELECT *
      FROM (SELECT col,
                  ROW_NUMBER() OVER(ORDER BY col) AS seq
              FROM SomeTbl)
     WHERE MOD(seq, 5) = 0;

1.4.2. 正因为抽象,才有了广泛的应用

1.4.2.1. 数学理论并不是脱离实际的游戏,它其实隐藏了大量能够用于日常工作的技巧

2. 层级

2.1. SQL的世界其实是层级分明的等级社会

2.2. 使用GROUP BY聚合之后,我们就不能引用原表中除聚合键之外的列

2.2.1. 这只是SQL中的一种逻辑,是为了严格区分层级

2.3. GROUP BY中的阶与元素和集合的区别有关,因此属于集合论中的阶

2.3.1. 对于EXISTS来说,层级的差别与EXISTS谓词及其参数有关,因此属于谓词逻辑中的阶

2.3.2. 使用GROUP BY聚合之后,SQL的操作对象便由0阶的“行”变为了1阶的“行的集合”

2.4. 标准SQL规定

2.4.1. 在对表进行聚合查询的时候,只能在SELECT子句中写下面3种内容

2.4.2. 通过GROUP BY子句指定的聚合键

2.4.3. 聚合函数(SUM、AVG等)

2.4.4. 常量

2.5. 示例

2.5.1. --以组为单位进行聚合查询

    SELECT team, AVG(age)
      FROM Teams
     GROUP BY team;

2.5.1.1. 年龄只是每个人的属性,而不是小组的属性

2.5.1.2. 小组指的是由多个人组成的集合

2.5.1.2.1. 小组的属性只能是平均或者总和等统计性质的属性

2.5.2. --以组为单位进行聚合查询?

    SELECT team, AVG(age), age
      FROM Teams
     GROUP BY team;

2.5.2.1. 违反了标准SQL的规定,因此不具有可移植性

2.5.2.2. MySQL数据库支持这样的查询语句

2.5.2.3. 强行将适用于个体的属性套用于团体之上,纯粹是一种分类错误

2.5.3. --错误

    SELECT team, AVG(age), member
      FROM Teams
     GROUP BY team;

2.5.3.1. --正确

    SELECT team, AVG(age), MAX(member)
      FROM Teams
     GROUP BY team;

2.5.4. --小组中年龄最大的成员

SELECT team, MAX(age),
          (SELECT MAX(member)
              FROM Teams T2
            WHERE T2.team = T1.team
              AND T2.age = MAX(T1.age)) AS oldest
      FROM Teams T1
     GROUP BY team;

2.5.4.1. 子查询中的WHERE子句里使用了MAX(T1.age)这样的聚合函数作为条件

2.5.4.2. 这里对外层的表T1也进行了聚合,这样一来我们就可以在SELECT子句中通过聚合函数来引用“age”列了

2.5.4.3. 不能反过来在子查询中直接引用“age”列

2.6. 单元素集合也是集合

2.6.1. 单元素集合和空集一样,主要是为了保持理论的完整性而定义的

2.6.2. 元素a和集合{a}之间存在着非常醒目的层级差别

2.6.2.1. 这两个层级的区别分别对应着SQL中的WHERE子句和HAVING子句的区别

2.6.2.2. WHERE子句用于处理“行”这种0阶的对象

2.6.2.3. HAVING子句用来处理“集合”这种1阶的对象

到了这里,关于读SQL进阶教程笔记13_SQL中的分组和层级的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 读SQL进阶教程笔记11_关系数据库基础

    正式的关系模型术语 非正式的日常用语 关系(relation ) 表(table ) 元组(tuple ) 行(row )或记录(record ) 势(cardinality ) 行数(number of rows ) 属性(attribute ) 列(column )或字段(field ) 度(degree ) 列数(number of columns ) 定义域(domain ) 列的取值集合(pool of legal values ) 10.5.3.1. “泛文件主义” 10.5.3.2. 

    2023年04月14日
    浏览(36)
  • 读SQL进阶教程笔记12_地址与三值逻辑

    5.1.4.1. 命题其实不存在于客观世界,而存在于我们的内心

    2023年04月19日
    浏览(37)
  • Lua 进阶 · 教程笔记

    笔记的内容出自 Bilibili 上的视频:Lua教程-进阶部分 - 4K超清【不定期更新】 笔记主要用于供笔者个人或读者回顾知识点,如有纰漏,烦请指出 : ) 国内的大佬 云风 翻译了 Lua 的 Api 参考手册:传送门【】 以后读者在练习或者开发途中可以在参考手册里查看 Lua 提供的 Api。

    2024年01月24日
    浏览(34)
  • ROS2 Navigation 进阶教程学习笔记 第一章

    Nav2提供了新的拱你和工具,使创建机器人应用程序变得更容易 在本单元中,将学习 1. 通过simple Commander API进行基本Nav2操作 2. 通过followwaypoints使用waypoint follower和task executor插件 3. 禁区和限速区简介 然后您将基于Nav2创建一个基本的自主机器人demo。您将经常在一个仿真仓库中

    2024年02月08日
    浏览(30)
  • kotlin教程4:函数进阶

    kotlin教程:编程基础💎数据结构💎面向对象 kotlin 的函数定义非常灵活,既可以按照顺序传参,也可以通过参数名传参,而且可以设置参数默认值,这些在基础教程中已经讲过了。 此外, kotlin 中用 vararg 修饰的参数,为长度可变的参数列表 递归是一种常用的编程技巧,就像

    2024年02月05日
    浏览(31)
  • aardio教程二) 进阶语法

    aardio中除了基础数据类型外,其他的复合对象都是table(例如类和名字空间等)。table可以用来存放aardio的任何对象,包括另一个table。 在其他语言中的字典、列表、数组、集合映射等,在aardio中都使用table来实现。 创建字典 创建数组 数组和字典可以混用 使用class定义类

    2024年03月18日
    浏览(30)
  • SpringBoot进阶教程(七十七)WebSocket

    WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 很多

    2024年02月08日
    浏览(36)
  • git 进阶系列教程--push

    功能介绍 将本地仓库中的内容同步到远程仓库 指令解析 这个命令就上将本地仓库中的文件同步到远程。是平时用到push最多的指令。它其实是一种简写方式。省略了远程仓库的地址,本地分支。 这个命令是比较全的一条指令。意思是推送本地master分支到远程(origin)的master分支

    2024年02月14日
    浏览(36)
  • git 进阶系列教程--pull

    功能 从远程仓库拉取最新代码到本地 代码解析 将远程仓库代码拉取到本地。当然这个命令的前提是你本地代码与远程代码有链接,无论是你upstream也好git clone也罢。而且是默认拉取远程代码中与该分支有关联的分支与本地该分支合并。同时,git pull不止是拉取代码,同时会将

    2024年02月11日
    浏览(31)
  • git 进阶系列教程--add

    功能介绍 将工作区(working directory)中的内容放入暂存区(staging area) 追踪文件(解释:刚被添加到工作区的文件处于未跟踪状态(Untracked files),该命令会将新添加的文件放入暂存区,并且文件将处于已跟踪状态) 命令解析 添加工作区所有文件进入暂存区 最后的点可以理解为正则里的

    2024年02月06日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包