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
等结合,实现复杂的数据分析需求。
非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。
无论你是AI新手还是AI专家,学习最前沿的AI技术,AI创富俱乐部你值得拥有!