MySQL从入门到精通之分组查询

请先导入myemployees数据库 执行SQL脚本文件导入数据库

分 组 查 询 : \color{blue}分组查询:

select 查询列表
from 表
[where 筛选条件](可选)
group by 分组的字段
[order by 排序的字段];(可选)

特点:
1、和分组函数一同查询的字段必须是group by后出现的字段
2、筛选分为两类:分组前筛选和分组后筛选

			针对的表				位置				连接的关键字
分组前筛选	原始表				group by前		where
分组后筛选	group by后的结果集    group by后		having
1、简单的分组

例如:查找每个部门的平均工资、最高工资、最低工资

USE myemployees;
SELECT department_id, AVG(salary),MIN(salary), MAX(salary)
FROM employees
GROUP BY department_id;

在这里插入图片描述

2、实现分组前的筛选

比如:查询名字中包含a字符的 每个工种的最高工资
此题我们需要先选出名字中包含a字符的员工,然后按照工种进行分组(job_id),再使用分组函数max求最大值。

USE myemployees;
SELECT MAX(salary), job_id
FROM employees
#名字中包含a字符的员工
WHERE last_name LIKE '%a%'
GROUP BY job_id;

在这里插入图片描述

3、实现分组后筛选

比如:查询员工个数>5的工种号。
这里我们首先需要查找每个工种的员工数count(* ), 然后count(*) > 5进行筛选。

USE myemployees;
SELECT COUNT(*),job_id
FROM employees
GROUP BY job_id
#having关键字,进行分组后的筛选
HAVING COUNT(*) > 5;

在这里插入图片描述
再比如:领导编号>105的每个领导手下的最低工资大于6000的领导编号和最低工资。

USE myemployees;
#③查找该领导手下的员工数
SELECT manager_id,MIN(salary)
FROM employees
#①首先领导编号大于150
WHERE manager_id>105
#②按照manager_id编号进行分组
GROUP BY manager_id
#④领导手下的最低工资大于6000
HAVING MIN(salary) > 6000;

在这里插入图片描述

4、添加排序

比如:每个工种有奖金的员工的最高工资>6000的工种编号和最高工资,并且按最高工资升序

USE myemployees;
#③查找该工种的最高工资
SELECT job_id, MAX(salary) AS 最高工资
FROM employees
#①首先筛选有奖金的员工
WHERE commission_pct IS NOT NULL
#②按照job_id(工种)进行分组
GROUP BY job_id
#④筛选工种的最高工资>6000
HAVING 最高工资 > 6000
#⑤按照最高工资进行排序
ORDER BY 最高工资 ASC;

在这里插入图片描述

5、按多个字段分组

比如:查询每个工种每个部门的最低工资,并按最低工资降序。

#②查找分组后每个组的最低工资
SELECT MIN(salary),job_id,department_id
FROM employees
#①首先按照工种、部门进行分组(两者无先后顺序区分)
GROUP BY department_id,job_id
#③按照最低工资进行降序排列
ORDER BY MIN(salary) DESC;

在这里插入图片描述

测试:

1、查询各工种的员工最高工资和最低工资的差距,并且差距超过4000,并且按照差距升序排列。

USE myemployees;
#②、计算各个工种的最高工资、最低工资的差距
SELECT job_id, MAX(salary) - MIN(salary) AS 差距
FROM employees
#①、首先按照job_id(工种)进行分组
GROUP BY job_id
#③、筛选差距大于4000的工种
HAVING 差距 > 4000
#⑤、按照差距进行升序排列
ORDER BY 差距 ASC;

在这里插入图片描述

2、查询各个部门的员工数量、工资平均值,并按平均工资降序

USE myemployees;
#②、计算各个部门人数、平均工资
SELECT department_id, COUNT(*), AVG(salary) AS 平均工资
FROM employees
#①、按照部门进行分组
GROUP BY department_id
#③、按照平局工资进行降序排列
ORDER BY 平均工资 DESC;

在这里插入图片描述

注 意 : \color{red}注意: 随着问题逐渐复杂,对逻辑以及理解能力的要求越来越高。现在的问题,对于初学者并不是一眼就能看出如何编写的。所以理解sql语句执行顺序,以及将问题逐渐细分显得非常重要。为此我在sql语句中加入了大量的步骤执行注释,希望读者好好揣摩一下,对后面的学习非常有作用。

以上就是分组查询的主要内容,给个关注或者点个赞再走呗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值