普通 SELECT 展示原始 Row,但真实问题常问“有多少”“总共多少”“平均是多少”“最高和最低是多少”。聚合函数会读取多条 Row,再产生一个统计结果。最常见的五个是 COUNT、SUM、AVG、MIN 和 MAX。
COUNT:数 Row 或已知值
COUNT(*) 统计满足条件的全部 Row。COUNT(phone) 只统计 phone 不为 NULL 的 Row。因此,总用户数和已提供手机号的用户数可能不同。COUNT 也能搭配 WHERE,例如统计 Tokyo 用户。
SELECT COUNT(*) AS all_rows,
COUNT(phone) AS users_with_phone
FROM users
WHERE city = 'Tokyo';SUM:把数值相加
SUM(quantity) 可以回答所有订单一共购买了多少件商品。它不是订单数量:三条订单的 quantity 分别为 1、2、4,那么 COUNT 是 3,而 SUM 是 7。
AVG:计算平均值
AVG(price) 把所有非 NULL 价格相加,再除以参与计算的价格数量。为了让结果更清楚,通常通过 AS average_price 设置 Alias。
MIN 与 MAX:找到范围两端
MIN(price) 返回最低价格,MAX(price) 返回最高价格。它们也可用于日期,查找最早和最晚的订单日期。
本节五个聚合函数各有明确职责:COUNT 数量、SUM 总和、AVG 平均值、MIN 最小值、MAX 最大值。
一次计算多个统计值
多个聚合函数可以放在同一条 SELECT 中,生成数据概览。聚合函数通常忽略 NULL;COUNT(*) 是例外,因为它数 Row 本身。若 prices 为 40、NULL、80,则 COUNT(*) 为 3,COUNT(price) 为 2,SUM(price) 为 120,AVG(price) 为 60。
不要无计划地混入普通 Column
SELECT name, AVG(price) FROM products 在逻辑上有问题:AVG 把多条 Row 汇成一个值,但 name 属于各自的 Row。数据库不知道总平均值旁该显示哪个商品名。若要按不同类别分别统计,需要下一节的 GROUP BY。
SELECT COUNT(price) AS priced_products,
SUM(price) AS total_price,
AVG(price) AS average_price,
MIN(price) AS lowest_price,
MAX(price) AS highest_price
FROM products;点击一列,计算五种统计
点击蓝色 Column Header:price、stock 或 rating。NULL 会保留在表中,但除 COUNT(*) 外不会参与聚合。
| expression | result |
|---|---|
| COUNT(*) | 6 |
| COUNT(price) | 6 |
| SUM(price) | 258.00 |
| AVG(price) | 43.00 |
| MIN / MAX | 8 / 80 |
正在统计 price。知识测验
知识测验
库存概览
仓库经理想在一行中看到商品数量、总库存、平均价格、最低价格和最高价格。针对 products 写查询,并使用清楚的 Alias。
统计已完成订单
orders 有 status、quantity 和 total_amount。只统计 status 为 completed 的订单:返回订单数、售出件数和总收入。说明为什么订单数使用 COUNT(*),件数使用 SUM(quantity)。