一.概述
1.聚合函数作用于一组数据,并对一组数据返回一个值
2.MySQL中聚合函数不可嵌套
二..聚合函数类型:(聚合函数都不计算null)
1.AVG():求平均值
(1)SELECT AVG(salary)FROM employees;
(2)只适用于数值类型的字段或变量
2.SUM():求和
(1)SELECT SUM(salary)FROM employees;
(2)只适用于数值类型的字段或变量
3.MAX():求最大值
(1)SELECT MAX(salary)FROM employees
(2)适用于数值类型,字符串类型,日期时间类型的字段或变量
4.MIN():求最小值
(1)SELECT MIN(salary)FROM employees
(2)适用于数值类型,字符串类型,日期时间类型的字段或变量
5.COUNT():计算指定字段在查询结构中出现的个数
(1)SELECT COUNT(employ_id) FROM emplorees;
(2)COUNT(1)或COUNT(*)计算表中有多少条记录
(3)COUNT(指定字段)也是计算表中有多少条记录,区别在于他不计算NULL值
三..GROUP BY的使用
1.可以使用GROUP BY子句将表中数据分成若干组
(1)SELECT department_id,AVG(salary) FROM employees GROUP BY department_id;//求部门平均工资按照部门id分组
2.使用多个列分组
(1)SELECT department_id,job_id,AVG(salary) FROM employees GROUP BY department_id,job_id;//求部门平均工资按照部门id和工作id分组
3.SELECT中出现的非组函数字段必须声明在GROUP BY中
4.而GROUP BY中声明的字段可以不出现在SELECT语句中
5.GROUP BY的位置在FROM,WHERE后面,ORDER BY,LIMIT前面
6.WITH ROLLUP关键字:当使用WITH ROLLUP关键字时,在素有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量
7.当使用ROLLUP时,不能同时使用ORDER BY排序,因为他俩互斥
8.当查询中有聚合函数和非聚合函数就要用GROUP BY
四.HAVING的使用
1.HAVING用于分组后过滤数据,WHERE是用于分组前过滤数据
2.当过滤条件使用了聚合函数,就必须用HAVING,不能用WHERE
3.HAVING必须在GROUP BY后面
4.HAVING不能单独使用,必须与GROUP BY一起使用
5.HAVING于WHERE对比:
(1)HAVING范围更广
(2)过滤条件有聚合函数,必须用HAVING
(3)过滤条件没有聚合函数,两者都可用,但是WHERE执行效率更改
五.练习
#查询公司员工工资的最大值,最小值,平均值,总和
SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary) FROM employees;
#查询各job_id的员工工资的最大值,最小值,平均值,总和
SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary) FROM employees GROUP BY job_id;
#查询具有各个job_id的员工人数
SELECT job_id,COUNT(*) FROM employees GROUP BY job_id;
#查询员工最高工资和最低工资的差距(DIFFERENCE)
SELECT MAX(salary)-MIN(salary) "DIFFERENCE" FROM employees;
#查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不参与计算
SELECT manger_id,MIN(salary)
FROM employees
WHERE manger_id IS NOT NULL
GROUP BY manger_id
HAVING MIN(salary)>=6000;
#查询所在部门的名字,location_id,员工数量,平均工资,并按照平均工资降序排列
SELECT d.department_name,d.location_id,COUNT(employ_id),AVG(salary)
FROM department d LEFT JOIN employees e
ON d.department_id=e.department_id
GROUP BY department_name,location_id;
#查询每个工种,每个部门的部门名,工种名和最低工资
SELECT department_name,job_id,MIN(salary)
FROM department d LEFT JOIN employees e
ON d.department_id=e.department_id;