PostgreSQL 教程

PostgreSQL 聚合函数

聚合函数(Aggregate functions)是 PostgreSQL 中用于汇总和分析数据的核心工具。它们允许你跨表中的多行执行计算,并返回一个单一的、汇总后的结果。这些函数在数据分析、报表生成和业务决策过程中被广泛使用。

理解如何高效地使用聚合函数,对于从海量数据中提取有价值的信息至关重要。本章将详细涵盖日常开发中最常用的五个聚合函数:COUNTSUMAVGMINMAX

1. 什么是聚合函数?

聚合函数对一组数据行进行操作,并返回单个值

它们通常与 GROUP BY(分组)子句配合使用,以便为表中的不同分组分别计算聚合值。如果你的查询语句中省略了 GROUP BY,那么聚合函数将把整个表视为一个大组,并针对整个表计算出一个单一的结果。

1.1 基础语法

使用聚合函数的基本 SQL 语法如下:

SELECT aggregate_function(column_name)
FROM table_name
WHERE condition; -- 可选的 WHERE 条件子句

例如,如果想要在 customers(客户)表中查找客户的总人数,你可以使用 COUNT 函数:

SELECT COUNT(*)
FROM customers;

2. COUNT 函数

COUNT 函数用于返回分组或表中的数据行数COUNT 主要有两种常见的变体:

  • COUNT(*):计算表中的所有行,包括包含 NULL(空值)的行。
  • COUNT(column_name):计算指定列中不为 NULL 的行数。

2.1 COUNT 的常见用法示例

1. 计算表中的所有行:

假设你有一个名为 products(产品)的表,包含以下数据:

product_id (产品ID)product_name (产品名称)price (价格)
1Laptop (笔记本电脑)1200
2Mouse (鼠标)25
3Keyboard (键盘)75
4Monitor (显示器)300
5USB Drive (U盘)15

要查找 products 表中的产品总数,你可以使用:

SELECT COUNT(*)
FROM products;

查询结果将返回:5。

2. 计算某列中的非 NULL 值:

考虑一个名为 employees(员工)的表,包含以下数据,其中 department(部门)列可能为 NULL

要计算已分配部门的员工人数(即 department 列不为 NULL),你可以使用:

employee_id (员工ID)employee_name (员工姓名)department (所属部门)
1John DoeSales (销售部)
2Jane SmithMarketing (市场部)
3David LeeNULL
4Sarah BrownSales (销售部)

查询结果将返回:3。

3. 计算一列中不重复(去重)的值:

你可以使用 COUNT(DISTINCT column_name) 来计算某一列中不重复值的数量。使用上面的 employees 表,计算一共有多少个不同的部门:

SELECT COUNT(DISTINCT department)
FROM employees;

查询结果将返回:2(因为只有 Sales 和 Marketing 两个不同的部门)。

3. SUM 函数

SUM 函数用于计算数值型列中所有值的总和。它会自动忽略 NULL 值。

3.1 SUM 的常见用法示例

1. 计算所有产品的总价格:

使用 COUNT 示例中的 products 表:

SELECT SUM(price)
FROM products;

查询结果将返回:1615 (1200 + 25 + 75 + 300 + 15)。

2. 计算订单总金额:

假设你有一个 order_items(订单明细)表,包含以下数据:

order_id (订单ID)product_id (产品ID)quantity (数量)unit_price (单价)
1121200
12525
23175
241300

要计算每个订单的总金额,你可以使用:

SELECT order_id, SUM(quantity * unit_price) AS total_amount
FROM order_items
GROUP BY order_id;

查询结果将返回:

order_idtotal_amount
12525
2375

3. SUM 处理 NULL 值的方式:

如果一列中包含 NULL 值,SUM 会直接忽略它们。例如:

item_id (项目ID)price (价格)
110
220
3NULL


SELECT SUM(price)
FROM items;

查询结果将返回:30 (10 + 20)。

4. AVG 函数

AVG 函数用于计算数值型列的平均值。它同样会自动忽略 NULL 值。

4.1 AVG 的常见用法示例

1. 计算产品平均价格:

使用之前示例中的 products 表:

SELECT AVG(price)
FROM products;

查询结果将返回:323 (1615 / 5)。

2. 计算平均订单价值:

使用 SUM 示例中的 order_items 表:

SELECT AVG(quantity * unit_price) AS average_value
FROM order_items;

查询结果将返回:600 ((2400 + 125 + 75 + 300) / 4)。

3. 结合 GROUP BY 计算平均值:

假设你有一个 student_grades(学生成绩)表:

student_id (学生ID)subject (科目)grade (成绩)
1Mathematics (数学)85
1Physics (物理)90
2Mathematics (数学)75
2Physics (物理)80

要计算每位学生的平均成绩:

SELECT student_id, AVG(grade) AS average_grade
FROM student_grades
GROUP BY student_id;

查询结果将返回:

student_idaverage_grade
187.5
277.5

5. MIN 函数

MIN 函数用于返回指定列中的最小值。它可以应用于数值、字符串以及日期/时间数据类型。NULL 值会被忽略。

5.1 MIN 的常见用法示例

1. 查找最低的产品价格:

使用 products 表:

SELECT MIN(price)
FROM products;

查询结果将返回:15。

2. 查找最早的订单日期:

假设你有一个包含 order_date 列的 orders 表:

order_idorder_date
12023-01-15
22023-02-20
32023-01-01

要查找最早的订单日期:

SELECT MIN(order_date)
FROM orders;

查询结果将返回:2023-01-01。

3. 查找按字母表顺序排在最前面的字符串:

给定一个包含 customer_name(客户姓名)列的 customers 表:

customer_idcustomer_name
1Charlie
2Alice
3Bob
SELECT MIN(customer_name)
FROM customers;

查询结果将返回:Alice。

6. MAX 函数

MAX 函数用于返回指定列中的最大值。它同样可以应用于数值、字符串以及日期/时间数据类型。NULL 值会被忽略。

6.1 MAX 的常见用法示例

1. 查找最高的产品价格:

使用 products 表:

SELECT MAX(price)
FROM products;

查询结果将返回:1200。

2. 查找最新的订单日期:

使用 MIN 示例中的 orders 表:

SELECT MAX(order_date)
FROM orders;

查询结果将返回:2023-02-20。

3. 查找字母表排序最靠后的产品名称:

假设 products 表有一个 product_name 列:

SELECT MAX(product_name)
FROM products;

基于 COUNT 部分最初的 products 表数据,这会返回 USB Drive。请注意,对字符串使用 MAX 函数会返回按字母表顺序排在最后的值。