MySQL初学笔记10.12
二、分组函数
功能:用作统计使用,又称为聚合函数或统计函数或组函数
分类:sum 求和、avg 平均值、max 最大值、min 最小值、count 计算个数
特点:
1.sum、avg一般用于处理数值类型
max、min、count可以处理任何类型
2.是否忽略Null值
3.可以和distinct搭配实现去重的运算
4.count函数的单独介绍
一般使用count(*)用作统计行数
5.和分组函数一同查询的字段要求是group by后的字段
1.简单使用
select SUM(salary) from employees;
select AVG(salary) from employees;
select MIN(salary) from employees;
select MAX(salary) from employees;
select COUNT(salary) from employees;
2.参数支持哪些类型
select sum(last_name) , avg(last_name) from employees;
select sum(hiredate),avg(hiredate) from employees;
select max(last_name),min(last_name),count(last_name) from employees;
select max(hiredate),min(hiredate),count(hiredate) from employees;
3.忽略null
select sum(commission_pct), avg(last_name) from employees;
select commission_pct from employees;
4.和Distinct搭配
select sum(distinct salary),sum(salary) from employees;
5.count函数的详细介绍
select count(salary) from employees;
select count(*) as 统计行数 from employees;
6.和分组函数一同查询的字段有限制
select avg(salary),employee_id from employees;
练习:
1.查询公司员工工资的最大值、最小值、平均值、总和
select max(salary),min(salary),avg(salary),sum(salary) from employees;
2.查询员工表汇总的最大入职时间和最小入职时间的相差天数
select DATEDIFF(max(hiredate),min(hiredate)) from employees
附加题,查询自己活了多少天
select DATEDIFF('2020-10-12','1999-12-21')
3.查询部门编号为90的员工个数
select count(*)
from employees
where department_id=90
分组查询
语法:
select 分组函数,列(要求出现在Group by的后面)
from 表
where 筛选条件
group by 分组的列表
order by 子句
注意:
查询列表必须特殊,要求是分组函数和group by后出现的字段
特点:
1.分组查询中的筛选条件分为两类
数据源 | 位置 | 关键字 | |
---|---|---|---|
分组前筛选 | 原始表 | group by子句的后面 | where |
分组后筛选 | 分组后的结果集 | group by子句的前面 | having |
①分组函数做条件肯定是放在having子句中
②能用分组前筛选的,就优先考虑使用分组前筛选
2.group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数(用的较少)
3.也可以添加排序(排序放在整个分组查询的最后)
引入:查询每个部门的平均工资
select department_id,round(avg(salary),2)
from employees
GROUP BY(department_id)
案例1:查询每个工种的最高工资
select max(salary),job_id
from employees
GROUP BY job_id;
案例2:查询每个位置上的部门个数
select count(*),location_id
from departments
GROUP BY location_id;
添加筛选条件
案例1:查询邮箱中包含a字符的,每个部门的平均工资
select avg(salary),department_id
from employees
where email LIKE '%a%'
group by department_id
案例2:查询有奖金的每个领导手下员工的最高工资
select max(salary),manager_id
from employees
where commission_pct is not null
group by manager_id
添加复杂的筛选条件
案例1:查询哪个部门的员工个数>2
select count(*),department_id
from employees
GROUP BY department_id
having count(*)>2
案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
select max(salary),job_id
from employees
where commission_pct is not null
group by job_id
having max(salary)>12000
案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号,以及其最低工资
select min(salary),manager_id
from employees
where manager_id>102
group by manager_id
having min(salary)>5000
按表达式或函数分组
案例:按员工姓名的长度分组 查询每一组的员工个数,筛选员工个数大于5的有哪些
select count(*),LENGTH(last_name) len_name from employees
group by LENGTH(last_name)
having count(*) >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;
练习
1.查询各job_id的员工工资的最大值、最小值、平均值、总和,并按job_id升序
select max(salary),min(salary),avg(salary),sum(salary)
from employees
group by job_id
order by job_id
2.查询员工最高工资和最低工资的差距
select max(salary)-min(salary) difference
from employees
3.查询各个管理者手下的员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
select min(salary),manager_id
from employees
where manager_id is not null
group by manager_id
having min(salary)>=6000
4.查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
select department_id,count(*),avg(salary)
from employees
group by department_id
order by avg(salary) desc
5.选择具有各个Job_id的员工人数
select count(*),job_id
from employees
group by job_id;