版权声明:本博客主要记录学习笔记和遇到的一些问题解决方案,转载请注明出处! https://blog.csdn.net/u010982507/article/details/90734797
分组函数
一、简介与分类
分组函数又称为聚合函数或统计函数或组函数,用作统计使用。
常见分组函数有:
sum()
avg()
max()
min()
count()
二、使用方式
sum()
描述:求和。
约束:支持数值型;忽略NULL,NULL不参与运算。
示例:select sum(salary) from employees;
avg()
描述:求平均值。
约束:支持数值型;忽略NULL,NULL不参与运算。
示例:select avg(salary) from employees;
max()
描述:计算最大值。
约束:支持数值型/字符型/日期型;忽略NULL,NULL不参与运算。
示例:select max(salary) from employees;
示例:select max(last_name) from employees;
示例:select max(date) from employees;
min()
描述:获取最小值。
约束:支持数值型/字符型/日期型;忽略NULL,NULL不参与运算。
示例:select min(salary) from employees;
示例:select min(last_name) from employees;
示例:select min (date) from employees;
count()
描述:计算非空类型个数。
约束:支持任何类型;忽略NULL,NULL不参与运算。
示例:select count(salary) from employees;
107总数
示例:select count(commision_pac) from employees;
35个,其他为null
示例:select count(*) from employees;
统计所有的行,三列属性,只要有一列的字段不为null,则+1
同:select count(1) from employees;
5.5之前MYISAM引擎:count() 效率较高。
5.5之后innoDB引擎:count()与count(1)效率差不多。
描述:查询部门为90的员工个数。
示例:select count(*) from employees where department_id = 90;
组合使用
描述:组合使用,平均值保留两位小数。
示例:select sum(salary) 和, round(avg(salary), 2) 平均值, max(salary) 最大, min(salary) 最小, count(salary) 数量 from employees;
描述:与去重distinct
组合使用,求所有的工资的和以及去除重复后的和。
示例:select sum(salary), sum(distinct salary) from employees;
和分组函数一同查询的字段有限制
描述:和分组函数一同查询的字段要求是group by后的字段。
select AVG(salary), employee_id from employees;
查询有问题,平均数时一个值,员工id是多个值,不能一同显示。
分组查询
一、使用方式
- 分组查询一般配合分组函数进行,一般语法是:
select column(此列要求出现在group by的后面), group_function(column)
from table
where condition
group by group_by_expression
order by column;
注意:要求查询列表必须特殊,是分组函数和group by之后出现的字段。
二、分组前筛选
- 查询每个工种的最高工资。
select max(salary), job_id from employees group by job_id;
- 查询每个位置上的部门个数。
select count(*),location_id from departments group by location_id;
- 查询邮箱中包含a字符的,每个部门的平均工资。
select avg(salary),department_id from employees where email like '%a%' group by department_id;
- 查询有奖金的每个领导手下员工的最高工资。
select max(salary),manager_id from employees where commission_pac is not null group by manager_id;
总结:
1.查询的字段都在一张表中,可以用where筛选,即是添加分组前的筛选条件。筛选前的数据源是原始表,即表中有筛选条件的字段。
2.在group by
前面使用关键字where
。
三、分组后筛选
- 查询每个部门的员工个数,并且员工个数大于2。
select count(*),department_id from employees group by department_id having count(*) > 2;
- 查询每个工种有奖金的员工的最高工资,且最高工资>12000。
select max(salary), job_id from employees where commission is not null group by job_id having max(salary) > 12000;
总结:
1.添加分组后的筛选,筛选条件的数据源是来自分组后的结果集;
2.在group by
后面使用关键字having
;
3.分组函数做条件肯定是放在having
字句中,如max(salary) > 12000
,count(*) > 2;
。
四、按函数分组
- 按员工姓名长度分组,查询每一组的员工个数,筛选员工个数大于5的有哪些。
select count(*),length(last_name) from employees group by length(last_name) having count(*) > 5;
或使用别名
select count(*) c,length(last_name) l from employees group by l having c > 5;
五、按多个字段分组
- 查询每个部门每个工种的平均工资。
select avg(salary), department_id, job_id from employees group by department_id, job_id;
六、添加排序
- 查询每个部门每个工种的平均工资,并按平均工资高低排序。
select avg(salary), department_id, job_id from employees group by department_id, job_id order by avg(salary) desc;