mysql 中常用的聚合函数的使用
聚合函数 一般 是指 汇总的函数.
例如 MAX ,MIN ,SUM ,COUNT AVG 这些聚合函数, 通过看缩写 大概也知道 这些意思, 最大,最小,求和,求总数量,求平均值.
这些函数 我们平常都在用,有一些 用法,也是最近的 读书笔记在这里记录一下, 一些函数的使用细节.
好吧 直奔主题 假设 有这样的一张表.
CREATE TABLE `Product` (
`product_id` char(4) NOT NULL,
`product_name` varchar(100) NOT NULL,
`product_type` varchar(32) NOT NULL,
`sale_price` int(11) DEFAULT NULL,
`purchase_price` int(11) DEFAULT NULL,
`regist_date` date DEFAULT NULL,
PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
数据如下:
product_id | product_name | product_type | sale_price | purchase_price | regist_date |
---|---|---|---|---|---|
1 | T恤 | 衣服 | 1000 | 500 | 2009/9/20 |
2 | 打孔器 | 办公用品 | 500 | 320 | 2009/9/11 |
3 | 运动T恤 | 衣服 | 4000 | 2800 | |
4 | 菜刀 | 厨房用具 | 3000 | 2800 | 2009/9/20 |
5 | 高压锅 | 厨房用具 | 6800 | 5000 | 2009/1/15 |
6 | 叉子 | 厨房用具 | 500 | 2009/9/20 | |
7 | 擦菜板 | 厨房用具 | 880 | 790 | 2008/4/28 |
8 | 圆珠笔 | 办公用品 | 100 | 2009/11/11 |
count 函数 可以 计算数据的行数 .
下面这个sql 结果很明显是 8 ,因为数据有 8 行
select count(*) from Product ; -- 8
看下面的结果:
select count(purchase_price) from Product ; -- 6
发现结果是6
count() 函数里面 可以传递 列名作为 参数, 如果传入特定的列名, 则不会把这列的NULL 统计在内的.即刚刚看到的有两个 是缺失 的就没有进行统计. 所以 就是 6 , 而count(*) 会得到包含NULL的数据行.
很明显sum 是计算 合计值的.
sale_price | purchase_price | |
---|---|---|
1000 | 500 | |
500 | 320 | |
4000 | 2800 | |
3000 | 2800 | |
6800 | 5000 | |
500 | ||
880 | 790 | |
100 | ||
16780 | 12210 |
这个直接累加
SELECT SUM(sale_price) FROM Product ; -- 16780
对于 purchase_price 中含有NULL, 也可以正确计算出结果.
SELECT SUM(purchase_price) FROM Product ; -- 12210
sum 这个函数 是如何计算 列中含有 NULL 值的呢? 猜测 第一种 直接把 NULL 转成0 ,进行相加.
第二种 : 直接忽略NULL , 直接计算有值的列.
真实情况下: sum 会忽略 NULL 的数据, 把剩下的数据行进行累加. 因为 我们知道 任何数据和 NULL 进行四则运算 最终结果 都是 NULL.
SELECT 5 + NULL, 5 - NULL ,5 * NULL,5 / NULL,NULL / 5, NULL /0;
结果如下:
实际上 sum 是采用 第二种方案, 直接忽略 NULL 的数据行, 把其他数据进行累加.
SELECT AVG(sale_price),AVG(purchase_price) FROM Product ; -- 16780
来分析 一下: sale_price 的平均值 = 16780 / 8 = 2097.5
purchase_price 的平均值 = 12210 / 8 = 1526.25
发现和 sql 的结果并不一样, 其实 是 12210 / 6 = 2035.0
我想 应该看明白了, 因为 purchase_price 中有两个空值 , AVG 函数 也是先把他们排除在外了, 然后 除6 得到的结果. 而不是除8 的结果.
如果要实现 除8 的话,可以使用 函数 coalesce 进行 把 NULL 转成0 ,这样 AVG 就不会 删除他们在计算平均值了.
SELECT AVG(COALESCE(purchase_price,0)),AVG(purchase_price) FROM Product ;
结果如下:
max/min 函数 可以适用于任何数据类型. 可以是数值类型,也可以是日期类型 .
而刚刚讲到 sum , avg 只能针对 数值类型的列进行求值.
对于数值类型
SELECT MAX(sale_price),MAX(purchase_price) FROM Product ;
SELECT MAX(regist_date), MIN(regist_date) FROM Product ;
本来简单总结了mysql 中常用的函数 以及注意事项. count(*) ,和 count(列名) 的区别.
sum() 遇到NULL 的处理等. 这篇文章也是一个读书笔记,记录最近看了一些sql 相关的内容,希望可以帮到你.
sql 基础教程 --孙淼 罗勇 翻译