多行函数:聚合函数
聚合函数我们也叫聚集分组函数,他是把一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值.
进去多个值返回的一定是一个值.对一组数据返回一个值,比如我们要返回工资表里的最大值,我们就要对这组字段进行MAX函数汇总.
聚合函数类型:
#1我们常见的几个聚合函数
1:AVG/SUM
2MAX/MIN
3COUNT
求方差标准差中位数,这个是不是也是聚合函数,方差开根号就是标准差,是用来衡量数据的稳定性.比如A和B的平均数一样,我们就要选方差更低的一个,那么它的每次成绩都是接近平均数.
中位数也是计算我们社区国家的平均薪资有多少,这时候我们就可以取平均值,或者中位数.假设现在有5个人,的月工资都比较低只有1000元,第6个人的工资有1000000.,如果我们取平均工资,那就不合适了,我们取中位数比较好,如果平均工资和中位数就说明贫富差距很大这里拉回来,
我们这里只讲着5个,我们看这几个函数的名字是不是心里就有底了.
- AVG/SUM
AVG是计算平均值,SUM是计算求和的.
SELECT SUM(salary),AVG(salary) FROM employees
SELECT SUM(last_name) FROM employees
,如果我们计算的是字符串这个函数是没有意义的,在mysql里会返回0,因为隐市转换
在oracle就会直接报错无效数字
即使大家在mysql里运行了有结果,那么也要注意一下,因为可能有问题.
日期类型大家也不要想了,这个结果也是没有意义的.
这就是我们想和大家强调的只能运行数值型的
MAX/MIN
SELECT MAX(salary),MIN(salary) FROM employees
SELECT MAX(last_name) FROM employees
我们对字符串可以计算大小吗,当然是可以的,因为我们字符串是可以按照ansi的标准来进行排序,所以我们可以对姓名进行求最大值.没有问题
同样也是支持时间类型的
SELECT MIN(last_name),MIN(hire_date) FROM employees
我们mysql的数据类型是很多的,12章中会将,最重要的急速max和min这些函数.
1.3Count
Count的作用的计算指定字段在查询结果中出现的个数
这个比较难一点,大家要理解一下
SELECT COUNT(employee_id),COUNT(salary) FROM employee
这里我们对salary计算数量,和它里面的数值是没有关系的.所以就算是2*salary也是107条,
那么我们现在要对count(1)来计算的时候,由于1会被我们把107个条记录都填充一次,所以 count就会计算出107条
我们如果计算表里有多少条记录如何实现,我们上面讲到了,我们可以
方式1:count(*)
方式2:count(1)常数
方式3count(字段)这里不一定对,这里不是挺好吗,不也是107吗,但是我们还要补充一个点
SELECTCOUNT( commission_pct) FROM employees
Ps:这里我们的count是不计算空值的
SELECT AVG(salay),SUM(salary)/COUNT(salary),SUM(salary)/count(107),AVG(salaryry),SUM(commission_pct)/107 FROM employees
这里建议大家想一下,sum是如何计算空值的.很多时候是希望大家面对未知的场景.所以希望大家想一下.这就是为什么大家喜欢高分的学生,因为他是面对陌生的题目比较熟练.
在我们上面的聚合函数的时候全部都不会计算null值.
大家可以稍微的计算一下,这里问大家一个问题,查询公司的平均奖金率,这里合不合适.
比如我们要查询全中国人的工资平均率,是不是要考虑14亿人,但是因为有2亿人没有工作,那么我们还是要对它进行计算.
所以不太合适直接使用AVG,因为其他人是0
我们应该写 SELECT SUM(salary)/COUNT(IFNULL(commission_pct,0)) FROM employees
GROUP BY的使用,
如果我们需要统计表中的记录数,我们可以使用COUNT(*) COUNT(1),COUNT(非空字段).那一个效果比较好,我们之后会说索引的时候会讲优化.
这里我们的存储引擎有关,大家在我们的职业发展的时候,很多情况都满足正态分布,和我们差不多的人很多,真正优秀的人是很少的,我们努力的效果刚开始可能是没什么作用的,但是我们一直努力,一直努力,因为差不多的人越来越少,工资就会突飞猛进.
如果我们使用的是MyiSam的引擎则三个的效率相同执行的复杂度都是O(N),如果我们使用的是InnoDB的引擎三者效率就不一样了, COUNT(*)=COUNT(1)>COUNT(非空字段).因为会找我们的二级索引会使用小的信息key_len的二级索引来扫描优化.所以前两个的效率就比高一些,之后我们将下篇的索引在具体和大家说.