一.概述

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执行效率更改

五.练习

  1. #查询公司员工工资的最大值,最小值,平均值,总和
  2. SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary) FROM employees;
  3. #查询各job_id的员工工资的最大值,最小值,平均值,总和
  4. SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary) FROM employees GROUP BY job_id;
  5. #查询具有各个job_id的员工人数
  6. SELECT job_id,COUNT(*) FROM employees GROUP BY job_id;
  7. #查询员工最高工资和最低工资的差距(DIFFERENCE)
  8. SELECT MAX(salary)-MIN(salary) "DIFFERENCE" FROM employees;
  9. #查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不参与计算
  10. SELECT manger_id,MIN(salary)
  11. FROM employees
  12. WHERE manger_id IS NOT NULL
  13. GROUP BY manger_id
  14. HAVING MIN(salary)>=6000;
  15. #查询所在部门的名字,location_id,员工数量,平均工资,并按照平均工资降序排列
  16. SELECT d.department_name,d.location_id,COUNT(employ_id),AVG(salary)
  17. FROM department d LEFT JOIN employees e
  18. ON d.department_id=e.department_id
  19. GROUP BY department_name,location_id;
  20. #查询每个工种,每个部门的部门名,工种名和最低工资
  21. SELECT department_name,job_id,MIN(salary)
  22. FROM department d LEFT JOIN employees e
  23. ON d.department_id=e.department_id;