分组函数
功能:用作统计使用,又称为聚合函数或统计函数或组函数
分类:
sum 求和函数
select sum(属性名)求出该属性的数值和
只能求数值的
avg 求平均值
select sum(属性名)求出该属性的平均值
只能求数值的
max 求最大值
select sum(属性名)求出该属性的最大值
可以求字符串的最大值
min 求最小值
select sum(属性名)求出该属性的最小值
可以求字符串的最小值
count 计算个数
select sum(属性名)求出该属性的个数
特点:
1.
sum、avg一般用于处理数值型
max、min、count可以处理任何类型
2.
sum、avg、count、max、min中null不参与运算
3.可以和distinct关键字搭配使用
在去除重复的列后再进行运算
如 select sum(distinct,salary)
4.count 函数
count(属性) 求salary的行数
count(*) 求总行数(只要一行里有某个属性列不为空,则总行数加1)
也可以用count(1)来统计行数,类似于在表里加了一个属性名为1的列,然后统级它的个数
两者的效率:
myisam存储引擎下,count(*)效率高
innodb存储引擎下,两者差不多
5.和分组函数一同查询的字段有限制
分组查询
先看一下分组查询的语法结构
select 分组函数
from table
where 筛选条件
group by 分组的列表
order by 子句
基本的分组查询
例如查询每个工种的最高工资
select max(salary),job_id
form employees
group by job_id;
查询每个部门的人数
select count(*),location_id
from employees
group by location_id;
添加筛选条件
查询邮箱中包含a字符的,每个部门的平均工资
select avg(salary),location_id
from employees
where email like "%a%"
group by location_id;
查询有奖金的每个领导手下员工的最高工资
select max(salary),admin_id
from employees
where commission_pct is not null
group by admin_id;
添加复杂的筛选条件
查询哪个部门的员工数>2
select count(*),department_id
from employees
group by department id
having count(*)>2
使用having语句,因为where实在group前面实现的,此时还不知道每个部门的员工数,所以不能加在where里。
查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
select job_id,max(salary)
from employees
where commission_pct is not null
group by job_id
having max(salary)>12000;
查询领导编号>102的每个领导手下最低工资>5000的领导编号是哪个,以及最低工资
select manager_id,min(salary)
from employees
where manager_id>102
group by manager_id
having min(salary)>5000;
筛选总结:
筛选分为分组前筛选和分组后筛选,分组前筛选用where,分组后筛选用having
按函数或表达式分组
按员工姓名的长度分组,查询每一组员工的个数,筛选员工个数>5的有哪些
select length(work_name),count(*)
from employees
group by length(work_name)
having count(*)>5;
按多个字段分组,多个字段用逗号隔开
查询每个部门每个工种的员工的平均工资
select avg(salary),department_id,job_id
from employees
group by department_id,job_id;//只有department_id和job_id 一样的时候才分组
添加排序
查询每个部门每个工种的员工的平均工资,并按平均工资的高低显示
select avg(salary),department_id,job_id
from employees
group by department_id,job_id
order by avg(salary)