分组查询
1、语法
SELECT 分组函数,分组后的字段
FROM 表
[WHERE 筛选条件]
GROUP BY 分组的字段
[HAVING 分组后的筛选]
2、分组查询特点及注意事项
1、分组函数做查询条件肯定放在HAVING子句中.
2、和分组函数一同查询的字段最好是作为分组条件的字段.
3、分组筛选
针对的表 位置 关键字
分组前筛选: 原始表 group by的前面 where
分组后筛选: 分组后的结果集 group by的后面 having
4、能使用分组前筛选的尽量使用分组前筛选.
5、可以按单个字段分组,也可以按多个字段分组,如果是按照多个字段分组,字段之间用逗号隔开.
6、HAVING关键字后面可以使用别名.
7、可以支持排序.
3、分组函数
1、SUM:求和
2、MAX:求最大值
3、MIN:求最小值
4、AVG:求平均值
5、COUNT:计数
特点:
1、以上五个分组函数都忽略null值,除了count(*).
2、SUM和AVG一般处理数值类型,MAX、MIN、COUNT、可以处理任何数据类型.
3、都可以搭配DISTINCT关键字使用,用于去除重复值.
4、COUNT的参数之类类型可以是字段、*、常量值(如果使用常量值,一般是使用1,表示在虚拟表中多添加一列,该列的值全部为1,有多少行就对应有多少个1),但是
一般使用COUNT(*).
4、分组查询案例演示
1、查询各job_id的员工工资的最大值、最小值、平均值、总和,并按job_id升序.
SELECT job_id,
MAX(salary) AS 最大值,
MIN(salary) AS 最小值,
AVG(salary) AS 平均值,
SUM(salary) AS 总和
FROM employees
GROUP BY job_id
ORDER BY job_id ASC;
2、查询员工最高工资和最低工资的差距(DIFFERENCE).
SELECT
MAX(salary)-MIN(salary) AS DIFFERENCE
FROM employees;
3、查询各个管理者手下员工的最低工资、其中最低工资不能低于6000、没有管理者的员工不计算在内.
SELECT
manager_id,
MIN(salary)
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary)>= 6000;
4、查询所有部门的编号,员工数量和工资平均值,并按平均工资降序.
SELECT
e.department_id,
COUNT(*),
AVG(salary) AS ag
FROM employees e
WHERE e.department_id IS NOT NULL
GROUP BY department_id
ORDER BY ag DESC;