3-1对表进行聚合查询

SQL
Author

Rui

Published

November 11, 2022

3-1 对表进行聚合查询

聚合函数

5 个常用函数:

  • COUNT 计算表中的记录数(行数

  • SUM 计算表中数值列中数据的合计值

  • AVG 计算表中数值列中数据的平均值

  • MAX 求出表中任意列中数据的最大值

  • MIN 求出表中任意列中数据的最小值

何谓“聚合”?

我的理解是:将整张表中大量的数据的特征以较少的数据展现出来称为“聚合”。

更简单粗暴一点来说就是“将多行汇总为一行”。

以 SUM 函数为例,原本 M 行 N 列的数据通过该函数得到仅 N 个平均值,并且可以反映数据整体水平。

计算表中数据的行数

计算全部数据的行数(返回结果为8):

SELECT COUNT(*)
  FROM Product;
1 records
count
8

之前学习过选择所有列是 SELECT *,星号外没有括号。而这里星号外面需要括号。 这是因为 SELECT 是子句,COUNT 是函数,函数需要加括号。 函数括号中的值称为参数,输出值称为返回值,许多语言(R、Python)中也是如此。

Note

其他函数不能将星号作为参数!

计算 NULL 之外的行数

除了可以选择全部数据以外,还可以将特定的列作为参数传入函数 COUNT 中:

SELECT COUNT(purchase_price)
  FROM Product;
1 records
count
6

这里返回的结果居然是 6。因为 purchase_price 一列包含 2 个 NULL, COUNT 不会计算 NULL 行

Note

参数列不同,COUNT 计算结果也可能会不同!因为每一列中包含的 NULL 的个数可能不同。

计算合计值

SUM 函数计算累计值(求和)。

SELECT SUM(sale_price), SUM(purchase_price)
  FROM Product;
1 records
sum sum
16780 12210
Note
  • 求多个列的合计值,正确的做法是:SUM(<列名1>), SUM(<列名2>), 错误的做法是:SUM(<列名1>, <列名2>)(习惯了 R 和 Python 中向量化函数的朋友可能会犯这种错)

  • SUM 函数不受 NULL 的影响。但这并不意味着 SUM 将 NULL 当成 0 来计算,而是计算时直接将 NULL 排除在外(表面上看这两种方法结果一样,但是换成 AVG 函数就能看出区别了)。

计算平均值

AVG 函数和 SUM 函数的使用方法一样,不受 NULL 的影响,会在计算时直接将 NULL 剔除。

SELECT AVG(sale_price), AVG(purchase_price)
  FROM Product;
1 records
avg avg
2097.5 2035

计算最大值最小值

SELECT MAX(sale_price), MIN(purchase_price)
  FROM Product;
1 records
max min
6800 320
Note
  • SUM 函数和 AVG 函数只能对数值类型的列使用。

  • MAX 函数和 MIN 函数几乎可以对所有数据类型的列使用。

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

例1. 计算去除重复数据后的数据行数

方法 1:

SELECT COUNT(DISTINCT product_type)
  FROM Product;
1 records
count
3

方法 2:

SELECT DISTINCT COUNT(product_type)
  FROM Product;
1 records
count
8

为什么两种方法的结果不一样?方法 1 中关键字 DISTINCT 在括号内,会对 product_type 剔除重复数据再求行数;而方法 2 中关键字在 COUNT 函数外,说明是先求行数再剔除重复数据。

例2. 计算去除重复数据后的合计值

SELECT SUM(sale_price), SUM(DISTINCT sale_price)
  FROM Product;
1 records
sum sum
16780 16280
Note

其他聚合函数也可以和关键字 DISTINCT 联合使用。