第3章 聚合与排序


3-1 对表进行聚合查询
  • 聚合函数

    通过SQL对数据进行某种操作或计算时需要使用函数,以下是5个常用的函数

    • COUNT:计算表中的记录数(行数)
    • SUM:计算表中数值列中数据的合计值
    • AVG:计算表中数值列中数据的平均值
    • MAX:求出表中任意列中数据的最大值
    • MIN:求出表中任意列中数据的最小值

    如上所示,用于汇总的函数称为聚合函数或者聚集函数,所谓聚合就是将多行汇总成一行,实际上,所有的聚合函数都是这样,输入多行输出一行

  • 计算表中数据的行数

    使用COUNT函数时,输入表的列,就能够输出数据行数

    在这里插入图片描述

    注意:COUNT函数的结果根据参数的不同而不同。COUNT(*)会得到包含NULL的数据行数,而COUNT(列名)会得到NULL之外的数据行数

  • 计算合计值——SUM函数

    四则运算中如果存在NULL,结果一定是NULL,但是对于SUM函数来说,即使包含NULL,也可以计算出合计值

  • 计算平均值——AVG函数

  • 计算最大值和最小值——MAX函数和MIN函数

    MAX/MIN函数与SUM/AVG函数有一点不同,那就是SUM/AVG函数只能对数值类型的列使用,而MAX/MIN函数原则上可以适用于任何数据类型的列

    在这里插入图片描述

  • 使用聚合函数删除重复值(关键字DISTINCT)

    想要计算值的种类时,可以在COUNT函数的参数中使用DISTINCT


3-2 对表进行分组
  • 重点

在这里插入图片描述

  • GROUP BY子句

    在GROUP BY子句中指定的列称为聚合键或者分组列,GROUP BY 子句和SELECT子句一样,可以通过逗号分隔指定多列;

    GROUP BY子句的书写顺序: SELECT—FROM—WHERE—GROUP BY

  • 聚合键中包含NULL的情况:

    在这里插入图片描述

    聚合键中包含NULL时,在结果中会以“不确定”行(空行)的形式表现出来

  • 使用WHERE子句时GROUP BY的执行结果

在这里插入图片描述

  • 与聚合函数和GROUP BY子句有关的常见错误

    • 在使用COUNT这样的聚合函数时,SELECT子句中的元素有严格的限制。实际上,使用聚合函数时,SELECT子句中只能存在以下三种元素:

      • 常数
      • 聚合函数
      • GROUP BY 子句中指定的列名(即聚合键)

      在这里插入图片描述

      注意:只有MySQL认同这种语法,所以能够执行,不会发生错误(在多列候补中只要有一列满足要求就可以了)但是MySQL以外的DBMS都不支持这样的语法

      在这里插入图片描述

    • 在GROUP BY子句中不能写列的别名

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ojf1rZFu-1604978007378)(C:\Users\AUSU888888\AppData\Roaming\Typora\typora-user-images\image-20200802112001004.png)]

    • GROUP BY子句结果的显示是无序的

    • 不能在WHERE子句中使用聚合函数

      实际上,只有SELECT子句和HAVING子句(以及ORDER BY子句)中能够使用COUNT等聚合函数


      DISTINCT和GROUP BY

      在这里插入图片描述



3-3 为聚合结果指定条件
  • 重点

在这里插入图片描述

  • HAVING子句

    WHERE子句只能指定记录(行)的条件,而不能用来指定组的条件,对集合指定条件需要用HAVING子句

    在这里插入图片描述

  • HAVING子句的构成要素

    HAVING子句和包含GROUP BY子句时的SELECT子句一样,能够使用的要素有一定的限制,限制内容也是完全相同的。HAVING子句中能够使用的3种要素如下:

    • 常数
    • 聚合函数
    • GROUP BY子句中指定的列名(即聚合键)

在这里插入图片描述

  • 相对于HAVING子句,更适合写在WHERE子句中的条件

在这里插入图片描述

在这里插入图片描述

即聚合键所对应的条件不应该书写在HAVING子句中,而应该书写在WHERE子句当中


WHERE子句和HAVING子句的执行速度

在这里插入图片描述

3-4 对查询结果进行排序
  • 重点

在这里插入图片描述

  • ORDER BY 子句

    通常,从表中抽取数据时,如果没有特别指定顺序,最终排列顺序便无从得知。即使是同一条SELECT语句,每次执行时排列顺序很可能发生改变,这时,便需要通过在SELECT语句末尾添加ORDER BY子句来明确指定排列顺序;

    不论何种情况,ORDER BY子句都需要写在SELECT语句的末尾。这是因为对数据行进行排序的操作必须在结果即将返回时执行。ORDER BY子句中书写的列名称为排序键

    在这里插入图片描述

  • 指定升序或降序

    未指定ORDER BY子句中排列顺序时会默认使用升序进行排列,若要降序排列,可以在列名后面使用DESC关键字

    在这里插入图片描述

  • 排序键中包含NULL时,会在开头或末尾进行汇总

  • 在排序键中可以使用显示用的别名

在这里插入图片描述

  • ORDER BY子句中可以使用SELECT子句中未使用的列和聚合函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值