MySQL初学笔记10.12(分组函数、分组查询)

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;

猜你喜欢

转载自blog.csdn.net/qq_41986239/article/details/109027909