数据库
首页 > 数据库> > MySQL-分组查询

MySQL-分组查询

作者:互联网

查询每个部门的平均工资

image

image

image

查询每个工种的最高工资

# 查询每个工种的最高工资
SELECT MAX(salary),job_id
FROM `employees`
GROUP BY `job_id`

image

查询每个位置上的部门个数

# 查询每个位置上的部门个数
select count(*),`location_id`
from `departments`
group by `location_id`

image

添加筛选条件

查询邮箱中包含a字符的,每个部门的平均工资

# 添加筛选条件
# 查询邮箱中包含a字符的,每个部门的平均工资
select Avg(`salary`),`department_id`
from `employees`
where `email` like '%a%'
group by `department_id`;

image

查询有奖金的每个领导手下员工的最高工资

select max(`salary`),`manager_id`
from `employees`
where `commission_pct` is not NULL
group by `manager_id`;

image

添加复杂的筛选条件

查询哪个部门的员工个数>2

①查询每个部门的员工个数

#①查询每个部门的员工个数
select count(*),`department_id`
from `employees`
group by `department_id`;

image

②根据①的结果进行筛选,查询哪个部门的员工个数>2

#②根据①的结果进行筛选,查询哪个部门的员工个数>2
select count(*),`department_id`
from `employees`
group by `department_id`
having count(*)>2;

image

注:要用HAVING来连接 不能用where来连接 因为where筛选条件是针对employees里面的,而count(*)不在employees里面,要对筛选完之后的结果进行筛选 则需要用HAVING

查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资

# 查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资

SELECT `job_id`,MAX(`salary`)
FROM `employees`
WHERE `commission_pct` IS NOT NULL
GROUP BY `job_id`
HAVING MAX(`salary`)>12000;

image

查询领导编号>102的每个领导手下的员工的最低工资>5000的领导编号是哪个,以及其最低工资

#查询领导编号>102的每个领导手下的员工的最低工资>5000的领导编号是哪个,以及其最低工资
SELECT `manager_id`,MIN(`salary`)
FROM `employees`
WHERE `manager_id`>102  
GROUP BY `manager_id`
HAVING MIN(`salary`)>5000;

image

思考过程->拆分

image
image

分组查询的特点

image

按表达式或函数分组

按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些

思考过程如下

image

select count(*),LENGTH(`last_name`) len_name
from `employees`
group by length(`last_name`)
having COUNT(*)>5

image

按多个字段分组

查询每个部门每个工种的员工的平均工资

#按多个字段分组
#查询每个部门每个工种的员工的平均工资

select avg(`salary`),department_id,job_id
from `employees`
group by `department_id`,`job_id`;

image

查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示

#查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示

SELECT AVG(`salary`),department_id,job_id
FROM `employees`
GROUP BY `department_id`,`job_id`
ORDER BY AVG(`salary`) DESC;

image

分组查询的特点

image

(多个字段之间用逗号隔开没有顺序要求,表达式或函数用的较少

分组查询的案例习题

查询各job_id的员工工资的最大值,最小值,平均值,总和,并按job_id升序

#查询各job_id的员工工资的最大值,最小值,平均值,总和,并按job_id升序
select max(`salary`),min(`salary`),avg(`salary`),sum(`salary`),job_id
from `employees`
group by `job_id`
order by job_id asc;

image

查询员工最高工资和最低工资的差距< DIFFERENCE >

#查询员工最高工资和最低工资的差距<DIFFERENCE>
select max(`salary`)-min(`salary`) DIFFERENCE
from `employees`

image

查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内

#查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
select min(`salary`) ,`manager_id`
from `employees`
where `manager_id` is not null
group by `manager_id`
having MIN(`salary`) >=6000 

image

查询所有部门的编号,员工数虽和工资平均值,并按平均工资降序

# 查询所有部门的编号,员工数虽和工资平均值,并按平均工资降序
select count(*),`department_id`,avg(`salary`)
from `employees`
group by department_id
order by AVG(`salary`) desc

image

选择具有名个job_id的员工人数

#选择具有名个job_id的员工人数

SELECT COUNT(*),`job_id`
FROM `employees`
GROUP BY `job_id`

image

标签:salary,employees,查询,job,分组,MySQL,员工,id
来源: https://www.cnblogs.com/jgg54335/p/14933994.html