目录
聚集函数
聚集函数用于将多行数据汇总为一个结果。常用于:
统计行数(如符合某条件的数量)
求某列的最大值、最小值、平均值或总和等
生成分析报告或汇总结果
为什么需要聚合函数?
在处理数据时,经常需要汇总信息,比如统计总数、求和、求平均值等,而不是获取原始数据本身。
例如:
老板问公司总共有多少员工?→ 需要统计行数(聚合函数 COUNT())
财务问这个月总销售额是多少?→ 需要求和(聚合函数 SUM())
HR问员工平均工资是多少?→ 需要求平均值(聚合函数 AVG())
这些场景下只需要汇总结果,不需要把所有原始数据(比如每个员工的工资明细)都查出来。
比如有一张 orders 表,记录了所有订单的金额:
order_id | amount |
---|---|
1 | 100 |
2 | 200 |
3 | 300 |
如果不用聚合函数:
就需要先查询所有订单的 amount,再在程序中手动累加求和,低效且麻烦。
如果用聚合函数:
直接写 SELECT SUM(amount) FROM orders,数据库会直接返回 600,一步到位。
SQL 提供了 5 个常用聚集函数:
函数 | 说明 |
---|---|
AVG() | 求平均值 |
COUNT() | 统计行数 |
MAX() | 返回最大值 |
MIN() | 返回最小值 |
SUM() | 求总和 |
AVG() 平均值函数
用法:SELECT AVG(column) FROM 表名;
可返回整列或某一条件下的平均值。
要求:统计所有商品的平均价格
SELECT AVG(prod_price) AS avg_price
FROM products;
带条件过滤:
要求:查询供应商ID为 100 的产品的平均价格
SELECT AVG(prod_price) AS avg_price
FROM products
WHERE vend_id = 100;
AVG() 只能用于数值列
自动忽略 NULL 值
COUNT() 计数函数
用法:
COUNT(*):统计所有行数(包括 NULL)
COUNT(column):只统计非 NULL 值的行数
要求:统计 products 表中商品的总数量
SELECT COUNT(*) AS num_prod FROM products;
要求:统计 products 表中价格不为空的商品数量
SELECT COUNT(prod_price) AS num_prod FROM products;
MAX() 最大值函数
用法:SELECT MAX(column) FROM 表名;
要求:查询所有商品中的最高价格
SELECT MAX(prod_price) AS max_price FROM products;
忽略 NULL
可用于非数值类型(如日期、字符串)
使用于非数值时依赖排序规则
字符集是用于定义数据库中字符串数据的编码方式,决定了如何存储和表示文字。
排序规则是一种定义字符数据排序和比较规则的机制。数据库使用 utf8mb4 字符集可以存储中文、英文、日文、韩文 以及 emoji 表情。
在 utf8mb4_unicode_ci 排序规则中,'a' 和 'A' 被视为相等(不区分大小写)
在 utf8mb4_bin 排序规则中,'a' 和 'A' 被视为不同,'a' 小于 'A'(区分大小写)
MIN() 最小值函数
与 MAX() 相反,返回最小值;
要求:查询所有商品中的最低价格
SELECT MIN(prod_price) AS min_price FROM products;
MIN() 也可用于非数值列并且会忽略 NULL 值
SUM() 求和函数
用法:SELECT SUM(column) FROM 表;
SELECT SUM(quantity) AS items_ordered
FROM orderItems
WHERE order_num = 001;
SELECT SUM(item_price*quantity) AS total_price
FROM orderItems
WHERE order_num = 001;
可用于表达式
忽略 NULL 值
聚集不同值(DISTINCT)
聚集函数默认是对所有值(包括重复)进行聚合
使用 DISTINCT 可只对不重复值聚合
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM products
WHERE vend_id = 100;
DISTINCT 不能用于 COUNT(*),但可用于 COUNT(column)
COUNT(*) 统计的是行的数量,DISTINCT 作用于具体的列用于判断列值是否重复。如果写成 COUNT(DISTINCT *),无法确定基于哪些列去重