聚合函数(聚集、分组)
作用于一组数据,并对一组数据返回一个值。
一、常用的聚合函数
-
AVG和SUM函数
可以对数值型数据使用
-
MIN和MAX函数
可以对任意数据类型使用
SELECT AVG(salary),SUM(salary),MIN(salary),MAX(salary) FROM employees;
-
COUNT函数
可以对任意数据类型使用,返回表中的记录总数
区别:COUNT(*),COUNT(1),COUNT(列名)
① 搜索引擎为MyISAM,则三者的执行效率相同
② 搜索引擎为Innodb,前两个优于搜索列名
③ COUNT(列名)会自动去NULL,COUNT( * )不会去空,所以两者不能无条件混用
二、GROUP BY
-
使用单列分组
SELECT department_id ,AVG(salary),SUM(salary) FROM employees GROUP BY department_id;
-
使用多列分组
在第一个字段的分组基础上,再对另一字段进行分组,相当于小组内再分小组
SELECT department_id,job_id ,AVG(salary),SUM(salary) FROM employees GROUP BY department_id,job_id;
重点:在GROUP BY中出现的字段,可以不出现在SELECT语句中,但是在SELECT中出现的字段(聚合函数除外),必须出现在GROUP BY中。
/* 在employees表中,一个department_id对应多个job_id 如下面的例子: 在按照department_id分组后,SELECT语句中,每个department_id只显示一次, 那么department_id对应 的job_id应该写哪个呢?在MySQL的编译中虽然不会报错,但是逻辑是错误的 所以:在SELECT中出现的字段,必须出现在ORDER BY中进行分组,才能逻辑正确的显示出来 */ SELECT department_id,job_id,AVG(salary) FROM employees ORDER BY department_id;
-
连接使用WITH ROLLUP
会对GROUP BY 后的第一个字段进行升序排列,并在所有查询记录后增加一条记录,该记录为所有查询记录之和。
WITH ROLLUP 与 ORDER BY 不能同时使用,因为前者会产生额外一条统计记录的原因