SQL 聚集函数详解:轻松掌握数据分析的利器
SQL 聚集函数详解:轻松掌握数据分析的利器
1. 聚集函数的概念
聚集函数(Aggregate Functions)是一种可以对一组行进行计算并返回单个值的函数。在数据库查询中,聚集函数广泛用于数据分析和报表生成。这些函数可以帮助我们从大量数据中提取有用的信息,而无需实际列出每一行的数据。常见的聚集操作包括:
- 统计行数:计算表中符合条件的行数。
- 求和:计算某些行的总和。
- 找出最值:计算表中最大值、最小值或平均值。
聚集函数通常用于汇总信息而不是列出每一行的数据。这种方式可以减少查询的数据量,节省时间和资源。
2. AVG() 函数
AVG() 函数用于计算指定列的平均值。它通过将列中的数值加总,然后除以行数,返回一个平均值。AVG() 函数可以用于计算表中所有行的平均值,或仅计算符合特定条件的行的平均值。
示例 1:计算所有产品的平均价格
SELECT AVG(prod_price) AS avg_price
FROM Products;
avg_price
---------
6.823333
解析:这条查询语句返回
Products
表中所有产品的平均价格,并将结果命名为
avg_price
。
示例 2:计算特定供应商的产品平均价格
SELECT AVG(prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';
avg_price
---------
6.823333
解析:通过在
WHERE
子句中指定供应商 ID 作为过滤条件,这条查询语句返回供应商
DLL01
提供的产品的平均价格。
3. COUNT() 函数
COUNT() 函数用于统计行数。它有两种主要的使用方式:
- COUNT(*):统计表中的所有行,包括包含
NULL
值的行。 - COUNT(column):统计某一列中非空值的行数,忽略
NULL
值。
示例 1:计算
Customers
表中的总客户数
SELECT COUNT(*) AS num_cust
FROM Customers;
num_cust
--------
5
解析:这条查询语句计算
Customers
表中的所有行数,并将结果命名为
num_cust
。
示例 2:统计
Customers
表中具有电子邮件地址的客户数量
SELECT COUNT(cust_email) AS num_cust
FROM Customers;
num_cust
--------
3
解析:这条查询语句只统计
cust_email
列中非空值的行数,返回具有电子邮件地址的客户数。
4. MAX() 函数
MAX() 函数用于返回指定列中的最大值。通常用于找出数值列或日期列的最大值。对于文本列,MAX() 函数返回字母顺序排列中最后的那个值。
示例 1:获取
Products
表中最贵的产品价格
SELECT MAX(prod_price) AS max_price
FROM Products;
max_price
---------
11.9900
解析:这条查询语句返回
Products
表中价格最高的商品价格,并将结果命名为
max_price
。
5. MIN() 函数
MIN() 函数与 MAX() 函数相反,用于返回指定列中的最小值。它常用于找出数值列或日期列中的最小值。
示例 1:获取
Products
表中最便宜的产品价格
SELECT MIN(prod_price) AS min_price
FROM Products;
min_price
---------
3.4900
解析:这条查询语句返回
Products
表中价格最低的商品价格,并将结果命名为
min_price
。
6. 总结
聚集函数是 SQL 中的强大工具,能够对大量数据进行汇总计算,提供诸如平均值、总和、最大值、最小值以及行数等重要信息。这些函数能够极大地简化数据分析工作,减少数据处理的复杂度,并且在多种数据库管理系统中都得到了广泛的支持。
7. SUM() 函数
SUM() 函数用于计算指定列中数值的总和。它在统计、财务报表等需要对数值进行累加的场景中非常有用。
示例 1:计算所有订单项的总数量
SELECT SUM(quantity) AS total_quantity
FROM OrderItems;
total_quantity
--------------
143
解析:这条查询语句计算
OrderItems
表中所有订单项的数量总和,并将结果命名为
total_quantity
。
示例 2:计算特定订单的总金额
SELECT SUM(item_price * quantity) AS order_total
FROM OrderItems
WHERE order_num = 20005;
order_total
-----------
149.25
解析:通过计算每个订单项的金额(
item_price * quantity
)并对其求和,这条查询语句得出订单编号为
20005
的总金额。
8. 组合使用聚集函数
在实际应用中,常常需要组合使用多个聚集函数,以获取更全面的数据分析结果。
示例 1:获取每个供应商的产品数量、最贵产品价格、最便宜产品价格和平均产品价格
SELECT vend_id,
COUNT(*) AS product_count,
MAX(prod_price) AS max_price,
MIN(prod_price) AS min_price,
AVG(prod_price) AS avg_price
FROM Products
GROUP BY vend_id;
vend_id | product_count | max_price | min_price | avg_price
--------|---------------|-----------|-----------|----------
BRE02 | 3 | 5.49 | 3.49 | 4.49
DLL01 | 4 | 11.99 | 7.45 | 9.32
FNG01 | 2 | 5.49 | 4.99 | 5.24
解析:
- vend_id
:供应商 ID。 - COUNT(*)
:统计每个供应商提供的产品数量。 - MAX(prod_price)
:每个供应商提供的最贵产品价格。 - MIN(prod_price)
:每个供应商提供的最便宜产品价格。 - AVG(prod_price)
:每个供应商产品的平均价格。 - GROUP BY vend_id
:按照供应商分组,分别计算上述聚集值。
9. 使用 HAVING 子句过滤聚集结果
HAVING
子句用于过滤聚集函数的结果,与
WHERE
子句不同,
HAVING
作用于聚合后的结果集。
示例 1:查找提供超过 2 个产品的供应商
SELECT vend_id,
COUNT(*) AS product_count
FROM Products
GROUP BY vend_id
HAVING COUNT(*) > 2;
vend_id | product_count
--------|--------------
BRE02 | 3
DLL01 | 4
解析:
- GROUP BY vend_id
:按照供应商分组。 - COUNT(*) AS product_count
:统计每个供应商的产品数量。 - HAVING COUNT(*) > 2
:只返回产品数量超过 2 的供应商。
10. 使用 DISTINCT 关键字与 COUNT() 函数
DISTINCT
关键字可以与
COUNT()
函数组合,统计列中唯一值的数量。
示例 1:统计客户所在的不同国家数量
SELECT COUNT(DISTINCT cust_country) AS country_count
FROM Customers;
country_count
-------------
3
解析:这条查询语句统计
Customers
表中不同国家的数量,即有多少个不同的国家。
11. 在聚集函数中处理 NULL 值
聚集函数在处理包含
NULL
值的列时,会自动忽略这些值。但在某些情况下,需要明确考虑或处理
NULL
值。
示例 1:统计产品描述不为空的产品数量
SELECT COUNT(prod_desc) AS desc_count
FROM Products;
desc_count
----------
9
解析:如果
Products
表中共有 10 条记录,但有一条记录的
prod_desc
为
NULL
,那么
COUNT(prod_desc)
将返回 9,因为它忽略了
NULL
值。
示例 2:统计产品总数,包括
NULL
值
SELECT COUNT(*) AS total_products
FROM Products;
total_products
--------------
10
解析:
COUNT(*)
计算所有行数,包括包含
NULL
值的行,因此返回 10。
通过以上更详细的示例,可以更深入地理解聚集函数在 SQL 查询中的应用。这些函数不仅可以单独使用,还可以组合使用,并与其他 SQL 语句如
GROUP BY
、
HAVING
、
DISTINCT
等结合,实现复杂的数据分析需求。