【SQL必知必会】 笔记 分组汇总

本文介绍了SQL中的分组与汇总操作,包括GROUP BY和HAVING子句的使用,以及AVG、COUNT、MAX、MIN和SUM等聚合函数的应用。通过实例展示了如何对数据进行分组计数、求平均值、找出最大值和最小值以及进行总和计算,帮助理解SQL的数据汇总功能。

数据的分组(group by/having)

  1. GROUP BY(COLUMN)
    根据某一列的类别进行分组根据某一列的类别进行分组。
    举个例子:比如说我们需要知道每一个id下分别有多少个产品,因此我们需要根据id进行对数据进行分组,同时对每个组进行计数。
SELECT vend_id, COUNT (*) AS num_prods FROM products GROUP BY vend_id;

在这里插入图片描述
我们就可以发现,vend_id 为1001的产品共有3个,以此类推。

  1. HAVING过滤分组
    HAVING非常类似于WHERE,两者都用于限定条件。 唯一的差别是WHERE过滤行,而HAVING对分组进行过滤,因此HAVING必须跟在group by 后面(WHERE在数据分组前进行过滤, HAVING在数据分组后进行过滤)。

下面这条SELECT语句类似于上面的语句。但最后一行增加了HAVING子句,它过滤COUNT(*) >=2(两个以上的订单)的那些分组。

SELECT vend_id, COUNT (*) AS num_prods FROM products GROUP BY vend_id HAVING COUNT(*)>=2;
  1. 分组与排序
    一般在使用GROUP BY子句时,我们应该也给出ORDER BY子句。这是保证数据正确排序的唯一方法。不能仅依赖GROUP BY排序数据。ORDER BY 可以指出我们到底应该按照哪一列来的顺序进行排序,是从小到大还是从大到小进行排序。

数据的汇总

汇总的目的主要有以下:

  • 确定表中行数
  • 获得表中行组的和
  • 找出所有行或某些特定行的最大值、最小值和平均

因此,基于这些需求,我们可以找出常用的函数:
在这里插入图片描述

1. AVG()函数

下面的例子使用AVG()返回products表中特定供应商的所有产品的平均价格:

SELECT AVG(prod_price) AS avg_price FROM products WHERE vend_id =1003;

在这里插入图片描述

注意:
a. AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。如果要获得多个列的平均值,必须使用多个AVG()函数 。
b. AVG()函数忽略值为NULL的行

2. COUNT()函数

COUNT()函数进行计数。可利用COUNT()确定表中行的数目或符合特定条件的行的数目。

COUNT()函数有两种使用方式:
a. 使用COUNT(*)计算表中行的数目, 不管表列中包含的是空值(NULL)还是非空值。

b. 使用COUNT(column)计算特定列中具有值的行的数目,忽略
NULL值。

比如说返回customers表中客户的总数 ,

SELECT COUNT(*) AS num_cust FROM customers;

再比如说使用count(cust_email)只对具有电子邮件地址的客户计数 (因为count函数不对空值计数,所以只会计数非空值即有邮件信息的客户)

SELECT COUNT(cust_email) AS num_cust FROM customers;

3. MAX()函数和MIN()函数

  • 分别用于返回指定列中的最大值和最小值。
  • 要求必须指定列名

例如找出最贵的商品价格,和最低的价格:

SELECT MAX(prod_price) AS max_price FROM products;
SELECT MIN(prod_price) AS min_price FROM products;

4. SUM()函数

常用于合计计算,比如说计算总的订单总额:

SELECT SUM(item_price*quantity) AS total_price FROM orderitems ;

5. 组合汇总函数

同时汇总计数,最大值,最小值,均值:

SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM products;

输出结果如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值