PostgreSQL 聚合函数
聚合函数(Aggregate functions)是 PostgreSQL 中用于汇总和分析数据的核心工具。它们允许你跨表中的多行执行计算,并返回一个单一的、汇总后的结果。这些函数在数据分析、报表生成和业务决策过程中被广泛使用。
理解如何高效地使用聚合函数,对于从海量数据中提取有价值的信息至关重要。本章将详细涵盖日常开发中最常用的五个聚合函数:COUNT、SUM、AVG、MIN 和 MAX。
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 (价格) |
|---|---|---|
| 1 | Laptop (笔记本电脑) | 1200 |
| 2 | Mouse (鼠标) | 25 |
| 3 | Keyboard (键盘) | 75 |
| 4 | Monitor (显示器) | 300 |
| 5 | USB Drive (U盘) | 15 |
要查找 products 表中的产品总数,你可以使用:
SELECT COUNT(*)
FROM products;查询结果将返回:5。
2. 计算某列中的非 NULL 值:
考虑一个名为 employees(员工)的表,包含以下数据,其中 department(部门)列可能为 NULL:
要计算已分配部门的员工人数(即 department 列不为 NULL),你可以使用:
| employee_id (员工ID) | employee_name (员工姓名) | department (所属部门) |
|---|---|---|
| 1 | John Doe | Sales (销售部) |
| 2 | Jane Smith | Marketing (市场部) |
| 3 | David Lee | NULL |
| 4 | Sarah Brown | Sales (销售部) |
查询结果将返回: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 (单价) |
|---|---|---|---|
| 1 | 1 | 2 | 1200 |
| 1 | 2 | 5 | 25 |
| 2 | 3 | 1 | 75 |
| 2 | 4 | 1 | 300 |
要计算每个订单的总金额,你可以使用:
SELECT order_id, SUM(quantity * unit_price) AS total_amount
FROM order_items
GROUP BY order_id;查询结果将返回:
| order_id | total_amount |
|---|---|
| 1 | 2525 |
| 2 | 375 |
3. SUM 处理 NULL 值的方式:
如果一列中包含 NULL 值,SUM 会直接忽略它们。例如:
| item_id (项目ID) | price (价格) |
|---|---|
| 1 | 10 |
| 2 | 20 |
| 3 | NULL |
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 (成绩) |
|---|---|---|
| 1 | Mathematics (数学) | 85 |
| 1 | Physics (物理) | 90 |
| 2 | Mathematics (数学) | 75 |
| 2 | Physics (物理) | 80 |
要计算每位学生的平均成绩:
SELECT student_id, AVG(grade) AS average_grade
FROM student_grades
GROUP BY student_id;查询结果将返回:
| student_id | average_grade |
|---|---|
| 1 | 87.5 |
| 2 | 77.5 |
5. MIN 函数
MIN 函数用于返回指定列中的最小值。它可以应用于数值、字符串以及日期/时间数据类型。NULL 值会被忽略。
5.1 MIN 的常见用法示例
1. 查找最低的产品价格:
使用 products 表:
SELECT MIN(price)
FROM products;查询结果将返回:15。
2. 查找最早的订单日期:
假设你有一个包含 order_date 列的 orders 表:
| order_id | order_date |
|---|---|
| 1 | 2023-01-15 |
| 2 | 2023-02-20 |
| 3 | 2023-01-01 |
要查找最早的订单日期:
SELECT MIN(order_date)
FROM orders;查询结果将返回:2023-01-01。
3. 查找按字母表顺序排在最前面的字符串:
给定一个包含 customer_name(客户姓名)列的 customers 表:
| customer_id | customer_name |
|---|---|
| 1 | Charlie |
| 2 | Alice |
| 3 | Bob |
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 函数会返回按字母表顺序排在最后的值。