分组函数
功能:用作统计使用,
分类:
sum -- 求和
avg -- 平均值
max -- 最大值
min -- 最小值
count -- 计算个数
datediff -- 计算日期差
1、简单的使用
select sum (salary) from employees;
select avg (salary) from employees;
select max (salary) from employees;
select min (salary) from employees;
select min (salary) from employees;
select sum (salary) 和,avg (salary) 平均值,max (salary) 最大值,min (salary) 最小值,count (salary) 个数 from employees;
2、分组函数使用特点
-
参数支持类型
sum、avg 一般用于处理数值型 max、min、count 可以处理任何类型 -
是否处理null值
sum、avg、max、min、count 忽略null值 可以和distinct搭配实现去重
3、count函数的单独介绍
select count('str') from table;
select count(*) from table; #统计行数
select count(1) from table; #统计总数
效率:
innodb 存储引擎下,count(*)和count(1) 效率最高
myisam 存储引擎下,count(*) 效率最高
和分组函数一同查询的字段要求是group by后的字段
分组查询
语法:
select 分组函数,列(要求出现在group by 的后面)
from table
where 筛选条件
group by 分组的列表
order by 子句
注意:查询列表必须特殊,要求是分组函数和group by 后出现的字段
1、分组前的筛选
案例一:每个工种的最高工资
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 employees.emile like '%a%'
group by department_id
案例四:查询有奖金的每个领导手下员工的最高工资
selelct max(salary),manager_id
from employees
where cm
2、分组后的筛选
案例一:查询部门内员工数大于2的部门
SELECT COUNT(1),department_id
FROM employees em
GROUP BY department_id
HAVING COUNT(1) >2;
案例二:查询每个工种有奖金的员工且最高工资大于12000的工种编号和最高工资
SELECT MAX(salary),job_id
from employees
where employees.commission_pct is NOT NULL
GROUP BY job_id
HAVING MAX(salary) > 12000;
案例三:查询领导编号>102的每个领导下的最低工资>5000的领导编号及最低工资
SELECT MIN(salary),manager_id
from employees e
where e.manager_id > 102
GROUP BY manager_id
HAVING MIN(salary) > 5000;
按表达式或者函数分组
案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的
seelct count(1),length(last_name)
from employees
group by length(last_name)
having count(1) > 5
按多个字段进行分组
案例:每个部门每个工种的员工的平均工资
SELECT AVG(SALARY),DEPARTMRNT_ID,JOB_ID
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID,JOB_ID;
添加排序
SELECT AVG(SALARY),DEPARTMRNT_ID,JOB_ID
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID,JOB_ID
order by avg(salary) desc;